代码审计,是对应用程序源代码进行系统性检查的工作。它的目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。 代码审计不是简单的检查代码,审计代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。 代码审计这是一个需要多方面技能的技术,也是需要一定的知识储备。我们需要掌握编程,安全工具的使用、漏洞原理、漏洞的修复方式、函数的缺陷等等

代码审计入门基础:html/js基础语法、PHP基础语法 ,面向对象思想,PHP小项目开发(Blog、注册登录、表单、文件上传、留言板等),Web漏洞挖掘及利用,Web安全工具基本使用(burpsuite、sqlmap等),代码审计工具(seay审计系统、zend studio+xdebug等) 代码审计两种基本方式: 通读全文源码:通读全文发作为一种最麻烦的方法也是最全面的审计方法。特别是针对大型程序,源码成千上万行。当然了解整个Web应用的业务逻辑,才能挖掘到更多更有价值的漏洞。 功能点审计:根据漏洞对应发生函数进行功能行审计,常会用到逆向溯源数据流方法进行审计。

代码审计两种基本方法: 正向追踪数据流:跟踪用户输入参数 -> 来到代码逻辑 -> 最后审计代码逻辑缺陷 -> 尝试构造payload 逆向溯源数据流:字符串搜索指定操作函数 -> 跟踪函数可控参数 -> 审计代码逻辑缺陷 -> 尝试构造payload

从开发者的位置去思考问题,可以快速定位问题。学习面向对象编程以及面向过程编程,编写一些项目提升对代码的理解能力,再是对各种漏洞可以独立挖掘利用并能理解漏洞的危害,这里我们主要针对PHP源码做审计。

我们从三个层次开始我们的源码审计思路

1.确定要审计的源码是什么语言

2.确定该源码是单入口还是多入口

3.确定该语言的各种漏洞诞生的函数

PHP源码部署环境:

Phpstudy 集成开发环境:Zend Studio/Phpstorm

数据库管理工具:Navicat for MySQL MySQL

实时监控工具:MySQLMonitor

文本编辑工具:Sublime_Text3

代码审计辅助工具:Seay源代码审计系统、Rips

代码审计辅助安全工具:渗透版火狐、BurpSuite、Sqlmap

通常做代码审计都是检查敏感函数的参数,然后回溯变量,判断变量是否可控并且没有经过严格的过滤,这是一个逆向追踪的过程。

这里列出一些特定漏洞对应的比较容易出问题的函数或关键字,提高审计效率。

SQL注入 select update insert into delete

注:此处非函数,主要找常用的SQL语句

本地文件包含 include()

向上包含,向下包含,如果包含出错继续向下执行 include_once() 同上,只进行包含一次 require()

向上包含,向下包含,如果包含出错不下向下执行 require_once()

同上,只进行包含一次 命令执行 system() exec() passthru() shell_exec()

XSS跨站脚本攻击 print print_r echo printf 文件上传漏洞 move_uploaded_file()

文件下载

fopen() readfile() file_get_contents()

任意文件删除

unlink()

反序列化漏洞

unserialize()

使用自动化工具辅助人工漏洞挖掘,可以显著提高审计工作的效率。

学会利用自动化代码审计工具,是每一个代码审计人员必备的能力。 我们这里介绍两款PHP代码审计工具

1.RIPS RIPS是一个用 PHP 编写的源代码分析工具,它使用了静态分析技术,能够自动化地挖掘 PHP 源代码潜在的安全漏洞。渗透测试人员可以直接容易的审阅分析结果,而不用审阅整个程序代码。由于静态源代码分析的限制,漏洞是否真正存在,仍然需要代码审阅者确认。RIPS 能够检测 XSS, SQL 注入, 文件泄露, Header Injection 漏洞等。 RIPS官网:http://rips-scanner.sourceforge/ 下载完之后将该压缩包解压到本地网站的根目录下,然后在浏览器 localhost/Rips(你解压的文件名字)/就可以进去了

subdirs:如果勾选上这个选项,会扫描所有子目录,否则只扫描一级目录,缺省为勾选。 verbosity level:选择扫描结果的详细程度,缺省为1(建议就使用1)。

vuln type:选择需要扫描的漏洞类型。支持命令注入、代码执行、SQL注入等十余种漏洞类型,缺省为全部扫描。

code style:选择扫描结果的显示风格(支持9种语法高亮)。

/regex/:使用正则表达式过滤结果。

path/file: 要扫描的目录。

scan: 开始扫描。

更多推荐

代码审计及工具