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