前言: 做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