目录导航
介绍
已经开发了许多创建 HTTP 请求并允许用户修改其内容的工具。模糊测试的工作方式相同。用户可以多次向服务器发送类似的请求,但请求的某个部分已更改。当某个部分被列表或目录中的变量替换时,它被称为模糊测试。
在本文中,我们将学习如何使用 wfuzz,它表示“Web Application Fuzzer”,这是一个有趣的开源 Web 模糊测试工具。自发布以来,许多人都被 wfuzz 所吸引,尤其是在 bug 赏金方案中。那么,让我们深入了解这个学习过程。
Wfuzz 简介
Wfuzz 是一个 Python 编码的应用程序,用于模糊测试 Web 应用程序。它提供了各种过滤器,通过将简单的 Web 请求替换为变量“FUZZ”,可以将其替换为所需的字典列表。
设置
要使用 pip 安装 wfuzz,我们可以使用如下命令:
pip3 install wfuzz
同样可以通过使用 git 从源代码来实现安装。
git clone https://github.com/xmendez/wfuzz.git
查看所有工作选项的帮助菜单如下:
wfuzz -h
wfuzz --help
您可以使用“-z”来使用模块
Wfpayload 和 Wfencode
当您从源代码安装该工具时,可以使用名为 wfpayload 和 wfencode 的已编译可执行文件。这些负责有效载荷的生成和编码。它们可以单独使用。例如,生成 0 到 15 的数字的命令如下:
./wfpayload -z range,0-15
如您所见,存在 pycurl 错误。它可以像这样让错误消失:
apt --purge remove python3-pycurl && apt install libcurl4-openssl-dev libssl-dev
现在,当您运行 wfencode(一个使用哈希算法对提供的输入进行编码的模块)时,现在没有 pycurl 错误。
./wfencode -e md5 ignite
Docker 运行 wfuzz
Wfuzz 也可以使用 repo ghcr.io 通过以下方式使用 docker 启动。可以通过替换最后一个变量 wfuzz 来运行相应的命令。
docker run -v $(pwd)/wordlist:/wordlist/ -it ghcr.io/xmendez/wfuzz wfuzz
有效载荷
Wfuzz 中的有效负载是输入数据的来源。可以通过执行以下命令列出可用的有效负载:
wfuzz -e payloads
也可以使用切片过滤器查看详细视图:
wfuzz -z help --slice "list"
子域模糊测试
子域发现在渗透测试场景中非常有用。通常,攻击者对子域而不是主域发起攻击,它可以像这样被模糊测试:
在这里,-c 对输出响应代码进行颜色编码
-Z 指定要在扫描模式下输入的 URL,并忽略任何连接错误
-w 指定在子域暴力破解时使用的密码字典列表。
wfuzz -c -Z -w subdomains.txt http://FUZZ.vulnweb.com
同样可以通过提供内联子域列表来实现。只有有效载荷(-z 选项)应与“list”一起提供作为输入。该列表以 ITEM1-ITEM2-ITEM3 格式提供,如下所示:
wfuzz -z list,CVS-testphp-admin-svn http://testphp.vulnweb.com/FUZZ
wfuzz -z list,CVS-testphp-admin-svn http://FUZZ.vulnweb.com/
目录模糊测试
可以使用 wfuzz 枚举目录,就像使用提供的 wordlist 使用 gobuster 一样。这可以使用 -w 标志并输入密码字典列表的路径来完成:
wfuzz -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ
正如您在上面的屏幕截图中看到的那样,所有结果(包括未找到的页面)都已被转储,这使得通过结果和大海捞针变得乏味。因此,为了整理结果,我们可以看到显示代码标志 (-sc)。其他此类标志是:
- –hc/sc CODE #隐藏/显示响应代码
- –hl/sl NUM #ide/按响应行数显示
- –hw/sw NUM #ide/按响应的字数显示
- –hc/sc NUM #ide/按响应的字符数显示
wfuzz -w wordlist/general/common.txt --sc 200,301 http://testphp.vulnweb.com/FUZZ
保存模糊测试输出结果
Wfuzz 输出也可以使用 -f 选项以多种格式保存。
-f 选项允许用户输入文件路径并在逗号后指定打印(格式化输出)。
wfuzz -w wordlist/general/common.txt -f /tmp/output,csv --sc 200,301 http://testphp.vulnweb.com/FUZZ
cat /tmp/output
代替 csv,您可以指定任何一种输出结果
wfuzz -e printers
基本密码字典列表过滤器
某些子参数可以在 -z 或 -w 过滤器之前进行更多操作。这些过滤器是:
–zP <params>:指定有效负载的参数
-zD <default>:指定payload的默认参数
–zE <encoder>:指定有效载荷的编码器
因此,要使用有效负载指定一个密码字典,我们可以这样做:
wfuzz -z file --zD wordlist/general/common.txt --sc 200,301 http://testphp.vulnweb.com/FUZZ
要隐藏 HTTP 响应代码 404,可以像这样获得相同的结果:
wfuzz -z file --zD wordlist/general/common.txt --hc 404 http://testphp.vulnweb.com/FUZZ
双重模糊测试
就像可以使用关键字“FUZZ”对有效载荷中的参数进行模糊测试一样,也可以通过指定关键字进行多次模糊测试:
- FUZ2Z – 第二个参数
- FUZ3Z – 第三个参数
- FUZ4Z – 第 4 个参数
并且可以为每个参数分配自己的密码字典。第一个“-w”代表第一个 FUZZ。第二个“-w”适用于第二个 FUZ2Z,依此类推。
wfuzz -w wordlist/general/common.txt -w wordlist/general/common.txt --hc 404 http://testphp.vulnweb.com/FUZZ/FUZ2Z
登录蛮力破解
HTTP 响应可以使用 wfuzz 进行暴力破解。例如,testphp 的网站向后端发出 POST 请求,并将“uname”和“pass”作为参数传递给页面 userinfo.php
同样可以使用 wfuzz 来实现,如下所示:
-d 参数指定要与请求一起发送的 post 数据
wfuzz -z file,wordlist/others/common_pass.txt -d "uname=FUZZ&pass=FUZZ" --hc 302 http://testphp.vulnweb.com/userinfo.php
如您所见,已找到正确的凭据“test-test”。我们为用户名和密码使用了一个通用文件。同样可以通过为用户名和密码提供不同的文件来完成,如下所示:
-c 是对可以跳过的输出响应进行颜色编码。
wfuzz -z file,users.txt -z file,pass.txt --sc 200 -d "uname=FUZZ&pass=FUZ2Z" http://testphp.vulnweb.com/userinfo.php
Cookie 模糊测试
要将自定义 cookie 与请求一起发送到不同的模糊目录,我们可以使用“-b”插件。这会在发送的 HTTP 请求中添加一个 cookie。
以下场景有用:
- cookie中毒
- 会话劫持
- 权限提升
wfuzz -z file,wordlist/general/common.txt -b cookie=secureadmin -b cookie2=value2 --hc 404 http://testphp.vulnweb.com/FUZZ
在上述场景中,我们在多个目录中添加了 2 个静态 cookie。现在,我们也可以像这样对 cookie 参数进行模糊测试:
wfuzz -z file,wordlist/general/common.txt -b cookie=FUZZ http://testphp.vulnweb.com/
标头模糊测试
可以在 wfuzz 发出的请求中添加 HTTP 标头。HTTP 标头可以改变整个网页的行为。自定义标头可以在传出请求中进行模糊测试或注入
有用的场景:
- HTTP 标头注入
- SQL 注入
- 主机头注入
wfuzz -z file,wordlist/general/common.txt -H "X-Forwarded-By: 127.0.0.1" -H "User-Agent: Firefox" http://testphp.vulnweb.com/FUZZ
HTTP OPTIONS 模糊测试
可以使用“-X”标志指定各种可用的 HTTP 请求/选项方法。在以下示例中,我们在名为 options.txt 的文本文件中插入了以下选项
- GET
- HEAD
- POST
- PUT
- DELETE
- CONNECT
- OPTIONS
- TRACE
- PATCH
wfuzz -c -w options.txt --sc 200 -X FUZZ “http://testphp.vulnweb.com”
如您所见,三个有效选项返回了 200 响应代码。
可以使用“list”有效负载内联输入相同的内容,如下所示:
wfuzz -z list,GET-HEAD-POST-TRACE-OPTIONS -X FUZZ http://testphp.vulnweb.com/
通过代理进行模糊测试
Wfuzz 还可以通过代理路由请求。在以下示例中,Burp 代理在端口 8080 上处于活动状态,并且您可以看到在 burp 拦截中拦截的请求。
wfuzz -z file,wordlist/general/common.txt -p localhost:8080 http://testphp.vulnweb.com/FUZZ
使用 SOCKS 代理也可以实现相同的功能,如下所示:
wfuzz -z file,wordlist/general/common.txt -p localhost:9500:SOCKS5 http://testphp.vulnweb.com/FUZZ
身份验证模糊
Wfuzz 还可以设置身份验证标头并提供通过 HTTP 请求进行身份验证的方法。
标志:
- –basic:提供基本的用户名和密码验证
- –ntlm:Windows 身份验证
- –digest:通过摘要访问进行网络服务器协商
在下面的示例中,我提供了一个内联的列表,其中包含两个变量和 -basic 输入以暴力破解网站 httpwatch.com
wfuzz -z list,nonvalid-httpwatch --basic FUZZ:FUZZ https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx
递归模糊
-R 开关可以在模糊测试目录或参数时指定递归级别。简单来说,递归意味着在多个不同级别的目录上进行模糊测试,例如 /dir/dir/dir 等
在下面的例子中,我们在第 1 层递归,内联列表包含 3 个目录:admin、CVS 和 cgi-bin。请注意如何以内联方式提供名称中带有 – 的目录
wfuzz -z list,"admin-CVS-cgi\-bin" -R1 http://testphp.vulnweb.com/FUZZ
打印和输出
wfuzz 中的打印是指可以处理有效负载输出的所有格式。可以使用 -e 通过打印参数成功查看。此外,“-o”标志也可以指定输出的格式
wfuzz -e printers
wfuzz -o json -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ
编码器
wfuzz 中提供了各种编码器。我们之前看到的一种这样的编码器是 md5。其他编码器可以通过使用带有编码器参数的“-e”标志来查看。
wfuzz -e encoders
可以使用 MD5 输出来模糊测试网站的目录,如下所示:
wfuzz -z file,wordlist/general/common.txt,md5 http://testphp.vulnweb.com/FUZZ
从配方中存储和恢复fuzz
为了简化扫描,wfuzz 可以使用“–dump-recipe”和“–recipe”标志保存和恢复会话。
wfuzz -w wordlist/general/common.txt --dump-recipe /tmp/recipe --sc 200,301 http://testphp.vulnweb.com/FUZZ
wfuzz --recipe /tmp/recipe
忽略异常和错误
通常在进行模糊测试时,网站可能会抛出各种错误和异常。“-Z”选项可以让wfuzz忽略这些错误和异常。首先,我们运行一个普通的子域模糊测试程序,然后使用 -Z 选项:
wfuzz -z list,support-web-none http://FUZZ.google.com/
wfuzz -z list,support-web-none -Z http://FUZZ.google.com/
如您所见, -Z 忽略了底部的错误。此外,任何无效响应也可以像这样隐藏:
wfuzz -z list,support-web-none -Z --hc “XXX” http://FUZZ.google.com/
过滤结果
有许多过滤器可用于操作有效负载或输出。
wfuzz --filter-help
这些可以使用“–filter、–slice、–field 和–efield”参数进行操作。
例如,要查看发送的有效负载的原始响应和发出的完整 HTTP 请求,您可以使用“–efield r”选项
wfuzz -z range --zD 0-1 -u http://testphp.vulnweb.com/artists.php?artist=FUZZ --efield r
但是,如果只需要预期的 URL,可以通过提供 –efield url 输入来实现。
wfuzz -z range --zD 0-1 -u http://testphp.vulnweb.com/artists.php?artist=FUZZ --efield url --efield h
同样,要根据响应代码和页面长度(大于 97 行)过滤掉结果,您可以这样做
wfuzz -z range,0-10 --filter "c=200 and l>97" http://testphp.vulnweb.com/listproducts.php?cat=FUZZ
可以在此处找到有效负载的所有过滤器的详细表格。
wfuzz 中的会话
wfuzz 中的会话是一个临时文件,可以保存并在以后拾取、重新处理和后处理。这在保存的一个结果已经需要更改或分析人员需要在结果中查找某些内容的情况下很有帮助。“-oF”过滤器可以将会话输出保存到文件中。
wfuzz --oF /tmp/session -z range,0-10 http://testphp.vulnweb.com/listproducts.php?cat=FUZZ
现在可以使用“wfuzzp”有效负载再次打开并使用此会话文件,如下所示:
wfuzz -z wfuzzp,/tmp/session FUZZ
从先前保存的会话中过滤的一个这样的示例如下所示,其中我们通过使用 Python 正则表达式来发现 SQL 注入漏洞,该 Python 正则表达式旨在通过添加撇号 (‘) 并再次进行模糊测试来在请求修改参数后读取响应。“-A”显示详细输出。
正则表达式 r.params.get=+’\’ 在 get 参数中添加撇号 (‘)。r 代表原始响应。
wfuzz -z range,1-5 --oF /tmp/session http://testphp.vulnweb.com/artists.php?artist=FUZZ
wfuzz -z wfuzzp,/tmp/session --prefilter "r.params.get=+'\''" -A FUZZ
如您所见,请求号 4 引发 SQL 错误,表明 SQL 注入。有关更多正则表达式操作,请参阅此处。
结论
Wfuzz 是一个多功能工具,它不仅可以执行目录枚举,还可以真正帮助渗透测试者进行分析。它是一种快速扫描仪,易于使用,并以 python 编码以实现可移植性。希望你喜欢这篇文章。谢谢阅读。
更多关于wfuzz的知识可参考如下链接:
转载请注明出处及链接
讲的很细,这款工具和ffuf工具,在目录fuzz方面很强大,感觉市面上很多五花八门的工具,但是wfuzz在调用线程方面总能把我卡死,或者说爆破速度有点快吧😂