Wfuzz初上手### Wfuzz是啥玩意?wfuzz 是一款Python开发的Web安全模糊测试工具。https://github.com/xmendez/wfuzz

简单粗暴的功能特点记录:

  • 模块化 框架 可编写插件

  • 接口 可处理BurpSuite所抓的请求和响应报文

简而言之就是wfuzz可以用在做请求参数参数类的模糊测试,也可以用来做Web目录扫描等操作。

Wfuzz初体验

  • 安装Wfuzz pip install wfuzz

简单的使用>

wfuzz -w 字典 地址(e.g. https://gh0st.cn/FUZZ)

如上命令使用-w参数指定字典位置,然后跟上一个要测试的地址,所列的例子https://gh0st.cn/FUZZ中有一个FUZZ单词,这个单词可以理解是一个占位符,这样就大概了解了wfuzz的基本运行原理,它会读取字典然后传入占位符进行模糊测试请求。

实际的使用一遍:

返回结果如下:

通过返回结果我们可以知道很多信息,最需要关注的就是ID、Response、 Lines、Word、Chars、Payload这一行,从左往右看,依次是编号、响应状态码、响应报文行数、响应报文字数、响应报文正字符数、测试使用的Payload

了解Wfuzz通过-h或者--help可以来获取帮助信息。

Wfuzz模块如上所述说到wfuzz是模块化的框架,wfuzz默认自带很多模块,模块分为5种类型分别是:payloadsencodersiteratorsprintersscripts

通过-e参数可以查看指定模块类型中的模块列表:

payloads类的模块列表如下:

Wfuzz使用从上文知道了wfuzz基于一个非常简单的概念:使用payload来替换相应的FUZZ关键词的位置,FUZZ这样的关键词就是占位符,payload就是输入源。

通过wfuzz -e payloads可以获取payloads类的所有模块列表,使用wfuzz -z help可以获取关于payloads类模块的详细信息,也可以通过--slice参数来过滤返回信息的结果。

e.g. wfuzz -z help --slice "names"

使用(字典)注:命令中的wordlist表示为字典位置
  • wfuzz -z file --zP fn=wordlist URL/FUZZ

  • wfuzz -z file,wordlist URL/FUZZ

  • wfuzz -w wordlist URL/FUZZ

这里有必要说明下,使用命令意义是一样的,都是使用payloads模块类中的file模块,通过wfuzz -z help --slice "file"看如何使用file模块:

通过返回的帮助信息,我们知道这个模块需要一个参数fn,这个参数值为字典文件名(绝对路径)。这样子第一条命令一下子就明白了,wfuzz -z file --zP fn=wordlist URL/FUZZ中的-z file使用模块,--zP fn=wordlist是定义fn参数的值(可以这样理解,–zP 这里的P大写代表 Parameters ,然后其他的都是固有个事)

第二条命令简写了第一条命令的赋值,第三条命令使用-w,这个参数就是-z file --zP fn的别名。

多个字典

使用-z-w 参数可以同时指定多个字典,这时相应的占位符应设置为 FUZZ,FUZ2Z,FUZ3Z,….,FUZnZ, 其中n代表了占位序号。

例如想要同时爆破目录、文件名、后缀,可以这样来玩:

wfuzz -w 目录字典路径 -w 文件名字典路径 -w 后缀名字典路径 URL/FUZZ/FUZ2Z.FUZ3Z

过滤器wfuzz具有过滤器功能,在做测试的过程中会因为环境的问题需要进行过滤,例如在做目录扫描的时候,你事先探测并知道了这个网站访问不存在目录的时候使用的是自定义404页面(也就是状态码为200),而你可以选择提取该自定义页面的特征来过滤这些返回结果。

wfuzz过滤分为两种方法:隐藏符合过滤条件的结果显示符合过滤条件的结果

隐藏响应结果

通过--hc--hl--hw--hh参数可以隐藏某些HTTP响应。

  • --hc 根据响应报文状态码进行隐藏(hide code)

隐藏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),那么下面的就是填空题了~

  • --hl根据响应报文行数进行隐藏(hide lines)

wfuzz -w wordlist --hl 7 https://www.baidu.com/FUZZ

  • --hw根据响应报文字数进行隐藏(hide word)

wfuzz -w wordlist --hw 18 https://www.baidu.com/FUZZ

  • --hh根据响应报文字符数进行隐藏(hide chars 这里因为code和chars首字母都是c,–hc参数已经有了,所以hide chars的参数就变成了–hh)

wfuzz -w wordlist --hh 222 https://www.baidu.com/FUZZ

如果根据单个条件判断相对来说肯定是不精确的,所以整合一下就是这样的命令:

这样就可以对https://www.baidu.com/进行目录扫描咯~

显示响应结果

显示响应结果的使用方法跟隐藏时的原理一样,只不过参数变为了:--sc(show code),--sl(show lines),--sw(show word),--sh (show chars)。

使用Baseline(基准线)

过滤器可以是某个HTTP响应的引用,这样的引用我们称为Baseline。

之前的使用--hh进行过滤的例子中,还可以使用下面的命令代替:

这条命令的意思应该很容易理解,首先要清楚基准线是什么?换个名字:标准线 or 及格线。

首先解释下https://www.baidu.com/FUZZ{404there}的意思,这里代表wfuzz第一个请求是请求https://www.baidu.com/404there这个网址,在{ }内的值用来指定wfuzz第一个请求中的FUZZ占位符,而这第一个请求被标记为BBB(BBB不能换成别的)基准线;其次这里使用的参数是--hh也就是以BBB这条请求中的Chars为基准,其他请求的Chars值与BBB相同则隐藏

使用正则表达式过滤

wfuzz参数--ss--hs可以使用正则表达式来对返回的结果过滤。

e.g. 在这里一个网站自定义返回页面的内容中包含Not Found,想根据这个内容进行过滤可以使用如下的命令:

得出结论使用方法:

手册原文来自:DigApis安全 m0nst3r

模块种类##### payloadpayload为wfuzz生成的用于测试的特定字符串,一般情况下,会替代被测试URL中的FUZZ占位符。

当前版本中的wfuzz中可用payloads列表如下:

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

wfuzz的encoder列表如下:

iteratorwfuzz的iterator提供了针对多个payload的处理方式。

itorators的列表如下:

printerwfuzz的printers用于控制输出打印。

printers列表如下:

scriptsscripts列表如下:

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


wfpayload工具wfpayload是payload生成工具
wxfuzz 工具这个看源码是一个wxPython化的wfuzz,也就是GUI图形界面的wfuzz。目前需要wxPython最新版本才能使用,但是在ParrotOS和Kali上都无法正常安装成功,问题已在GitHub提交Issue,期待开发者的回复中…

wfuzz命令中文帮助


ps:本文转自key师傅的博客 –>原文