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