首页 > 代码库 > 代码审计方法讲解
代码审计方法讲解
PHP的漏洞有很大一部分是来自于程序员本身的经验不足,当然和服务器的配置有关,但那属于系统安全范畴了,我不太懂,今天我想主要谈谈关于PHP代码审计和漏洞挖掘的一些思路和理解。
PHP的漏洞发掘,其实就是web的渗透测试,和客户端的fuzzing测试一样,web的渗透测试也可以使用类似的技术,web fuzzing,即基于web的动态扫描。
这类软件国内外有很多,如WVS,Lan Guard,SSS等。这类扫描器的共同特点都是基于蜘蛛引擎对我们给出的URL地址进行遍历搜索,对得到的URL和参数进行记录,然后使用本地或者web端的script脚本攻击语句进行攻击测试。
如:
1 | http://www.foo.com/index.php?parm1=1&parm2=2&parm3=3.....&parmn=n |
WVS使用本地的脚本攻击数据库对这些参数进行交叉替换和填充,构造出新的URL,然后用GET或者POST的方式向服务器发出请求,并对返回的结 果进行正则判断。如是否出现:” You have an error in your SQL syntax”等字样。如果出现,则记录下来,说明这个脚本页面”可能”存在漏洞。
WVS把攻击分成了很多模块:
1 2 3 4 5 6 7 8 9 | 1. Blind_SQL_Injection 2. AcuSensor 3. CSRF 4. Directory_And_File_Check 5. File_Upload 6. GHDB(Google黑客数据库) 7. Sql_Injection 8. Weak_Password 9. XSS |
每种攻击测试方式都对应着一类scripts,里面包含了攻击语句。
用WVS扫描完之后,如果能发现一些sql注入点的提示,这个时候可以先用sqlmap进行注入尝试,进一步判断注入点的情况。
(小编插句话:WVS查找的漏洞提示分两种,一种是启发式测试,就是作者说的“可能”。另外一种是带(verify)字样的,如果看到这个字样就恭 喜你了,这是一个被证实的漏洞。小编就曾经利用这个方法发掘过漏洞,效果不错。另外作者说的使用sqlmap进行测试,小编这里不太推荐。对于漏洞挖掘来 说,最好使用手工注入的方式来测试漏洞是否存在,毕竟现在只是挖掘漏洞,还不是在利用漏洞。我相信很多人都遇到过手工能测试成功,但是用sqlmap测试 不出来的时候。)
如果这两步都不能成功,说明基于fuzz的动态扫描不能继续下去了,这个时候,我们应该想办法进行静态的代码审计,从源代码的角度分析和挖掘漏洞的 成因和利用方式。这块可以使用RIPS这样的软件,RIPS是一款专门用来进行静态PHP代码审计的工具,能够帮助我们定位到可能存在漏洞的代码区域。
RIPS对代码进行静态漏洞扫描的基本思想有两条:
1. 对容易产生漏洞的函数进行跟踪(例如:mysql_query())
RIPS认为,所有的注入漏洞最终都要经过一些特定的数据库操作函数,mysql_query()或程序自定义的类函数,这些函数是产生漏洞的导火索,只要对这些函数的控制流和参数流进行回溯扫描,就可以发现大部分的代码漏洞。
2. 对产生注入漏洞的源头即用户传输过来的数据流进行跟踪($_GET,$_POST,$_COOKIE)
“用户输入的一切数据都有害”,大部分的注入漏洞,包括二次注入,究其原因都是因为对用户的输入数据没有做好过滤,RIPS对这些敏感数据进行跟 踪,并判断其在进入敏感函数(mysql_query())之前有没有对其进行有效处理(addslashes())来判断这条数据流是否存在漏洞。
动态扫描加上静态定位,最终使我们能更容易的发现一些漏洞并及时使其得到修补。
代码审计方法讲解