Fuzz这个名词来自于Professor Barton Miller。在1989年一个风雨交加的夜晚,他登陆一台自己的主机,不知道怎么回事,信号通过猫传到主机上,雷电一闪,把里面的高位变低位,低位至高位了,结果到了主机以后改变了。他突发奇想,把这种方式作为一种测试的方式来做。1、到底什么是Fuzz Test?
Generally speaking fuzz is a brute force method which used to break software,就是用大量的测试用例一个一个试,尽可能多的找出有可能出问题的地方。
2、Fuzz怎么工作?
现在有无数有名的Fuzz工具,有很多人很多还在写,一般包括四个部分。
(1)Generate lots of malformed data as test cases,要生成大量的测试用例。这个测试用力是malformed的,一个软件首先要找到输入点,然后把数据丢进去,这个数据有可能是一个文件,有可能是一个数据包,有可能是测试表里面的一个项,有可能是临时文件里面的一个东西,总之是一种数据,要定义malformed这种非正常的数据。
(2)Drop the test cases into product,把它丢进去,看这个产品怎么反应。
(3)Monitor and log any crash/exception triggered by malicious input.
(4)Review the test log, investigated deeply.
3、Fuzz在各个平台上的一个测试情况
Linux平台上的报告
Mac上的一些应用测试情况
数据说明一切,这些数据说明了fuzz在测试中的价值。
FUZZ应用
我在函数库中增加了一个fuzz工具,是用来fuzz http接口的。采用的是比较好用wfuzz
http://www.edge-security.com/wfuzz.php
加载函数库后,直接使用wfuzz命令即可。
程序运行,依赖pycurl与libcurl,如果提示有问题,请安装这两个库解决。
Fuzz isearch的请求
Fuzz isearch的关键词查询。可以支持词典穷举。可以特殊字符写成文件的形式可以加进来
Fuzz的自定义改进
可以增加对结果的解析
Fuzz思想的延伸
Fuzz其实就是一个缩微版的自动化测试框架。
只不过他的测试数据,支持随机与特定的规则。Fuzz的判断依据,更简单而已。只是简单的异常情况。
这点上,我们可以进行充分的扩充,比如支持doc格式的判断,提取里面的某些字段判断等。
我们也可以在此理论基础上去合理的使用我们的框架。比如UI自动化一样,如果pwatir写出来的代码,支持query从文件中读取,那么就可以随意的构造Query了。
如果gtest写出的单元测试框架,可以支持从文件,或者数据库读取TC数据。那么fuzz也很容易实现。
同样日志对比脚本,也可以实现fuzz。
此次介绍的是fuzz http协议。当然fuzz不仅支持这些,还支持其他的协议,以及执行方式。
比如fuzz c++代码来生成自动化的单元测试。
另外,也并不是任何地方都适合fuzz测试,需要根据场景选择。比如算法组的某些算法,为了提升效率,是会牺牲一些边缘的异常处理的。
如果是对外的Query或者接口,是有必要做的。比如isearch的查询,seachweb,p4p的接口。
其他fuzz工具
推荐一个可以方便hack的工具,ruby编写,可以很容易开发自定义的fuzz。非常好用。
当然也可以使用上面介绍的wfuzz,采用python编写的。
http://rfuzz.rubyforge.org/index.html
网上也有N多的fuzz工具集合与说明,大家可以自己Google
其他文章
http://www.aqualab.cs.northwestern.edu/HotWeb08/papers/Hammersland-FTW.pdf