前言: 做web滲透大多數時候bp來fuzz 偶爾會有覺得要求達不到的時候 wfuzz就很有用了這時候
用了很久了這點來整理一次
wfuzz 是一款Python開發的Web安全模糊測試工具。
下載地址
https://github.com/xmendez/wfuzz
官方手冊
https://wfuzz.readthedocs.io/en/latest/
簡而言之就是wfuzz可以用在做請求參數參數類的模糊測試,也可以用來做Web目錄掃描等操作。
0x01 簡單使用
pip install wfuzz
使用:
wfuzz -w 字典 地址
wfuzz -w qing.txt https://www.cnblogs.com/-qing-/FUZZ
使用字典:
wfuzz -z file --zP fn=wordlist https://www.cnblogs.com/-qing-/FUZZ wfuzz -z file,wordlist https://www.cnblogs.com/-qing-/FUZZ
-z file
使用模塊,這個模塊需要一個參數fn --zP fn=wordlist
是定義fn參數的值
第二條命令簡寫了第一條命令的賦值
-z
或-w
參數可以同時指定多個字典。
wfuzz -w 字典1 -w 字典2 -w 字典3 URL/FUZZ/FUZ2Z.FUZ3Z
通過返回結果我們要關注的就是ID、Response、 Lines、Word、Chars、Payload
編號、響應狀態碼、響應報文行數、響應報文字數、響應報文正字符數、Payload。
看看wfuzz一共的參數
0x02 常用參數使用
--hc,--hl,--hw,--hh參數可以隱藏某些HTTP響應。
--hc
根據響應報文狀態碼進行隱藏(hide code)
wfuzz -w wordlist --hc 404 https://www.cnblogs.com/-qing-/FUZZ wfuzz -w wordlist --hc 404,403 https://www.cnblogs.com/-qing-/FUZZ
--hl
根據響應報文行數進行隱藏(hide lines)
--hw
根據響應報文字數進行隱藏(hide word)
--hh
根據響應報文字符數進行隱藏
wfuzz -w wordlist/general/common.txt --hc 404 http://datalayer.io/FUZZ ******************************************************** * Wfuzz 2.2 - The Web Fuzzer * ******************************************************** Target: http://datalayer.io/FUZZ Total requests: 950 ================================================================== ID Response Lines Word Chars Request ================================================================== 00000: C=200 279 L 635 W 8972 Ch "W3SVC3" 00001: C=200 279 L 635 W 8972 Ch "Log" 00002: C=200 279 L 635 W 8972 Ch "10" 00003: C=200 279 L 635 W 8972 Ch "02" 00004: C=200 279 L 635 W 8972 Ch "2005" ... 00024: C=200 301 L 776 W 9042 Ch "about" ...
仔細查看以上結果,可以很容易地確定所有“未找到”資源的共同點是279行,635個單詞和8972個字符。因此,我們可以使用以下信息來改進“ –hc 404”過濾器(可以組合使用各種過濾器):
$ wfuzz -w wordlist/general/common.txt --hc 404 --hh 8972 http://datalayer.io/FUZZ 00022: C=200 301 L 776 W 9042 Ch "about" 00084: C=302 0 L 0 W 0 Ch "blog" 00192: C=302 0 L 0 W 0 Ch "css" ... 00696: C=200 456 L 1295 W 15119 Ch "service" 00751: C=200 238 L 512 W 6191 Ch "store" 00788: C=302 0 L 0 W 0 Ch "text" 00913: C=302 0 L 0 W 0 Ch "template"
關於自定義wfuzz中的Baseline(基準線)
可以根據參考HTTP響應(稱爲“基準”)構建過濾器。例如,先前的使用–hh開關過濾“未找到”資源的命令可以通過以下命令完成:
$ wfuzz -w wordlist/general/common.txt --hh BBB http://datalayer.io/FUZZ{notthere} ... 00000: C=200 279 L 635 W 8972 Ch "notthere" 00001: C=200 301 L 776 W 9042 Ch "about" 00004: C=200 456 L 1295 W 15119 Ch "service" ...
這裏的{}定義了此第一個HTTP請求的FUZZ字的值,然後可以使用將“ BBB”指定爲過濾器值的響應。
而這第一個請求被標記爲BBB(BBB不能換成別的)基準線;--hh
,這裏就是以BBB這條請求中的Chars爲基準,其他請求的Chars值與BBB相同則隱藏。
基準線基本使用就是這個意思
正則表達式過濾器
顯示響應:
--sc(show code),--sl(show lines),--sw(show word),--sh (show chars)
--ss
和--hs
可以使用正則表達式來對返回的結果過濾。
ss是show顯示 hs是過濾隱藏
舉個例子
wfuzz -H "User-Agent: () { :;}; echo; echo vulnerable" --ss vulnerable -w cgis.txt http://localhost:8000/FUZZ
過濾出有vulnerable字樣的返回
除了直接字符串肯定可以正則
Wfuzz掃描的時候出現網絡問題,如DNS解析失敗,拒絕連接等時,wfuzz會拋出一個異常並停止執行使用
-Z
參數即可忽略錯誤繼續執行
參數--conn-delay
來設置wfuzz等待服務器響應接連的秒數。 參數--req-delay
來設置wfuzz等待響應完成的最大秒數。
0x03 基本使用wfuzz
路徑或文件fuzz
$ wfuzz -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ $ wfuzz -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ.php
url參數中的fuzz
wfuzz -z range,0-10 --hl 97 http://testphp.vulnweb.com/listproducts.php?cat=FUZZ
模糊POST請求
如果您想模糊一些表單編碼的數據(例如HTML表單),只需傳遞-d命令行參數即可:
wfuzz -z file,wordlist/others/common_pass.txt -d "uname=FUZZ&pass=FUZZ" --hc 302 http://testphp.vulnweb.com/userinfo.php ******************************************************** * Wfuzz 2.2 - The Web Fuzzer * ******************************************************** Target: http://testphp.vulnweb.com/userinfo.php Total requests: 52 ================================================================== ID Response Lines Word Chars Request ================================================================== 00044: C=200 114 L 356 W 5111 Ch "test" Total time: 2.140146 Processed Requests: 52 Filtered Requests: 51 Requests/sec.: 24.29739
攜帶Cookie進行測試
要將自己的cookie發送到服務器,例如,將請求與HTTP會話相關聯,可以使用-b參數(對各種cookie重複):
$ wfuzz -z file,wordlist/general/common.txt -b cookie=value1 -b cookie2=value2 http://testphp.vulnweb.com/FUZZ
-b
參數指定Cookie,多個Cookie需要指定多次
上面的命令將生成HTTP請求,例如以下請求:
GET /attach HTTP/1.1 Host: testphp.vulnweb.com Accept: */* Content-Type: application/x-www-form-urlencoded Cookie: cookie=value1; cookie2=value2 User-Agent: Wfuzz/2.2 Connection: close
提交請求頭
wfuzz -z file,wordlist/general/common.txt -H "myheader: headervalue" -H "myheader2: headervalue2" http://testphp.vulnweb.com/FUZZ
上面的命令將生成HTTP請求,例如以下請求:
GET /agent HTTP/1.1 Host: testphp.vulnweb.com Accept: */* Myheader2: headervalue2 Myheader: headervalue Content-Type: application/x-www-form-urlencoded User-Agent: Wfuzz/2.2 Connection: close
cookie和頭都是可以fuzz的 不多說了
fuzz HTTP請求方法
wfuzz -z list,"GET-POST-HEAD-PUT" -X FUZZ http://127.0.0.1/
-z list
可以自定義一個字典列表(在命令中體現),以-
分割;-X
參數是指定HTTP請求方法類型
wfuzz -z list,GET-HEAD-POST-TRACE-OPTIONS -X FUZZ http://testphp.vulnweb.com/ ******************************************************** * Wfuzz 2.2 - The Web Fuzzer * ******************************************************** Target: http://testphp.vulnweb.com/ Total requests: 5 ================================================================== ID Response Lines Word Chars Request ================================================================== 00002: C=200 0 L 0 W 0 Ch "HEAD" 00004: C=405 7 L 12 W 172 Ch "TRACE" 00005: C=405 7 L 12 W 172 Ch "OPTIONS" 00001: C=200 104 L 296 W 4096 Ch "GET" 00003: C=200 104 L 296 W 4096 Ch "POST" Total time: 1.030354 Processed Requests: 5 Filtered Requests: 0 Requests/sec.: 4.852696
如果要使用特定動詞執行請求,則也可以使用“ -X HEAD”。
代理
如果需要使用代理,只需使用-p參數:
做測試的時候想使用代理可以使用如下命令:
wfuzz -w wordlist -p proxtHost:proxyPort:TYPE URL/FUZZ
wfuzz -z file,wordlist/general/common.txt -p localhost:8080 http://testphp.vulnweb.com/FUZZ
-p
參數指定主機:端口:代理類型,例如我想使用ssr的,可以使用如下命令:
wfuzz -w wordlist -p 127.0.0.1:1087:SOCKS5 URL/FUZZ
除了基本的HTTP代理外,Wfuzz還支持使用SOCKS4和SOCKS5協議的代理:
$ wfuzz -z file,wordlist/general/common.txt -p localhost:2222:SOCKS5 http://testphp.vulnweb.com/FUZZ
通過提供各種-p參數,可以同時使用多個代理: $ wfuzz -z file,wordlist/general/common.txt -p localhost:8080 -p localhost:9090 http://testphp.vulnweb.com/FUZZ
每次將使用不同的代理執行每個請求。
多個代理可使用多個-p
參數同時指定,wfuzz每次請求都會選取不同的代理進行。
認證
Wfuzz可以使用
–basic / ntlm / digest
命令行開關來設置身份驗證標頭。
例如,可以使用以下命令對使用基本身份驗證的受保護資源進行模糊處理:
HTTP Basic Auth保護的內容可使用如下命令:
wfuzz -z list,nonvalid-httpwatch --basic FUZZ:FUZZ https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx ******************************************************** * Wfuzz 2.2 - The Web Fuzzer * ******************************************************** Target: https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx Total requests: 2 ================================================================== ID Response Lines Word Chars Request ================================================================== 00001: C=401 0 L 11 W 58 Ch "nonvalid" 00002: C=200 20 L 91 W 5294 Ch "httpwatch" Total time: 0.820029 Processed Requests: 2 Filtered Requests: 0 Requests/sec.: 2.438938
如果您想模糊受保護網站的資源,也可以使用“ –basic user:pass”。
wfuzz可以通過--basec --ntml --digest
來設置認證頭,方法都一樣:
--basec/ntml/digest username:password
關於遞歸
-R開關可用於指定有效負載遞歸的深度。例如,如果要搜索現有目錄,然後使用相同的有效負載在這些目錄中再次進行模糊測試,則可以使用以下命令:
$ wfuzz -z list,"admin-CVS-cgi\-bin" -R1 http://testphp.vulnweb.com/FUZZ ******************************************************** * Wfuzz 2.2 - The Web Fuzzer * ******************************************************** Target: http://testphp.vulnweb.com/FUZZ Total requests: 3 ================================================================== ID Response Lines Word Chars Request ================================================================== 00003: C=403 10 L 29 W 263 Ch "cgi-bin" 00002: C=301 7 L 12 W 184 Ch "CVS" |_ Enqueued response for recursion (level=1) 00001: C=301 7 L 12 W 184 Ch "admin" |_ Enqueued response for recursion (level=1) 00008: C=404 7 L 12 W 168 Ch "admin - CVS" 00007: C=404 7 L 12 W 168 Ch "admin - admin" 00005: C=404 7 L 12 W 168 Ch "CVS - CVS" 00006: C=404 7 L 12 W 168 Ch "CVS - cgi-bin" 00009: C=404 7 L 12 W 168 Ch "admin - cgi-bin" 00004: C=404 7 L 12 W 168 Ch "CVS - admin"
遞歸深度爲1也就是說當發現某一個目錄存在的時候,在存在目錄下再遞歸一次字典。
性能(設置間隔線程)
-t 開關增加或減少併發請求的數量,以使攻擊進行得更快或更慢。
-s 參數告訴Wfuzz在執行另一個請求之前停止給定的秒數。
寫入文件
Wfuzz支持將結果以其他格式寫入文件。
wfuzz通過printers
模塊來將結果以不同格式保存到文檔中,一共有如下幾種格
$ wfuzz -e printers
例如,要將結果以JSON格式寫入輸出文件,請使用以下命令: -f 參數
$ wfuzz -f /tmp/outfile,json -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ
使用-f
參數,指定值的格式爲輸出文件位置,輸出格式
。
不同的輸出
Wfuzz支持以各種格式顯示結果。這由稱爲“打印機”的插件執行。可以列出可用的打印機,執行:
$ wfuzz -e printers
例如,要以JSON格式顯示結果,請使用以下命令:
$ wfuzz -o json -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ
0x04 高級用法 --wfuzz模塊
wfuzz默認自帶模塊5種類型分別是:payloads
、encoders
、iterators
、printers
和scripts
。
payloads
通過-e
參數可以查看指定模塊類型中的模塊列表:
wfuzz -e payloads
Available payloads: Name | Summary ------------------------------------------------------------------------------------------------------ guitab | 從可視化的標籤欄中讀取請求 dirwalk | 遞歸獲得本地某個文件夾中的文件名 file | 獲取一個文件當中的每個詞 autorize | 獲取autorize的測試結果Returns fuzz results' from autororize. wfuzzp | 從之前保存的wfuzz會話中獲取測試結果的URL ipnet | 獲得一個指定網絡的IP地址列表 bing | 獲得一個使用bing API搜索的URL列表 (需要 api key). stdin | 獲得從標準輸入中的條目 list | 獲得一個列表中的每一個元素,列表用以 - 符號分格 hexrand | 從一個指定的範圍中隨機獲取一個hex值 range | 獲得指定範圍內的每一個數值 names | 從一個以 - 分隔的列表中,獲取以組合方式生成的所有usernames值 burplog | 從BurpSuite的記錄中獲得測試結果 permutation | 獲得一個在指定charset和length時的字符組合 buffer_overflow | 獲得一個包含指定個數個A的字符串. hexrange | 獲得指定範圍內的每一個hex值 iprange | 獲得指定IP範圍內的IP地址列表 burpstate | 從BurpSuite的狀態下獲得測試結果
關於payloads的更詳細的信息可以通過以下命令獲取:
wfuzz -z help
–slice 參數來對輸出結果進行過濾:
encoder
encoder將payload進行編碼或加密。
Available encoders: Category | Name | Summary ------------------------------------------------------------------------------------------------------------------------ url_safe, url | urlencode | 用`%xx`的方式替換特殊字符, 字母/數字/下劃線/半角點/減號不替換 url_safe, url | double urlencode | 用`%25xx`的方式替換特殊字符, 字母/數字/下劃線/半角點/減號不替換 url | uri_double_hex | 用`%25xx`的方式將所有字符進行編碼 html | html_escape | 將`&`,`<`,`>`轉換爲HTML安全的字符 html | html_hexadecimal | 用 `&#xx;` 的方式替換所有字符 hashes | base64 | 將給定的字符串中的所有字符進行base64編碼 url | doble_nibble_hex | 將所有字符以`%%dd%dd`格式進行編碼 db | mssql_char | 將所有字符轉換爲MsSQL語法的`char(xx)`形式 url | utf8 | 將所有字符以`\u00xx` 格式進行編碼 hashes | md5 | 將給定的字符串進行md5加密 default | random_upper | 將字符串中隨機字符變爲大寫 url | first_nibble_hex | 將所有字符以`%%dd?` 格式進行編碼 default | hexlify | 每個數據的單個比特轉換爲兩個比特表示的hex表示 url | second_nibble_hex | 將所有字符以`%?%dd` 格式進行編碼 url | uri_hex | 將所有字符以`%xx` 格式進行編碼 default | none | 不進行任何編碼 hashes | sha1 | 將字符串進行sha1加密 url | utf8_binary | 將字符串中的所有字符以 `\uxx` 形式進行編碼 url | uri_triple_hex | 將所有字符以`%25%xx%xx` 格式進行編碼 url | uri_unicode | 將所有字符以`%u00xx` 格式進行編碼 html | html_decimal | 將所有字符以 `&#dd; ` 格式進行編碼 db | oracle_char | 將所有字符轉換爲Oracle語法的`chr(xx)`形式 db | mysql_char | 將所有字符轉換爲MySQL語法的`char(xx)`形式
正常使用:
-
wfuzz -z file --zP fn=wordlist,encoder=md5 https://www.cnblogs.com/-qing-/FUZZ
使用
Encoders
的md5
加密。 -
wfuzz -z file,wordlist,md5 URL/FUZZ
這裏簡寫了第一條命令,一般都使用這條命令來調用Encoders
使用多個Encoder:
-
多個轉換,使用一個
-
號分隔的列表來指定wfuzz -z file,dict.txt,md5-base64 https://www.cnblogs.com/-qing-/FUZZ
--zE md5 同樣的
wfuzz -z file --zP fn=qing.txt,encoder=md5 https://www.cnblogs.com/-qing-/FUZZ
wfuzz -z file --zP fn=qing.txt,encoder=md5-base64 https://www.cnblogs.com/-qing-/FUZZ
多次轉換的話使用一個@
號分隔的列表來按照從右往左順序多次轉換
wfuzz -z file --zP fn=qing.txt,encoder=md5@base64 https://www.cnblogs.com/-qing-/FUZZ
iterator
類似bp中的intruder
提供payload的處理方式
使用參數
-m 迭代器
wfuzz自帶的迭代器有三個:zip
、chain
、product
,如果不指定迭代器,默認爲product
迭代器。
zip迭代器的功能:字典數一一對應進行組合
chain迭代器的功能:將所有字典全部整合(不做組合)放在一起然後傳入佔位符FUZZ中。
product迭代器的功能:payload交叉組合 笛卡爾積 和bp裏的炸彈一樣的
wfuzz -e iterators Available iterators: Name | Summary ---------------------------------------------------------------------------------------------- product | Returns an iterator cartesian product of input iterables. zip | Returns an iterator that aggregates elements from each of the iterables. chain | Returns an iterator returns elements from the first iterable until it is exhaust | ed, then proceeds to the next iterable, until all of the iterables are exhausted
printer
scripts
一般分爲兩類:
- passive被動:被動腳本分析現有請求和響應,而不執行新請求。
- active主動:主動腳本嚮應用程序執行新請求,以對其進行漏洞探測。
其他類別是:
- discovery發現:發現插件通過自動將發現的內容排入wfuzz請求的池來幫助爬網網站。
當使用–script參數以及所選插件時,將指示掃描模式。可以按類別或名稱選擇插件,也可以使用通配符。
-A開關是–script = default的別名。
腳本的詳細信息可以使用–scrip-help獲得,例如:
使用簡單腳本 比如robots腳本插件 解析robots.txt中的目錄
wfuzz --script=robots -z list,"robots.txt" https://www.cnblogs.com/-qing-/FUZZ
list是告訴wufzz請求哪個文件
爲了不再重複掃描相同的請求(具有相同的參數),有一個緩存,可以使用–no-cache標誌禁用緩存。
使用wfuzz可以自己編寫wfuzz插件
/.wfuzz/scripts/
目錄
以參考已有的插件:https://github.com/xmendez/wfuzz/tree/master/src/wfuzz/plugins/scripts