描述:wfuzz 是一款Python开发的Web安全模糊测试工具。简而言之就是wfuzz可以用在做请求参数参数类的模糊测试,也可以用来做Web目录扫描等操作。 github项目: https://github.com/xmendez/wfuzz , 安装Wfuzz pip install wfuzz
字典文本: /usr/share/wfuzz/wordlist
Usage: wfuzz [options] -z payload,params <url>
FUZZ, ..., FUZnZ #payload占位符,wfuzz会用指定的payload代替相应的占位符,n代表数字.
FUZZ{baseline_value} # FUZZ 会被 baseline_value替换,并将此作为测试过程中第一个请求来测试,可用来作为过滤的一个基础。
#参数解释
-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,SOCKS5 or 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=""
-u url : 指定请求的URL
-m iterator : 指定一个处理payloads的迭代器 (默认为product)
-z payload : 为每一个占位符指定一个payload,格式为 name[,parameter][,encoder].编码可以是一个列表,如 md5-sha1还可以串联起来, 如[email protected]还可使用编码各类名如 url;
使用help作为payload来显示payload的详细帮助信息,还可使用--slice进行过滤(替代了下面的--zP参数)
--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 "domain\FUZ2Z: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表达式在测试之前过滤某些测试条目
--slice 参数来过滤帮助返回信息的结果。
复制
核心知识:
FUZZ,FUZ2Z,FUZ3Z,….,FUZnZ
, 其中n代表了占位序号。Wfuzz模块说明 wfuzz是模块化的框架,wfuzz默认自带很多模块,模块分为5种类型分别是:payloads、encoders、iterators、printers和scripts
。
wfuzz [options] -z payload,params <url>
#比如查看payload类中的模块列表
wfuzz -e payloads
# Available payloads:
# Name | Summary
# guitab | This payload reads requests from a tab in the GUI
# dirwalk | Returns filename's recursively from a local directory.
#模块中的说明过滤显示
wfuzz -z help --slice "names"
复制
1.payload为wfuzz生成的用于测试的特定字符串,一般情况下,会替代被测试URL中的FUZZ占位符。
2.的作用是将payload进行编码或加密。
%xx
的方式替换特殊字符, 字母/数字/下划线/半角点/减号不替换 url_safe, url | double urlencode | 用%25xx
的方式替换特殊字符, 字母/数字/下划线/半角点/减号不替换 url | uri_double_hex | 用%25xx
的方式将所有字符进行编码 html | html_escape | 将&
,<
,>
转换为HTML安全的字符 html | html_hexadecimal | 用 x;
的方式替换所有字符 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)
形式3.wfuzz的iterator提供了针对多个payload的处理方式。
4.wfuzz的printers用于控制输出打印。
Raw
output format json | Results in json
format csv | CSV
printer ftw magictree | Prints results in magictree
format html | Prints results in html
format5.wfuzz中的scripts用监测一些常见的存在漏洞的路径
过滤器 描述:wfuzz具有过滤器功能,在做测试的过程中会因为环境的问题需要进行过滤,例如在做目录扫描的时候,你事先探测并知道了这个网站访问不存在目录的时候使用的是自定义404页面(也就是状态码为200),而你可以选择提取该自定义页面的特征来过滤这些返回结果。
wfuzz过滤分为两种方法:隐藏符合过滤条件的结果
和 显示符合过滤条件的结果
标准线 or 及格线
)。内置工具
实际案例: 示例1实际的使用一遍
#地址其中FUZZ单词,这个单词可以理解是一个占位符,
wfuzz -w 字典 https://weiyigeek.cn/FUZZ
wfuzz -w test_dict.txt https:/weiyigeek..cn/FUZZ
#返回结果如下:
==================================================================
ID Response Lines Word Chars Payload
编号、响应状态码、响应报文行数、响应报文字数、响应报文正字符数、测试使用的Payload。
==================================================================
000004: C=404 1 L 121 W 1636 Ch "test123"
复制
示例2第二种方式
#第一条命令中的wordlist表示为字典位置
wfuzz -z file --zP fn=wordlist URL/FUZZ
#第二条命令简写了第一条命令的赋值
wfuzz -z file,wordlist URL/FUZZ
#第三条命令使用-w,这个参数就是-z file --zP fn的别名。
wfuzz -w wordlist URL/FUZZ
复制
示例3例如想要同时爆破目录、文件名、后缀
wfuzz -w 目录字典路径 -w 文件名字典路径 -w 后缀名字典路径 URL/FUZZ/FUZ2Z.FUZ3Z
复制
示例4.隐藏设置响应码的结果
#隐藏404:
wfuzz -w wordlist --hc 404 URL/FUZZ
#隐藏404、403:
wfuzz -w wordlist --hc 404,403 URL/FUZZ
e.g.使用百度举个例子运行wfuzz -w test_dict.txt https://www.baidu.com/FUZZ #这里所有的测试请求,都是不存在的页面
404页面规则就是如上图结果所示:响应报文状态码(302)、响应报文行数(7)、响应报文字数(18)、响应报文字符数(222)
wfuzz -w wordlist --hl 7 https://www.baidu.com/FUZZ
wfuzz -w wordlist --hw 18 https://www.baidu.com/FUZZ
wfuzz -w wordlist --hh 222 https://www.baidu.com/FUZZ
#如果根据单个条件判断相对来说肯定是不精确的,所以整合一下就是这样的命令:
wfuzz -w wordlist --hc 302 --hl 7 --hw 18 --hh 222 https://www.baidu.com/FUZZ
复制
WeiyiGeek.
示例5.基准线(Baseline)的使用
wfuzz -w wordlist --hh BBB https://www.baidu.com/FUZZ{404there}
复制
WeiyiGeek.
代表wfuzz第一个请求是请求https://www.baidu.com/404there这个网址,在{ }内的值用来指定wfuzz第一个请求中的FUZZ占位符,而这第一个请求被标记为BBB(BBB不能换成别的)基准线
;其次这里使用的参数是–hh,也就是以BBB这条请求中的Chars为基准,其他请求的Chars值与BBB相同则隐藏。
示例6.使用正则表达式过滤的使用
#e.g. 在这里一个网站自定义返回页面的内容中包含Not Found,想根据这个内容进行过滤可以使用如下的命令:
wfuzz -w wordlist --hs "Not Found" http://127.0.0.1/FUZZ
#总结
wfuzz -w wordlist --hs 正则表达式 URL/FUZZ #隐藏
wfuzz -w wordlist --ss 正则表达式 URL/FUZZ #显示
复制
示例7.内置工具的使用
#(1) 目前支持内建的encoders的加/解密
wfencode -e base64 123456
#[RES] MTIzNDU2
wfencode -d base64 MTIzNDU2
#[RES] 123456
#(2) wfpayload是payload生成工具
wfpayload -z range,0-10
[RES]
0
1
#(3) wxfuzz 工具
wxPython化的wfuzz也就是GUI图形界面的wfuz
复制
描述: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
复制
实际案例:
#爆破文件:
wfuzz -w wordlist URL/FUZZ.php
#爆破目录:
wfuzz -w wordlist URL/FUZZ
#遍历枚举参数值使用payloads模块类中的range模块进行生成
wfuzz -z range,000-999 http://127.0.0.1/getuser.php?uid=FUZZ #uid参数可以遍历,已知123为三位数纯数字,需要从000-999进行遍历
#POST请求测试,-d参数传输POST请求正文。
wfuzz -w userList -w pwdList -d "username=FUZZ&password=FUZ2Z" http://127.0.0.1/login.php
#Cookie测试越权,b参数指定Cookie多个Cookie需要指定多次,也可以对Cookie进行测试,仍然使用FUZZ占位符即可。
wfuzz -z range,000-999 -b session=session -b cookie=cookie http://127.0.0.1/getuser.php?uid=FUZZ
#HTTP Headers测试伪造XFF头(IP),-H指定HTTP头,多个需要指定多次(同Cookie的-b参数)
wfuzz -z range,0000-9999 -H "X-Forwarded-For: FUZZ" http://127.0.0.1/get.php?userid=666
#测试HTTP请求方法(Method),-X参数是指定HTTP请求方法类型,因为这里要测试HTTP请求方法,后面的值为FUZZ占位符。
wfuzz -z list,"GET-POST-HEAD-PUT" -X FUZZ http://127.0.0.1/
#代理设置与关键字隐藏,多个代理可使用多个-p参数同时指定,wfuzz每次请求都会选取不同的代理进行
wfuzz -w wordlist -p proxtHost:proxyPort:TYPE URL/FUZZ #-p参数指定主机:端口:代理类型
wfuzz -z file,starter.txt -p 192.168.31.26:1080:SOCKS5 --hs "Cannot" https://foo.domain.com/FUZZ
#认证:测试一个需要HTTP Basic Auth保护的内容可使用如下命令:
#wfuzz可以通过--basec --ntml --digest来设置认证头,使用方法都一样:
# --basec/ntml/digest username:password
wfuzz -z list,"username-password" --basic FUZZ:FUZZ URL
#递归测试指定一个payload被递归的深度(数字)。
#例如:爆破目录时,我们想使用相同的payload对已发现的目录进行测试
wfuzz -z list,"admin-login.php-test-dorabox" -R 1 http://127.0.0.1/FUZZ
#并发和间隔,wfuzz提供了一些参数可以用来调节HTTP请求的线程
#使用-t参数设置并发请求,该参数默认设置都是10。
#使用-s参数可以调节每次发送HTTP的时间间隔。
wfuzz -z range,0-20 -t 20 -d "money=1" http://127.0.0.1/dorabox/race_condition/pay.php?FUZZ
#保存测试结果,可以通过printers模块来将结果以不同格式保存到文档中
#使用-f参数,指定值的格式为输出文件位置,输出格式。
$ wfuzz -f outfile,json -w wordlist URL/FUZZ
复制
Iterators-迭代器 BurpSuite的Intruder模块中Attack Type有Sniper(狙击手)、Battering ram(撞击物)、Pitchfork(相交叉)、Cluster bomb(集束炸弹)
~wfuzz的Iterators模块也可以完成这样的功能,将不同的字典的组合起来
使用参数-m 迭代器,wfuzz自带的迭代器有三个:zip、chain、product
,如果不指定迭代器,默认为product迭代器。
一一对应进行组合
,如果字典数不一致则多余的抛弃掉不请求WeiyiGeek.
1.zip命令:
WeiyiGeek.
2.chain命令:
WeiyiGeek.
3.product命令:
Encoders-编码加解密 wfuzz中encoders模块可以实现编码解码、加密,它支持所列转换功能请参考上面的;
正常使用:
#使用Encoders的md5加密。
wfuzz -z file --zP fn=wordlist,encoder=md5 URL/FUZZ
#简写了第一条命令
wfuzz -z file,wordlist,md5 URL/FUZZ
复制
使用多个Encoder:
-
号分隔的列表来指定 wfuzz -z file,dict.txt,md5-base64 http://127.0.0.1/ip.php?FUZZ wfuzz -z list,1-2-3,md5-sha1-none http://webscantest.com/FUZZWeiyiGeek.
Scripts-脚本插件 描述:wfuzz支持插件,其本身也有很多插件,插件大部分都是实现扫描和解析功能,插件共有两大类和一类附加插件:
基础使用
#查看script中robots脚本的帮助信息
wfuzz --script-help=robots #该模块解析robots.txt的并且寻找新的内容
wfuzz --script=robots -z list,"robots.txt" http://127.0.0.1/FUZZ
复制
WeiyiGeek.
script是使用脚本模块的参数,这时候就有个疑惑命令为什么要加上list呢?
因为在这里robots脚本只是解析robots.txt规则的,所以你需要告诉wfuzz去请求哪个文件而这里我写的就是robots.txt就可以解析;
自定义插件:需要放在~/.wfuzz/scripts/目录下,具体如何编写可以参考已有的插件:
技巧-脚本插件
cipes用来保存命令,方便下次执行或者分享给别人。#生成一个recipes: wfuzz --script=robots -z list,“robots.txt” --dumo-recipe outrecipe URL/FUZZ #使用某个recipes: wfuzz --recip outrecipe