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/FUZZwfuzz -w dict/filename.txt 192.168.1.1/test/FUZZ.phpwfuzz -w dict/params.txt 192.168.1.1/test/test.php?name=FUZZwfuzz -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/FUZZTotal 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.193345Processed Requests: 950Filtered Requests: 0Requests/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 iteratorsAvailable 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.1Categories: defaultSummary: 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/FUZZCrunch will now generate the following amount of data: 12bytes0MB0GB0TB0PBCrunch will now generate the following number of lines: 4 ********************************************************* Wfuzz 2.2.9 - The Web Fuzzer *********************************************************Target:http://testphp.vulnweb.com/FUZZTotal 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.827355Processed Requests: 4Filtered Requests: 0Requests/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/FUZZTotal 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/FUZZTotal 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.323663Processed Requests: 950Filtered Requests: 946Requests/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/FUZZTotal 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.76636Processed Requests: 951Filtered Requests: 944Requests/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 payloadsAvailable payloads: Name | Summary ------------------------------------------------------------------------------------------------------guitab| 从可视化的标签栏中读取申请 dirwalk| 递归取得本地某个文件夹中的文件名 file| 获取一个文件当中的每个词 autorize| 获取autorize的测试后果Returns fuzz results' from autororize.wfuzzp | 从之前保留的wfuzz会话中获取测试后果的URLipnet | 取得一个指定网络的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 encodersAvailable 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 iteratorsAvailable 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 | (翻译不好,请自行了解)printerwfuzz的printers用于管制输入打印。printers列表如下:┌─[[email protected]]─[~]└──╼$wfuzz-e printersAvailable printers: Name | Summary --------------------------------------------------raw| `Raw`output formatjson| Results in `json`formatcsv| `CSV`printer ftwmagictree| Prints results in `magictree`formathtml| Prints results in `html`format(比拟好懂,不再翻译)

内置工具

wfencode 工具

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

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

wfpayload是payload生成工具

┌─[[email protected]]─[~/.wfuzz]└──╼ $wfpayload -z range,0-10012345678910
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多平台公布