乐趣区

关于程序员:一款能模糊的地方都能模糊的测试工具Wfuzz

wfuzz 不仅仅是一个 web 扫描器:

wfuzz 可能通过发现并利用网站弱点 / 破绽的形式帮忙你使网站更加平安。wfuzz 的破绽扫描性能由插件反对。

wfuzz 是一个齐全模块化的框架,这使得即便是 Python 初学者也可能进行开发和奉献代码。开发一个 wfuzz 插件是一件非常简单的事,通常只需几分钟。

wfuzz 提供了简洁的编程语言接口来解决 wfuzz 或 Burpsuite 获取到的 HTTP 申请和响应。这使得你可能在一个良好的上下文环境中进行手工测试或半自动化的测试,而不须要依赖 web 模式的扫描器。

wfuzz 是用 python 开发的针对 web 的含糊测试工具,该工具实现性能相当于 burp 的爆破模块,能够自定义指定参数进行爆破测试。

装置

该工具在 kali 中曾经装置并间接应用
也能够用 pip 装置 wfuzz

pip install wfuzz

github 地址:https://github.com/xmendez/wfuzz

wfuzz 参数

wfuzz 是一个模块化的框架,有 5 类内置的模块
payloads,encoders,interators,printers 和 script
每类有很多不同的模块,能够通过-e 参数查看

wfuzz -e payloads
payloads 为 wfuzz 生成的用于测试的特定字符串
encoders 的作用是将 payload 进行编码或加密
iterators 提供了针对多个 payload 的解决形式
printers 用于管制输入打印

wfuzz 的参数指令就不多介绍了,应用 -h 或者 --help 自行查看,在这只介绍几种浸透测试罕用的参数指令

wfuzz 应用办法

1、最根本含糊测试门路,文件名, 参数值

wfuzz -w dict/test.txt 192.168.1.1/test/FUZZ
wfuzz -w dict/filename.txt 192.168.1.1/test/FUZZ.php
wfuzz -w dict/params.txt 192.168.1.1/test/test.php?name=FUZZ
wfuzz -w dict/params.txt -w dict/123.txt  192.168.1.1/test/test.php?FUZZ=FUZ2Z

- w 是指定字典的门路
FUZZ 是指定要含糊测试的地位,相当于一个指示器,想测哪里,就把 FUZZ 放在哪(记住全大写)
FUZZ,FUZ2Z,FUZ3Z 是示意多个测试地位,放在哪里就测试哪里。

2. 过滤显示

wfuzz 有多种过滤显示操作
--hc,--hl,--hw,--hh 是四种暗藏过滤的内容参数
--sc,--sl,--sw,--sh 是四种显示过滤的内容

wfuzz -w list.txt --hc 302 https://www.baidu.com/FUZZ #暗藏 302 的申请
wfuzz -w list.txt --hl  17  https://www.baidu.com/FUZZ #暗藏返回长度为 17 的申请
wfuzz -w list.txt --sc 200 https://www.baidu.com/FUZZ #显示 200 的申请

3.POST 申请测试

wfuzz -w user.txt -w pwd.txt -d "username=FUZZ&password=FUZ2Z" http://192.168.1.1/login.php

- d 参数前面为 post 申请的内容

4. 指定 Cookie

wfuzz -z range,00-99 -b cookie=cookie -b session=session  http://192.168.1.1/user.php?id=FUZZ

- b 参数指定 Cookie,当有多个 Cookie 须要指定屡次

5. 递归扫描目录

wfuzz -w wordlist -R 2 http://192.168.1.1/FUZZ

当扫到一个目录时,将在此目录下在进行含糊测试,- R 示意深刻扫描多少层

使用指南

最简略命令

一个典型的 wfuzz 命令只须要指定一个字典和一个要测试的 URL 即可,如下:

┌─[[email protected]]─[/usr/share/wfuzz/src/wfuzz]
└──╼$wfuzz-w/usr/share/wfuzz/wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ
********************************************************
* Wfuzz 2.2.9 - The Web Fuzzer *
********************************************************

Target:http://testphp.vulnweb.com/FUZZ
Total requests: 950

==================================================================
ID Response Lines Word Chars Payload 
==================================================================

000223:C=404 7L12W168 Ch "constants"
000224:C=404 7L12W168 Ch "contact"
000225:C=404 7L12W168 Ch "contacts"
000230:C=404 7L12W168 Ch "controlpanel"
000226:C=404 7L12W168 Ch "content"
000227:C=404 7L12W168 Ch "contents"
000228:C=404 7L12W168 Ch "control"
...
000008:C=404 7L12W168 Ch "100"

Total time: 5.193345
Processed Requests: 950
Filtered Requests: 0
Requests/sec.: 182.9264

wfuzz 的输入使咱们可能剖析 web server 的响应,还可依据取得的 HTTP 响应信息过滤出咱们想要的后果,比方过滤响应码 / 响应长度等等。

每一行输入给咱们提供了以下信息:

  • ID:测试时的申请序号 - Response:HTTP 响应码 - Lines:响应信息中的行数 - Word:响应信息中的字数 - Chars:响应信息中的字符数 - Payload:以后应用的 payload

    获取帮忙信息

应用 -h 和 –help 参数来获取根本帮忙信息和具体帮忙信息。

wfuzz 是一个齐全模块化的模式,你能够应用 -e <> 参数查看其中可用的模块,例如:

┌─[[email protected]]─[/usr/share/wfuzz/src/wfuzz]
└──╼$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
 | .

可用的 categories 包含:payloads , encoders , iterators , printers 和 scripts。

Payloads

wfuzz 基于一个非常简单的概念:它用一个给定的 payload 来替换相应的 FUZZ 关键词的值,咱们称 FUZZ 这样的关键词为 占位符,这样更容易了解。一个 wfuzz 中的 payload 就是一个输出的源。

要想得到所有可用的 payload 列表,能够执行如下命令:

$ wfuzz -e payloads

对于 payloads 的更具体的信息能够通过以下命令获取:

$ wfuzz -z help

下面这个命令还能够应用 –slice 参数来对输入后果进行过滤:

┌─[[email protected]]─[/usr/share/wfuzz/src/wfuzz]
└──╼ $wfuzz -z help --slice "dirwalk"
Name: dirwalk 0.1
Categories: default
Summary: Returns filename's recursively from a local directory.
Author: Xavi Mendez (@xmendez)
Description:
 Returns all the file paths found in the specified directory.
 Handy if you want to check a directory structure against a webserver,
 for example, because you have previously downloaded a specific version
 of what is supposed to be on-line.
Parameters:
 + dir: Directory path to walk and generate payload from.
指定一个 payload

每个 FUZZ 占位符都必须为它指定相应的 payload。指定一个 payload 时有几种办法:

命令比拟长的形式是显式的定义 payload 的参数:

$ wfuzz -z file --zP fn=/usr/share/wfuzz/wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ

另一个不太长的形式是只提供 payload 所需的默认参数:

$ wfuzz -z file,/usr/share/wfuzz/wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ

最初,短的形式是应用别名:

$ wfuzz -w /usr/share/wfuzz/wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ

stdin 这个 payload 能够在应用一些内部字典生成工具时很不便:

┌─[[email protected]]─[/usr/share/wfuzz/src/wfuzz]
└──╼$crunch2 2ab|wfuzz-z stdin http://testphp.vulnweb.com/FUZZ
Crunch will now generate the following amount of data: 12bytes
0MB
0GB
0TB
0PB
Crunch will now generate the following number of lines: 4 
********************************************************
* Wfuzz 2.2.9 - The Web Fuzzer *
********************************************************

Target:http://testphp.vulnweb.com/FUZZ
Total requests: <<unknown>>

==================================================================
ID Response Lines Word Chars Payload 
==================================================================

000002:C=404 7L12W168 Ch "ab"
000001:C=404 7L12W168 Ch "aa"
000003:C=404 7L12W168 Ch "ba"
000004:C=404 7L12W168 Ch "bb"

Total time: 3.827355
Processed Requests: 4
Filtered Requests: 0
Requests/sec.: 1.045107
应用多个 payloads

应用 -z 或 -w 参数能够同时指定多个 payloads,这时相应的占位符应设置为 FUZZ, … , FUZnZ, 其中 n 代表了 payload 的序号。比方上面的例子,咱们同时暴破文件,后缀和目录:

$ wfuzz -w /usr/share/wfuzz/wordlist/general/common.txt -w /usr/share/wfuzz/wordlist/general/common.txt -w /usr/share/wfuzz/wordlist/general/extensions_common.txt --hc 404 http://testphp.vulnweb.com/FUZZ/FUZ2ZFUZ3Z
过滤器

对 wfuzz 的后果时行过滤是十分重要的:

十分大的字典文件能够生成十分宏大的输入,并且把咱们想要的后果吞没
对 HTTP 响应的一些分类在理论攻打时是十分重要的,例如,为了查检一个 SQLi 的破绽是否存在,咱们必须可能将正当的响应和谬误 / 不同的响应辨别开。
wfuzz 可依据 HTTP 响应码和收到的响应的长度(字数,字符数或行数)来过滤。还能够用正则表达式。

过滤的办法有两种:暗藏或显示合乎过滤条件的后果。

暗藏响应后果

通过 –hc,–hl,–hw,–hh 参数能够暗藏某些 HTTP 响应。

暗藏无奈找到的页面的响应如下:

$ wfuzz -w /usr/share/wfuzz/wordlist/general/common.txt --hc 404 http://testphp.vulnweb.com/FUZZ

可指定多个须要暗藏的条件,如,想要加上暗藏禁止拜访的响应:

$ wfuzz -w /usr/share/wfuzz/wordlist/general/common.txt --hc 404,403 http://testphp.vulnweb.com/FUZZ

用行数,字数,字符数来指定过滤规定,在当 HTTP 返回码雷同的时候比拟不便。比方,网站个别会指定一个自定义的谬误页面,返回码是 200,但实际上起到了一个 404 页面的作用,咱们称之为软 404。

上面是一个例子:

┌─[[email protected]]─[~]
└──╼$wfuzz-w/usr/share/wfuzz/wordlist/general/common.txt--hc404http://datalayer.io/FUZZ
********************************************************
* Wfuzz 2.2.9 - The Web Fuzzer *
********************************************************

Target:http://datalayer.io/FUZZ
Total requests: 950

==================================================================
ID Response Lines Word Chars Payload 
==================================================================

000083:C=200 51L138W962 Ch "apache"
000008:C=200 51L138W962 Ch "100"
000009:C=200 51L138W962 Ch "1000"
000011:C=200 51L138W962 Ch "2"
000012:C=200 51L138W962 Ch "20"
000013:C=200 51L138W962 Ch "200"
...

仔细观察下面的后果,咱们很容易推断出所有”not found”的返回信息中都有 51 个行,138 个字,962 个字符。因而,咱们须要改良一下咱们的过滤条件(减少多个过滤条件):

┌─[[email protected]]─[~]
└──╼$wfuzz-w/usr/share/wfuzz/wordlist/general/common.txt--hc404 --hh962http://datalayer.io/FUZZ
********************************************************
* Wfuzz 2.2.9 - The Web Fuzzer *
********************************************************

Target:http://datalayer.io/FUZZ
Total requests: 950

==================================================================
ID Response Lines Word Chars Payload 
==================================================================

000430:C=302 0L0W0 Ch "img"
000689:C=500 2L1W9 Ch "register"
000135:C=302 0L0W0 Ch "blog"
000438:C=200 1677L5416W90077 Ch "index"

Total time: 8.323663
Processed Requests: 950
Filtered Requests: 946
Requests/sec.: 114.1324

显示响应后果

显示响应后果的应用办法跟暗藏时的原理一样,只不过参数变为了:–sc,–sl,–sw,–sh。

应用 Baseline

习惯上称 Baseline 为”基准线“。过滤器能够是某个 HTTP 响应的援用,这样的援用咱们称为 Baseline。

之前的应用 –hh 进行过滤的例子中,还能够应用上面的命令代替:

┌─[[email protected]]─[~]
└──╼$wfuzz-w/usr/share/wfuzz/wordlist/general/common.txt--hh BBB http://datalayer.io/FUZZ{notthere}
********************************************************
* Wfuzz 2.2.9 - The Web Fuzzer *
********************************************************

Target:http://datalayer.io/FUZZ
Total requests: 951

==================================================================
ID Response Lines Word Chars Payload 
==================================================================

000002:C=200 51L138W962 Ch "notthere"
000432:C=302 0L0W0 Ch "img"
000086:C=404 0L0W0 Ch "api"
000691:C=500 2L1W9 Ch "register"
000137:C=302 0L0W0 Ch "blog"
000045:C=404 0L0W0 Ch "WEB-INF"
000440:C=200 1677L5416W90077 Ch "index"

Total time: 21.76636
Processed Requests: 951
Filtered Requests: 944
Requests/sec.: 43.69125

这里,{} 来指定 第一次 HTTP 申请时用来替换 FUZZ 占位符 的值,其响应将被标记为 BBB,并用于过滤条件中。

应用正则表达式过滤

在命令行中,参数 –ss 和 –hs 能够承受正则表达式来对返回的后果时行过滤。

$ wfuzz -H "User-Agent: () { :;}; echo; echo vulnerable" --ss vulnerable -w cgis.txt http://localhost:8000/FUZZ

重要关键词

payload

payload 为 wfuzz 生成的用于测试的特定字符串,个别状况下,会代替被测试 URL 中的 FUZZ 占位符。

以后版本中的 wfuzz 中可用 payloads 列表如下:

┌─[[email protected]]─[~]
└──╼$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 的状态下取得测试后果
encoder

encoder 的作用是将 payload 进行编码或加密。

wfuzz 的 encoder 列表如下:

┌─[[email protected]]─[~]
└──╼$wfuzz-e encoders

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)` 模式
iterator

wfuzz 的 iterator 提供了针对多个 payload 的解决形式。

itorators 的列表如下:

┌─[[email protected]]─[~]
└──╼$wfuzz-e iterators

Available iterators:

 Name | Summary 
----------------------------------------------------------------------------------------------
product| 返回输入条目标笛卡尔积
zip| Retns 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
wfuzz 的 printers 用于管制输入打印。printers 列表如下:┌─[[email protected]]─[~]
└──╼$wfuzz-e printers

Available printers:

 Name | Summary 
--------------------------------------------------
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(比拟好懂,不再翻译)

内置工具

wfencode 工具

这是 wfuzz 自带的一个加密 / 解密(编码 / 反编码)工具,目前反对内建的 encoders 的加 / 解密。

┌─[[email protected]]─[~/.wfuzz]
└──╼ $wfencode -e base64 123456
MTIzNDU2

┌─[[email protected]]─[~/.wfuzz]
└──╼ $wfencode -d base64 MTIzNDU2
123456
wfpayload 工具

wfpayload 是 payload 生成工具

┌─[[email protected]]─[~/.wfuzz]
└──╼ $wfpayload -z range,0-10
0
1
2
3
4
5
6
7
8
9
10
wxfuzz 工具

这个看源码是一个 wxPython 化的 wfuzz,也就是 GUI 图形界面的 wfuzz。目前须要 wxPython 最新版本能力应用,然而在 ParrotOS 和 Kali 上都无奈失常装置胜利,问题已在 GitHub 提交 Issue,期待开发者的回复中…

wfuzz 命令中文帮忙

这是 wfuzz 的主工具,咱们平时应用的时候就是用这个。

先来看看帮忙文档:

┌─[✗]─[[email protected]]─[~]
└──╼$wfuzz--help
********************************************************
* Wfuzz 2.2.9 - The Web Fuzzer *
* *
* Version up to1.4c coded by: *
* Christian Martorella ([email protected]-security.com) *
* Carlos del ojo([email protected].com) *
* *
* Version 1.4d to2.2.9coded by: *
* Xavier Mendez ([email protected]-security.com) *
********************************************************

 Usage:wfuzz[options] -z payload,params <url>

FUZZ, ..., FUZnZ payload 占位符,wfuzz 会用指定的 payload 代替相应的占位符,n 代表数字. 
FUZZ{baseline_value}FUZZ 会被 baseline_value 替换,并将此作为测试过程中第一个申请来测试,可用来作为过滤的一个根底。Options:
 -h/--help: 帮忙文档
 --help: 高级帮忙文档
 --version: Wfuzz 具体版本信息
 -e<type> : 显示可用的 encoders/payloads/iterators/printers/scripts 列表

 --recipe<filename> : 从文件中读取参数
 --dump-recipe<filename> : 打印以后的参数并保留成文档
 --oF<filename> : 将测试后果保留到文件,这些后果可被 wfuzz payload 解决

 -c: 黑白化输入
 -v: 具体输入
 -f filename,printer: 将后果以 printer 的形式保留到 filename(默认为 raw printer).
 -o printer: 输入特定 printer 的输入后果
 --interact: (测试性能) 如果启用,所有的按键将会被捕捉,这使得你可能与程序交互
 --dry-run: 打印测试后果,而并不发送 HTTP 申请
 --prev: 打印之前的 HTTP 申请(仅当应用 payloads 来生成测试后果时应用)-p addr: 应用代理,格局 ip:port:type. 可设置多个代理,type 可取的值为 SOCKS4,SOCKS5or HTTP(默认)-t N: 指定连贯的并发数,默认为 10
 -s N: 指定申请的间隔时间,默认为 0
 -R depth: 递归门路探测,depth 指定最大递归数量
 -L,--follow: 追随 HTTP 重定向
 -Z: 扫描模式 (连贯谬误将被忽视).
 --req-delay N: 设置发送申请容许的最大工夫,默认为 90,单位为秒.
 --conn-delay N: 设置连贯期待的最大工夫,默认为 90,单位为秒.

 -A: 是 --script=default -v- c 的简写
 --script= : 与 --script=default 等价
 --script=<plugins> : 进行脚本扫描,<plugins> 是一个以逗号离开的插件或插件分类列表
 --script-help=<plugins> : 显示脚本的帮忙
 --script-args n1=v1,... : 给脚本传递参数.ie. --script-args grep.regex="<A href="(.*?)">"

 -u url: 指定申请的 URL
 -m iterator: 指定一个解决 payloads 的迭代器 (默认为 product)
 -z payload: 为每一个占位符指定一个 payload,格局为 name[,parameter][,encoder].
 编码能够是一个列表, 如 md5-sha1. 还能够串联起来, 如.[email protected].
 还可应用编码各类名,如 url
 应用 help 作为 payload 来显示 payload 的具体帮忙信息,还可应用 --slice 进行过滤
 --zP<params> : 给指定的 payload 设置参数。必须跟在 - z 或 - w 参数前面
 --slice<filter> : 以指定的表达式过滤 payload 的信息,必须跟在 - z 参数前面
 -w wordlist: 指定一个 wordlist 文件,等同于 -z file,wordlist
 -V alltype: 暴力测试所有 GET/POST 参数,无需指定占位符
 -X method: 指定一个发送申请的 HTTP 办法,如 HEAD 或 FUZZ

 -b cookie: 指定申请的 cookie 参数,可指定多个 cookie
 -d postdata: 设置用于测试的 POST data(ex: "id=FUZZ&catalogue=1")
 -H header: 设置用于测试申请的 HEADER(ex:"Cookie:id=1312321&user=FUZZ"). 可指定多个 HEADER.
 --basic/ntlm/digest auth: 格局为 "user:pass" or "FUZZ:FUZZ" or "domainFUZ2Z:FUZZ"

 --hc/hl/hw/hh N[,N]+ : 以指定的返回码 / 行数 / 字数 / 字符数作为判断条件暗藏返回后果 (用 BBB 来接管 baseline)
 --sc/sl/sw/sh N[,N]+ : 以指定的返回码 / 行数 / 字数 / 字符数作为判断条件显示返回后果 (用 BBB 来接管 baseline)
 --ss/hs regex: 显示或暗藏返回后果中合乎指定正则表达式的返回后果
 --filter<filter> : 显示或暗藏合乎指定 filter 表达式的返回后果 (用 BBB 来接管 baseline)
 --prefilter<filter> : 用指定的 filter 表达式在测试之前过滤某些测试条目

总结

wfuzz 的性能不只这一点点,还有很多参数能够深刻摸索,达到动向不到的目标。

因为 FUZZ 指示器能够随便指定,能够让咱们进行多种多样的含糊测试

在 url 后面能够测试子域名,放在参数名处能够测试存在的参数,也能够批改 head 头部信息进行含糊测试,只有能够含糊测试的中央根本都能够实现。

本文由 mdnice 多平台公布

退出移动版