Ethan's Blog

WFUZZ使用教程

字数统计: 3k阅读时长: 12 min
2019/03/29 Share
简介

Wfuzz是一款为了评估WEB应用而生的Fuzz(Fuzz是爆破的一种手段)工具,它基于一个简单的理念,即用给定的Payload去fuzz。它允许在HTTP请求里注入任何输入的值,针对不同的WEB应用组件进行多种复杂的爆破攻击。比如:参数、认证、表单、目录/文件、头部等等,这款工具在kali里面自带。

在这里插入图片描述

你可以用Wfuzz找到下面的漏洞:

  • 可预测的认证

  • 可预测的session标志(session id)

  • 可预测的资源定位(目录和文件)

  • 注入

  • 路径遍历

  • 溢出

  • 跨站脚本

  • 认证漏洞

  • 不安全的直接对象引用

  • ……..

特性

Wfuzz是用来帮助测试人员评估WEB应用的渗透测试工具。

  • 递归(目录发掘)
  • Post数据爆破
  • 头部爆破
  • 输出HTML(详细报告,点击链接查看内容,POST数据也能阅览)
  • 多彩输出
  • 返回码、词数、行数等等来隐藏结果。
  • URL编码
  • Cookie
  • 多线程
  • 代理支持
  • 多参数fuzz
Wfuzz基本功
爆破文件、目录

wfuzz本身自带字典:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
.
├── 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

但相对FuzzDBSecLists来说还是不够全面不够强大的,当然如果有自己的字典列表最好~

Wfuzz爆破文件:

1
wfuzz -w wordlist URL/FUZZ.php

Wfuzz爆破目录:

1
wfuzz -w wordlist URL/FUZZ
遍历枚举参数值

e.g. 假如你发现了一个未授权漏洞,地址为:http://127.0.0.1/getuser.php?uid=123 可获取uid为123的个人信息

uid参数可以遍历,已知123为三位数纯数字,需要从000-999进行遍历,也可以使用wfuzz来完成:

1
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测试:

1
wfuzz -w userList -w pwdList -d "username=FUZZ&password=FUZ2Z" http://127.0.0.1/login.php

-d参数传输POST请求正文。

Cookie测试

上文 遍历枚举参数值 中说到有未授权漏洞,假设这个漏洞是越权漏洞,要做测试的肯定需要让wfuzz知道你的Cookie才能做测试。

如下命令即可携带上Cookie:

1
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完成这类操作:

1
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:

1
wfuzz -z list,"GET-POST-HEAD-PUT" -X FUZZ http://127.0.0.1/

这条命了中多了 -z list-X 参数,-z list可以自定义一个字典列表(在命令中体现),以-分割;-X参数是指定HTTP请求方法类型,因为这里要测试HTTP请求方法,后面的值为FUZZ占位符

使用代理

做测试的时候想使用代理可以使用如下命令:

1
wfuzz -w wordlist -p proxtHost:proxyPort:TYPE URL/FUZZ

-p参数指定主机:端口:代理类型,例如我想使用ssr的,可以使用如下命令:

1
wfuzz -w wordlist -p 127.0.0.1:1087:SOCKS5 URL/FUZZ

多个代理可使用多个-p参数同时指定,wfuzz每次请求都会选取不同的代理进行。

认证

想要测试一个需要HTTP Basic Auth保护的内容可使用如下命令:

1
wfuzz -z list,"username-password" --basic FUZZ:FUZZ URL

wfuzz可以通过--basec --ntml --digest来设置认证头,使用方法都一样:

1
--basec/ntml/digest username:password
递归测试

使用-R参数可以指定一个payload被递归的深度(数字)。例如:爆破目录时,我们想使用相同的payload对已发现的目录进行测试,可以使用如下命令:

1
wfuzz -z list,"admin-login.php-test-dorabox" -R 1 http://127.0.0.1/FUZZ

如上命令就是使用了自定义字典列表:

1
2
3
4
admin
login.php
test
dorabox

递归深度为1也就是说当发现某一个目录存在的时候,在存在目录下再递归一次字典。

并发和间隔

wfuzz提供了一些参数可以用来调节HTTP请求的线程

e.g. 你想测试一个网站的转账请求是否存在HTTP并发漏洞(条件竞争)

请求地址:http://127.0.0.1/dorabox/race_condition/pay.php

POST请求正文:money=1

使用如下命令:

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模块来将结果以不同格式保存到文档中,一共有如下几种格式:

1
2
3
4
5
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格式输出到文件的命令如下:

1
$ 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自带的迭代器有三个:zipchainproduct,如果不指定迭代器,默认为product迭代器。

zip

命令:

1
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

命令:

1
wfuzz -z range,0-9 -w dict.txt -m chain http://127.0.0.1/ip.php?FUZZ

结果如下:

在这里插入图片描述

该命令设置了两个字典,一个占位符FUZZ,使用chain迭代器组合这两个字典发送。

chain迭代器的功能:通过返回结果就能看出来chain迭代器的功能了,这个迭代器是将所有字典全部整合(不做组合)放在一起然后传入占位符FUZZ中。

product

命令:

1
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,也就是使用Encodersmd5加密。

  • 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参数来看如何关于这个模块的信息:

1
wfuzz --script-help=robots

在这里插入图片描述

从如上结果中可以知道这个模块不需要设置参数,该模块解析robots.txt的并且寻找新的内容,,至于到底寻找什么,就需要动手实践下了~

在本地建一个robots.txt:

在这里插入图片描述

使用如下命令:

1
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:

1
wfuzz --script=robots -z list,"robots.txt" --dumo-recipe outrecipe URL/FUZZ

使用某个recipes:

1
wfuzz --recip outrecipe
网络异常

Wfuzz扫描的时候出现网络问题,如DNS解析失败,拒绝连接等时,wfuzz会抛出一个异常并停止执行使用-Z参数即可忽略这些错误继续执行。

出现错误的payload会以返回码XXX来表示,Payload中还有出现的错误信息

超时

使用wfuzz扫描会遇到一些响应很慢的情况,wfuzz可以设置超时时间。

参数--conn-delay来设置wfuzz等待服务器响应接连的秒数。 参数--req-delay来设置wfuzz等待响应完成的最大秒数。

结合BurpSuite

从Burp的LOG文件中获取测试的URL地址:

在这里插入图片描述

1
wfuzz -z burplog,"1.burp" FUZZ

在这里插入图片描述

还有能够读取burpsuite保存的state:

1
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
第一个字典目录结构
在这里插入图片描述
示例
在这里插入图片描述
在这里插入图片描述

CATALOG
  1. 1. 简介
  2. 2. Wfuzz基本功
    1. 2.1. 爆破文件、目录
    2. 2.2. 遍历枚举参数值
    3. 2.3. POST请求测试
    4. 2.4. Cookie测试
    5. 2.5. HTTP Headers测试
    6. 2.6. 测试HTTP请求方法(Method)
    7. 2.7. 使用代理
    8. 2.8. 认证
    9. 2.9. 递归测试
    10. 2.10. 并发和间隔
    11. 2.11. 保存测试结果
  3. 3. Wfuzz高阶功法
    1. 3.1. Iterators
    2. 3.2. zip
    3. 3.3. chain
    4. 3.4. product
    5. 3.5. Encoders
    6. 3.6. 使用多个Encoder
    7. 3.7. Scripts
    8. 3.8. 使用Scripts
    9. 3.9. 自定义插件
    10. 3.10. 技巧
    11. 3.11. 网络异常
    12. 3.12. 超时
    13. 3.13. 结合BurpSuite
    14. 3.14. 过滤器
    15. 3.15. 字典