记录Fuzzing时使用的工具

Oyst3r 于 2024-10-03 发布

广义上的 Fuzzing 并不是漏洞挖掘中的专属内容,而是 DevSecOps 和 Continous Integration 质量保证中必不可少的一环,甚至可以延伸到完备图灵自动机的美妙梦想。在起初,人们通常以 monkey testing 来指代最原始的 fuzz,就像著名的无限猴子定理一样:让一只猴子在打字机上随机地按键,当按键时间达到无穷时,几乎必然能够打出任何给定的文字。 —摘自 Flanker

安全中很多地方都用到了这项技术,Web、Pwn、AI 等等很多领域,很多安全研究员都通过此技术拿到过不少的 CVE。这里记录一下最基础的 Web 领域,说白了就是批量发数据包,观测响应的状态的一个流程,所以要完美实现这个流程只需要考虑两点:

  1. 高质量的字典

  2. 工具的速度和稳定性

工具推荐两个,一个是 ffuf - Fuzz Faster U Fool,另一个是 Burp 的插件 Turbo Intruder。字典一定要分类,把类别整理出来,那么每一类肯定就是高质量的字典,比如有 Sql、Xss、Spring、Shiro、绕 403 等等这样类别。

ffuf - Fuzz Faster U Fool

ffuf 有很多优点,基于 Go 语言开发,速度极快,并且跨平台,支持颜色区分等等。最重要的是它可操作性比较强,功能可以涵盖目录扫描、DNS 扫描、Payload 测试等等,我们只需要改变 FUZZ 参数的位置+高质量的字典即可。所以用好这一款工具就可以代替比如像 Dirsearch、御剑这种功能比较单一的工具。下面先去写基础使用介绍,然后再写工具在不同场景中的具体应用。

Input Options

输入选项,顾名思义就是要把 Dicts 的每一项加入到 Payload 中进行测试,有下面几种方式:

1.单一 Word Fuzz,也是最简单的 Fuzz

./ffuf -u http://testphp.vulnweb.comFUZZ -w ../../字典/fuzzDicts/directoryDicts/top7000.txt

2.多 Word Fuzz,不止在一个位置上 Fuzz,灵活应用这个功能会有意想不到的效果

./ffuf -u http://testphp.vulnweb.comFUZZ1\?FUZZ2 -w ../../字典/fuzzDicts/apiDict/api.txt:FUZZ1 -w ../../字典/fuzzDicts/paramDict/dir.txt:FUZZ2

3.加 Cookie 扫描,手动去获取登录后网站的 Cookie 字段,然后使用-b参数添加字段即可

./ffuf -u http://testphp.vulnweb.comFUZZ -w ../../字典/fuzzDicts/directoryDicts/top7000.txt -b "Cookie=xxx"

4.递归扫描,这个扫描的时候字典新版本可以/开头,不会扫描失效(可能有的旧版本这里会报错),扫描的时候加这个参数–>-recursion

./ffuf -u http://testphp.vulnweb.comFUZZ -w ../../字典/fuzzDicts/directoryDicts/top7000.txt -recursion

效果就是如果扫描到目录返回是 200,那么就会把目前字典再加载到该目录下重新再次发包,可以看到下面的Job [3/4]

5.POST 扫描,这里只推荐用数据包去扫描,将数据包内容通过 Burp 等工具拦截,再想去 Fuzz 的地方添加好标志位,然后使用如下语句开始进行 Fuzz

ffuf -request request.txt -request-proto http -mode clusterbomb -w ../../字典/fuzzDicts/directoryDicts/top7000.txt -recursion

分析一下其中的参数:

-mode 爆破模块,目前有 clusterbomb、 pitchfork 两个模式具体,类似 burpsuite 的爆破模块

-request 用于指定与原始 HTTP 请求文件

-request-proto 与原始请求一起使用的协议(默认值:https)

6.静默扫描&指定后缀扫描,这两个都没什么就一笔带过了,静默扫描就是不会显示过程只会显示最后的结果,参数是-s,指定后缀扫描意思就是在字典的每一个字段里面去加上所指示的后缀再去重发包,参数是-e .php,.zip

Match Options & Filter Options

Match Options 是对返回结果做匹配,快速筛选出我们输入的结果,而 Filter Options 刚好相反,是去过滤掉我们输入的结果。两者很类似,所以放一块了。

1.匹配状态码 & 过滤状态码

./ffuf -u http://testphp.vulnweb.comFUZZ -w ../../字典/fuzzDicts/directoryDicts/top7000.txt -mc 200,403

过滤状态码将-mc变成-fc

2.匹配响应包行数 & 过滤响应包行数

./ffuf -u http://testphp.vulnweb.comFUZZ -w ../../字典/fuzzDicts/directoryDicts/top7000.txt -ml 10

过滤响应包行数将-ml变成-fl

3.匹配大小 & 过滤大小

./ffuf -u http://testphp.vulnweb.comFUZZ -w ../../字典/fuzzDicts/directoryDicts/top7000.txt -ms 177

过滤大小将-ms变成-fs

4.匹配正则 & 过滤正则

./ffuf -u http://testphp.vulnweb.comFUZZ -w ../../字典/fuzzDicts/directoryDicts/top7000.txt -mr "^\d{5,12}$"

过滤正则将-mr变成-fr

General Options

这一块就是比较杂的一些小参数,让更好的调配 Fuzz 的效果,很容易理解不做过多解释

  1. 颜色输出-c

  2. 设置线程-t 50

  3. 任务最大时间-maxtime 180

  4. 跟随重定-r

  5. 请求延时-p 0.5

  6. 测试详情-v

  7. 代理-x http://127.0.0.1:7897

Output Options

这里一般就用 Html 去输出,很直观,参数是-of html

Application Scenarios

下面来看看它有哪些使用场景

1.如果我们想对子域进行模糊处理,我们可以在命令中使用[-H]参数和子域名字典

./ffuf -u http://google.com -w /Users/Oyst3r/Penetration/字典/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -H "HOST: FUZZ.google.com"

2.随机 User-Agent,现在这个应该不是问题,发一个 POST 包即可,参数在上面也给出过了

3.Fuzz 参数,假设发送无效参数返回的响应大小为 4242 字节,Like this –>

./ffuf -w ../../字典/fuzzDicts/paramDict/dir.txt -u https://target/script.php?FUZZ=test_value -fs 4242

4.等等等

Turbo Intruder

这个是被 Burp 官方收录的插件,官方使用指南在这里–>点我!点我!