WFUZZ使用教程
文章目录简介Wfuzz基本功爆破文件、目录遍历枚举参数值POST请求测试Cookie测试HTTP Headers测试测试HTTP请求方法(Method)使用代理认证递归测试并发和间隔保存测试结果Wfuzz高阶功法IteratorszipchainproductEncoders**使用多个Encoder:**Scripts使用Scripts自定义插件技巧网络异常超时结合BurpSuite过滤器字典.
文章目录
简介
Wfuzz是一款为了评估WEB应用而生的Fuzz(Fuzz是爆破的一种手段)工具,它基于一个简单的理念,即用给定的Payload去fuzz。它允许在HTTP请求里注入任何输入的值,针对不同的WEB应用组件进行多种复杂的爆破攻击。比如:参数、认证、表单、目录/文件、头部等等,这款工具在kali里面自带。
你可以用Wfuzz找到下面的漏洞:
-
可预测的认证
-
可预测的session标志(session id)
-
可预测的资源定位(目录和文件)
-
注入
-
路径遍历
-
溢出
-
跨站脚本
-
认证漏洞
-
不安全的直接对象引用
-
…
特性
Wfuzz是用来帮助测试人员评估WEB应用的渗透测试工具。
- 递归(目录发掘)
- Post数据爆破
- 头部爆破
- 输出HTML(详细报告,点击链接查看内容,POST数据也能阅览)
- 多彩输出
- 返回码、词数、行数等等来隐藏结果。
- URL编码
- Cookie
- 多线程
- 代理支持
- 多参数fuzz
Wfuzz基本功
爆破文件、目录
wfuzz本身自带字典:
.
├── Injections
│ ├── All_attack.txt
│ ├── SQL.txt
│ ├── Traversal.txt
│ ├── XML.txt
│ ├── XSS.txt
│ └── bad_chars.txt
├── general
│ ├── admin-panels.txt
│ ├── big.txt
│ ├── catala.txt
│ ├── common.txt
│ ├── euskera.txt
│ ├── extensions_common.txt
│ ├── http_methods.txt
│ ├── medium.txt
│ ├── megabeast.txt
│ ├── mutations_common.txt
│ ├── spanish.txt
│ └── test.txt
├── others
│ ├── common_pass.txt
│ └── names.txt
├── stress
│ ├── alphanum_case.txt
│ ├── alphanum_case_extra.txt
│ ├── char.txt
│ ├── doble_uri_hex.txt
│ ├── test_ext.txt
│ └── uri_hex.txt
├── vulns
│ ├── apache.txt
│ ├── cgis.txt
│ ├── coldfusion.txt
│ ├── dirTraversal-nix.txt
│ ├── dirTraversal-win.txt
│ ├── dirTraversal.txt
│ ├── domino.txt
│ ├── fatwire.txt
│ ├── fatwire_pagenames.txt
│ ├── frontpage.txt
│ ├── iis.txt
│ ├── iplanet.txt
│ ├── jrun.txt
│ ├── netware.txt
│ ├── oracle9i.txt
│ ├── sharepoint.txt
│ ├── sql_inj.txt
│ ├── sunas.txt
│ ├── tests.txt
│ ├── tomcat.txt
│ ├── vignette.txt
│ ├── weblogic.txt
│ └── websphere.txt
└── webservices
├── ws-dirs.txt
└── ws-files.txt
但相对FuzzDB和SecLists来说还是不够全面不够强大的,当然如果有自己的字典列表最好~
Wfuzz爆破文件:
wfuzz -w wordlist URL/FUZZ.php
Wfuzz爆破目录:
wfuzz -w wordlist URL/FUZZ
遍历枚举参数值
e.g. 假如你发现了一个未授权漏洞,地址为:http://127.0.0.1/getuser.php?uid=123 可获取uid为123的个人信息
uid参数可以遍历,已知123为三位数纯数字,需要从000-999进行遍历,也可以使用wfuzz来完成:
wfuzz -z range,000-999 http://127.0.0.1/getuser.php?uid=FUZZ
使用payloads模块类中的range模块
进行生成。
POST请求测试
e.g. 发现一个登录框,没有验证码,想爆破弱口令账户。
请求地址为:http://127.0.0.1/login.php
POST请求正文为:username=&password=
使用wfuzz测试:
wfuzz -w userList -w pwdList -d "username=FUZZ&password=FUZ2Z" http://127.0.0.1/login.php
-d
参数传输POST请求正文。
Cookie测试
上文 遍历枚举参数值 中说到有未授权漏洞,假设这个漏洞是越权漏洞,要做测试的肯定需要让wfuzz知道你的Cookie才能做测试。
如下命令即可携带上Cookie:
wfuzz -z range,000-999 -b session=session -b cookie=cookie http://127.0.0.1/getuser.php?uid=FUZZ
-b
参数指定Cookie,多个Cookie需要指定多次,也可以对Cookie进行测试,仍然使用FUZZ占位符即可。
HTTP Headers测试
e.g. 发现一个刷票的漏洞,这个漏洞需要伪造XFF头(IP)可达到刷票的效果,投票的请求为GET类型,地址为:http://127.0.0.1/get.php?userid=666。
那么现在我想给userid为666的朋友刷票,可以使用wfuzz完成这类操作:
wfuzz -z range,0000-9999 -H "X-Forwarded-For: FUZZ" http://127.0.0.1/get.php?userid=666
-H
指定HTTP头,多个需要指定多次(同Cookie的-b参数)。
测试HTTP请求方法(Method)
e.g. 想测试一个网站(http://127.0.0.1/)支持哪些HTTP请求方法
使用wfuzz:
wfuzz -z list,"GET-POST-HEAD-PUT" -X FUZZ http://127.0.0.1/
这条命了中多了 -z list
和 -X
参数,-z list
可以自定义一个字典列表(在命令中体现),以-
分割;-X
参数是指定HTTP请求方法类型,因为这里要测试HTTP请求方法,后面的值为FUZZ占位符
。
使用代理
做测试的时候想使用代理可以使用如下命令:
wfuzz -w wordlist -p proxtHost:proxyPort:TYPE URL/FUZZ
-p
参数指定主机:端口:代理类型,例如我想使用ssr的,可以使用如下命令:
wfuzz -w wordlist -p 127.0.0.1:1087:SOCKS5 URL/FUZZ
多个代理可使用多个-p
参数同时指定,wfuzz每次请求都会选取不同的代理进行。
认证
想要测试一个需要HTTP Basic Auth保护的内容可使用如下命令:
wfuzz -z list,"username-password" --basic FUZZ:FUZZ URL
wfuzz可以通过--basec --ntml --digest
来设置认证头,使用方法都一样:
--basec/ntml/digest username:password
递归测试
使用-R
参数可以指定一个payload被递归的深度(数字)。例如:爆破目录时,我们想使用相同的payload对已发现的目录进行测试,可以使用如下命令:
wfuzz -z list,"admin-login.php-test-dorabox" -R 1 http://127.0.0.1/FUZZ
如上命令就是使用了自定义字典列表:
admin
login.php
test
dorabox
递归深度为1也就是说当发现某一个目录存在的时候,在存在目录下再递归一次字典。
并发和间隔
wfuzz提供了一些参数可以用来调节HTTP请求的线程
e.g. 你想测试一个网站的转账请求是否存在HTTP并发漏洞(条件竞争)
请求地址:http://127.0.0.1/dorabox/race_condition/pay.php
POST请求正文:money=1
使用如下命令:
wfuzz -z range,0-20 -t 20 -d "money=1" http://127.0.0.1/dorabox/race_condition/pay.php?FUZZ
测试并发要控制请求次数,在这里为使用range
模块生成0-20,然后将FUZZ占位符放在URL的参数后不影响测试即可,主要是用-t
参数设置并发请求,该参数默认设置都是10。
另外使用-s
参数可以调节每次发送HTTP的时间间隔。
保存测试结果
wfuzz通过printers
模块来将结果以不同格式保存到文档中,一共有如下几种格式:
raw | `Raw` output format
json | Results in `json` format
csv | `CSV` printer ftw
magictree | Prints results in `magictree` format
html | Prints results in `html` format
将结果以json
格式输出到文件的命令如下:
$ wfuzz -f outfile,json -w wordlist URL/FUZZ
使用-f
参数,指定值的格式为输出文件位置,输出格式
。
Wfuzz高阶功法
Iterators
BurpSuite的Intruder
模块中Attack Type有Sniper(狙击手)、Battering ram(撞击物)、Pitchfork(相交叉)、Cluster bomb(集束炸弹)~
wfuzz也可以完成这样的功能,将不同的字典的组合起来,那就是Iterators
模块。
使用参数-m 迭代器
,wfuzz自带的迭代器有三个:zip
、chain
、product
,如果不指定迭代器,默认为product
迭代器。
zip
命令:
wfuzz -z range,0-9 -w dict.txt -m zip http://127.0.0.1/ip.php?FUZZ=FUZ2Z
结果如下:
该命令的意思:设置了两个字典。两个占位符,一个是range
模块生成的0、1、2、3、4、5、6、7、8、9
10个数字,一个是外部字典dict.txt的9行字典,使用zip迭代器组合这两个字典发送。
zip迭代器的功能:字典数相同、一一对应进行组合,如果字典数不一致则多余的抛弃掉不请求,如上命令结果就是数字9被抛弃了因为没有字典和它组合。
chain
命令:
wfuzz -z range,0-9 -w dict.txt -m chain http://127.0.0.1/ip.php?FUZZ
结果如下:
该命令设置了两个字典,一个占位符FUZZ,使用chain迭代器组合这两个字典发送。
chain迭代器的功能:通过返回结果就能看出来chain
迭代器的功能了,这个迭代器是将所有字典全部整合(不做组合)放在一起然后传入占位符FUZZ中。
product
命令:
wfuzz -z range,0-2 -w dict.txt -m product http://127.0.0.1/ip.php?FUZZ=FUZ2Z
结果如下:
该命令的意思:设置了两个字典,两个占位符,一个是range
模块生成的0、1、2
3个数字,一个是外部字典dict.txt的3行字典,使用product迭代器组合这两个字典发送。
product迭代器的功能:通过返回结果,知道了请求总数为9,请求的payload交叉组合:
Encoders
wfuzz中encoders模块可以实现编码解码、加密,它支持如下图中所列转换功能:
使用Encoders
正常使用:
-
wfuzz -z file --zP fn=wordlist,encoder=md5 URL/FUZZ
看过第一章的应该都能理解意思了,这里新增的就是
encoder=md5
,也就是使用Encoders
的md5
加密。 -
wfuzz -z file,wordlist,md5 URL/FUZZ
这里简写了第一条命令,一般都使用这条命令来调用Encoders
使用多个Encoder
-
多个转换,使用一个
-
号分隔的列表来指定wfuzz -z file,dict.txt,md5-base64 http://127.0.0.1/ip.php\?FUZZ
-
多次转换,使用一个
@
号分隔的列表来按照从右往左顺序多次转换(这里让传入的字典先md5加密然后base64编码)wfuzz -z file,dict.txt,base64@md5 http://127.0.0.1/ip.php\?FUZZ
Scripts
之前说了wfuzz支持插件,其本身也有很多插件,插件大部分都是实现扫描和解析功能,插件共有两大类和一类附加插件:
- passive:分析已有的请求和响应(被动)
- active:会向目标发送请求来探测(主动)
- discovery:自动帮助wfuzz对目标站进行爬取,将发现的内容提供给wfuzz进行请求
Wfuzz默认自带脚本如下:
使用Scripts
我想使用Scripts
中的backups
模块,可以先试用--script-help
参数来看如何关于这个模块的信息:
wfuzz --script-help=robots
从如上结果中可以知道这个模块不需要设置参数,该模块解析robots.txt的并且寻找新的内容,,至于到底寻找什么,就需要动手实践下了~
在本地建一个robots.txt:
使用如下命令:
wfuzz --script=robots -z list,"robots.txt" http://127.0.0.1/FUZZ
--script
是使用脚本模块的参数,这时候就有个疑惑命令为什么要加上list呢?因为在这里robots
脚本只是解析robots.txt
规则的,所以你需要告诉wfuzz去请求哪个文件而这里我写的就是robots.txt
就可以解析(假设 http://127.0.0.1/t.txt 的内容也是robots的就可以写成这样的命令wfuzz --script=robots -z list,"t.txt" http://127.0.0.1/FUZZ
)
从如上图中得知wfuzz解析robots.txt的内容然后请求解析之后获得的路径。
自定义插件
使用wfuzz可以自己编写wfuzz插件,需要放在~/.wfuzz/scripts/
目录下,具体如何编写可以参考已有的插件:https://github.com/xmendez/wfuzz/tree/master/src/wfuzz/plugins/scripts
技巧
Recipes
Wfuzz可以生成一个recipes用来保存命令,方便下次执行或者分享给别人。
生成一个recipes:
wfuzz --script=robots -z list,"robots.txt" --dumo-recipe outrecipe URL/FUZZ
使用某个recipes:
wfuzz --recip outrecipe
网络异常
Wfuzz扫描的时候出现网络问题,如DNS解析失败,拒绝连接等时,wfuzz会抛出一个异常并停止执行使用-Z
参数即可忽略这些错误继续执行。
出现错误的payload会以返回码XXX
来表示,Payload中还有出现的错误信息。
超时
使用wfuzz扫描会遇到一些响应很慢的情况,wfuzz可以设置超时时间。
参数--conn-delay
来设置wfuzz等待服务器响应接连的秒数。 参数--req-delay
来设置wfuzz等待响应完成的最大秒数。
结合BurpSuite
从Burp的LOG文件中获取测试的URL地址:
wfuzz -z burplog,"1.burp" FUZZ
还有能够读取burpsuite保存的state:
wfuzz -z burpstate,a_burp_state.burp FUZZ
过滤器
这里篇幅太长,建议综合参考 https://github.com/xmendez/wfuzz/blob/18a83606e3011159b4b2e8c0064f95044c3c4af5/docs/user/advanced.rst 就不一一写出来了。
字典
在这里贴出来自己搜集的字典!需要的可以自行下载
链接:https://pan.baidu.com/s/1tekP1fxZ22h-L4o8nfoefg
提取码:j66f
第一个字典目录结构
示例
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)