8.5 fuzz漏洞发现
fuzz指的是对特定目标的模糊测试,这里要注意的是,针对特定目标甚至说是特定请求,它不同于漏洞扫描器进行批量漏洞扫描,不过它们的初衷都是以发现bug(漏洞)为目的。由于本书主要介绍代码安全,所以我们后面所说的fuzz都是安全方向的fuzz。fuzz在很早就应用在软件测试领域,并且发现了大量不可预知的漏洞,fuzz到底是怎么样的一个东西,我们来通过它的工作原理流程认识一下,大概流程如图8-7所示。
图 8-7
举个最简单的读文件例子,当我们用Office Word打开doc文档的时候,Word软件会按照指定的格式读取文件的内容,如果文件格式出现异常字符,Word无法解析,而又没有提前捕捉到这种类型的错误,则有可能引发Word程序崩溃,这就是一个bug,这时候我们就可以通过工具生成大量带有异常格式或者字符的doc文档,然后调用Word程序去读取,尝试发现更多的bug,这就是一个完整的fuzz测试例子。虽然它不是一种纯白盒的漏洞挖掘方法,但我们在白盒审计过程中,也经常需要用到fuzz的方式来寻找漏洞利用方法。
目前互联网上已经有不少fuzz工具来专门做各种各样的fuzz测试,比如无线、Web、浏览器、协议,等等,在Web安全这块,使用比较多的像pywebfuzz,基于Python开发,不过相对来说这个工具年代还是有点久了,可以用的payload还算比较全,比较常见的文件包含、文件上传、SQL注入、XSS等都支持,详细的列表如图8-8所示。
图 8-8
playload文件在各个目录下面,我们打开其中一个payload规则文件后,可以看到类似如下的规则:
cFc%20%20%20
dBm%20%20%20
cfm......
cfml......
cfc.......
dbm......
cFm......
cFml......
cFc......
dBm......
cfm%20%20%20...%20.%20..
cfml%20%20%20...%20.%20..
cfc%20%20%20...%20.%20..
dbm%20%20%20...%20.%20..
cFm%20%20%20...%20.%20..
我们之前在8.2.2.2节介绍iconv函数字符编码转换截断时提到过一个字符串枚举来尝试寻找能导致iconv()函数异常而截断数据,也是fuzz非常典型的一种利用方式,当时fuzz用的代码非常粗糙,如下所示:
< ? php
for ( $i=0 ; $i<1000 ; $i++ )
{
$a='1'.chr ( $i ) .'2' ;
echo $i.' -- ' ;
echo iconv ( "UTF-8" , "gbk" , $a );
echo '<br />' ;
}
运行脚本后结果如下,当遇到不能正常转码的时候出现字符串截断,并且iconv()函数报出一个notice提示,如图8-9所示。
图 8-9