ffuf使用介绍
FFUF进阶使用指南
前言
虽然很多人都熟悉使用 ffuf的基本使用,但真正了解的人却寥寥无几。本文介绍了ffuf的更多使用方法,旨在提升你的ffuf使用水平,从而帮助你发现那些别人可能会忽略的漏洞。
文末付上ffuf使用笔记在线网站
为什么要用 ffuf?
ffuf 是一款功能强大、高效的fuzz工具,可以对参数、目录、子域等进行暴力破解。它的速度和灵活性使其成为很多人最喜欢使用的fuzz工具之一。
自定义字典和递归测试:
- 问题:普通字典经常会遗漏一些东西或目录。
- 解决方案:使用针对目标环境定制的字典。将其与fuzz相结合,爆破嵌套的目录。例如
1 | ffuf -w /path/to/custom-wordlist.txt -u https://target.com/FUZZ -recursion -recursion-depth 3 -e .php,.asp,.html |
- 可以使用 Cewl (自动字典生成,kali自带)等工具或通过分析目标网站的独特关键词、目录名称和文件扩展名来生成自定义字典。
处理其他 HTTP 方法:
- 问题:大多数人只使用 GET 和 POST 方法进行测试,而忽略了其他 HTTP 方法中的潜在漏洞。
- 解决方案:ffuf 可以对可能暴露敏感功能的不常用 HTTP 方法(如 PUT、DELETE、PATCH)进行处理。
1 | ffuf -w /path/to/wordlist.txt -X PUT -u https://target.com/FUZZ -b 'session=abcdef' |
- 使用 TRACE、OPTIONS 和 CONNECT 等方法,查找潜在的错误配置或者功能
利用基于参数的漏洞:
- 问题:传统的处理方法经常会漏掉基于参数的漏洞,尤其是在复杂的测试环境中。
- 解决方案:利用 ffuf 同时测试多个参数。
1 | ffuf -w params.txt:PARAM -u https://target.com/page?PARAM=value |
- 将 ffuf 与 ParamSpider 或 Arjun 等工具结合使用,可发现隐藏参数并创建有效的测试策略。
使用 ffuf 的 DNS 模式爆破子域:
- 问题:子域枚举通常仅限于常用工具,遗漏了一些子域。
- 解决方案:ffuf 的 DNS 模式允许枚举子域,从而发现容易被遗漏的子域。
1 | ffuf -w /path/to/subdomains.txt -u https://FUZZ.target.com -H "Host: FUZZ.target.com" |
- 使用将常用子域与潜在通配符或排列组合相结合的字典,以发现更多子域。
利用 Burp 进行复杂fuzz:
- 问题:有些目标需要复杂的身份验证,或受到 WAF 的保护。
- 解决方案:将 ffuf 与 Burp Suite 集成,用于高级测试场景,利用 Burp 的强大功能绕过 WAF 并处理会话。
- 使用 Burp 的 Collaborator 或 Intruder 捕捉和重放会话,通过 ffuf 发送这些请求,以进行精确fuzz。
- 将 ffuf 与 Burp 的宏功能相结合,可处理复杂的多步骤身份验证流程,确保即使在受保护的环境中也能有效进行fuzz。
API 和 WebSockets:
- 问题:API 和 WebSockets 需要专门的fuzz,而许多人都没有做。
- 解决方案:通过制作包含必要header、令牌和 JSON 主体的自定义请求,为 API 端点调整 ffuf。
1 | ffuf -w /path/to/wordlist.txt -X POST -d '{"param":"FUZZ"}' -H 'Content-Type: application/json' -u https://api.target.com/endpoint |
🛠️ ffuf 高级手册 🛠️
HTTP 选项:
自定义Header:
-H "Custom-Header:FUZZ"
- 对自定义标头进行测试处理,以发现隐藏功能。- 例如
ffuf -w headers.txt -u https://target.com/ -H "X-Custom-Header: FUZZ"
身份验证:
-cc
和-ck
-使用客户端证书和密钥在安全端点后面进行测试处理。- 例如
ffuf -w wordlist.txt -u https://securetarget.com/FUZZ -cc client.crt -ck client.key
HTTP 方法fuzz
- -
X FUZZ
- 测试不常见的 HTTP 方法,如 PUT、DELETE 等。 - 例如
ffuf -w methods.txt -X FUZZ -u [https://target.com/resource](https://target.com/resource)
递归fuzz
-recursion
- 在目录内自动递归测试。-recursion-depth
- 控制递归深度,避免过多层级。- 例如
ffuf -w dirs.txt -u https://target.com/FUZZ -recursion -recursion-depth 3
超时调整:
-timeout 30
- 增加反应慢的目标的超时。- 例如
ffuf -w wordlist.txt -u https://slowtarget.com/FUZZ -timeout 30
代理和重放:
代理:
http代理
ffuf -x http://127.0.0.1:8080 -w wordlist.txt -u https://host.name/FUZZ
socks代理
ffuf -x socks5://127.0.0.1:1080 -w wordlist.txt -u https://host.name/FUZZ
重放代理:
-replay-proxy http://127.0.0.1:8080
- 通过代理重放匹配的请求。- 例如
ffuf -w wordlist.txt -u https://target.com/FUZZ -replay-proxy [http://127.0.0.1:8080](http://127.0.0.1:8080/)
与 Burp 集成:
-x http://127.0.0.1:8080
- 通过 Burp Suite 发送请求以进行被动fuzz。- 例如
ffuf -w wordlist.txt -u https://target.com/FUZZ -x [http://127.0.0.1:8080]
API Fuzzing & WebSockets:
测试 API 接口
-H "Content-Type: application/json"
- 测试基于 JSON 的 API 接口。- 例如
ffuf -w params.txt -u https://api.target.com/endpoint -X POST -d '{"key":"FUZZ"}'
WebSocket Fuzzing
- 与 Burp Suite 集成的示例:在 Burp 中捕获 WebSocket 流量并通过 ffuf 重放。
性能调整:
提高效率:
-t 100
- 增加并发线程数。-rate 1000
- 控制每秒请求的速度。- 例如
ffuf -w wordlist.txt -u https://target.com/FUZZ -t 100 -rate 1000
规避限速
-p 0.1-2.0
- 引入随机延迟,以避免速度限制。- 例如
ffuf -w wordlist.txt -u https://target.com/FUZZ -p 0.5-1.5
与其他工具联动:
与 Nuclei 联动:
- 将 ffuf 与 Nuclei 联动,在fuzz过程中扫描漏洞。
- 例如
ffuf -w wordlist.txt -u https://target.com/FUZZ -of json | nuclei -t nuclei-templates/
与 HTTPx 联动:
- 在进行测试前,使用 HTTPx 过滤存活主机。
- 例如
httpx -silent -l targets.txt | ffuf -w wordlist.txt -u [https://FUZZ/](https://fuzz/)
将 ffuf 与 Nmap 结合使用:
另一个强大的组合是将 ffuf 与 nmap 结合使用。例如,你可以使用 nmap 扫描开放端口,然后使用 ffuf 对发现的 HTTP 服务进行测试处理:
1 | nmap -p- -oG open_ports.txt 192.168.1.1 |
多个字典:
ffuf 可以使用多个字典同时测试 URL 或数据字段的多个部分。你不仅可以测试 URL 路径,还可以测试参数或查询字符串。在测试需要多个变量的 API 或端点时,该功能非常有用。
在ffuf
中使用多个字典进行fuzz是一种强大的技术,可用于测试网络应用程序的不同部分。在ffuf
中,有三种主要模式可用于处理多个字典:clusterbomb、pitchfork和sniper。每种模式都有不同的用途,具体取决于你在fuzz过程中如何组合字典。
下面举例说明如何使用每种模式:
clusterbomb模式
集束炸弹
clusterbomb模式会尝试多个字典中每种值的组合。当你需要测试输入参数的所有可能组合,比如同时尝试不同的用户名和密码。
例如:
1 | ffuf -w users.txt:USER -w passwords.txt:PASS -u https://example.com/login?username=USER&password=PASS --mode clusterbomb |
在此模式下,ffuf
会尝试用户名和密码的所有可能组合,确保涵盖所有配对。适用于爆破账号密码或同时测试多个字段。
你可以对 JSON 请求的多个部分进行测试处理:
1 | ffuf -w usernames.txt:U -w passwords.txt:P -X POST -d '{"username":"U","password":"P"}' -H 'Content-Type: application/json' -u https://example.com/api/login |
或者对目录名和文件名都进行测试处理,从而增加发现嵌套路径中隐藏路径的机会:
1 | ffuf -w dirs.txt:DIR -w files.txt:FILE -u https://example.com/DIR/FILE |
Pitchfork模式
一一对应映射
Pitchfork模式以一对一的映射方式同时处理每个字典。它从第一个字典中提取第一个项目,从第二个字典中提取第一个项目,然后将它们配对在一起。这种模式非常适合测试匹配的输入对,例如用户名-密码对。
例如:
1 | ffuf -w users.txt:USER -w passwords.txt:PASS -u https://example.com/login?username=USER&password=PASS --mode pitchfork |
在这里,ffuf
会从users.txt
列表中获取第一个用户名,从passwords.txt
列表中获取第一个密码,然后一起发送。然后,它将从每个列表中提取第二个项目,依此类推,因此当参数需要按顺序匹配时,这种模式非常有用。
Sniper模式
单个狙击
Sniper模式用于使用单个字典一次测试一个参数,而其他参数保持不变。该模式非常适合用于发现不同输入对请求特定部分的影响。
例如:
1 | ffuf -w payloads.txt -u https://example.com/search?query=FUZZ&staticparam=value --mode sniper |
在这种情况下,ffuf
将使用payloads.txt
字典只测试查询
参数,而保持staticparam=value
不变。Sniper模式适用于一次只针对一个输入字段或参数的集中fuzz。
主要区别
clusterbomb
:测试多个字典的所有组合Pitchfork
:将多个字典中匹配的项目配对。Sniper
:每次使用单个字典测试一个参数,其他参数保持不变。
这些模式你可以自行灵活使用。
匹配返回特征:
下面是一些使用 ffuf 匹配返回特征选项的示例:
匹配状态码
ffuf 匹配器
的一个基本用法是使用-mc
查找具有特定状态代码的响应。例如,如果要查找返回200
状态代码的页面,可以使用
1 | ffuf -u https://example.com/FUZZ -w wordlist.txt -mc 200 |
这只会显示状态代码为 200 的响应,过滤掉所有其他响应。
匹配响应大小
如果要根据响应的大小进行匹配,使用-ms
。例如你的目标响应大小正好是 1000 字节:
1 | ffuf -u https://example.com/FUZZ -w wordlist.txt -ms 1000 |
你还可以匹配一个范围内的内容长度:
1 | ffuf -u https://example.com/FUZZ -w wordlist.txt -ms 900-1100 |
该命令将匹配 900 至 1100 字节的响应。
字数匹配
你可以使用-mw
根据正文中的字数过滤回包。例如,如果你要查找字数正好为 50 的回包:
1 | ffuf -u https://example.com/FUZZ -w wordlist.txt -mw 50 |
按响应行匹配
根据回包的行数进行匹配。使用-ml
选项可根据行数过滤回包。例如,如果你要查找行数正好为 10 行的回包:
1 | ffuf -u https://example.com/FUZZ -w wordlist.txt -ml 10 |
通过这些匹配器选项,你可以对fuzz进行微调,以过滤掉不相关的结果,并专注于特定的响应模式。
Regex 匹配
有时,仅根据状态代码或大小进行过滤是不够的。ffuf 提供了 regex 匹配功能,让你只需要关注包含特定内容的响应。
1 | ffuf -w /path/to/wordlist.txt -u https://example.com/FUZZ -mr "success|welcome" |
此命令显示内容包含 “success “或 “welcome “的响应。当某些关键字典示有效或有漏洞的页面时,Regex 匹配就很有用了。
要匹配包含/\...*/
等模式的响应(可识别隐藏文件或目录),可以使用
1 | ffuf -u https://example.com/FUZZ -w wordlist.txt -mr '/\..*/' |
此命令将搜索包含句号和任意字符的响应。
速度限制:
如果你正在对带有访问速度限制或时间限制的网络应用程序进行fuzz,那么 ffuf 的超时和速度限制选项可以帮助你管理请求而不被阻止。
1 | ffuf -w /path/to/wordlist.txt -u https://example.com/FUZZ -rate 50 -timeout 5 |
在这种情况下,ffuf 将每秒最多发送 50 个请求,并最多等待 5 秒以获得响应。这对于规避有访问速度限制的目标的安全保护特别有用。
延迟
ffuf 可以调整发送请求的速度,以避免触发速度限制:
1 | ffuf -w wordlist.txt -u https://example.com/FUZZ -t 2 -p 1 |
该命令将线程数 (-t) 设置为 2,并在请求之间引入 1 秒的延迟 (-p)。这样可以减少被防护的几率。
对 POST 请求进行fuzz:
例如,测试登录表单中的用户名值:
1 | ffuf -w usernames.txt -u https://example.com/login -X POST -d "username=FUZZ&password=admin" |
该命令测试不同的用户名,同时保持密码不变,类似内网渗透中的密码喷洒,很有用。
测试 JSON POST 数据
如果目标使用基于 JSON 的 API,你可以在payload中加入 FUZZ 关键字,对 JSON 数据进行测试:
1 | ffuf -X POST -H "Content-Type: application/json" -d '{"username": "admin", "password": "FUZZ"}' -w /path/to/wordlist.txt -u http://example.com/api/login |
该命令向指定 URL 发送 JSON 格式的 POST 请求,用单字典中的每个值替换 FUZZ。
这个例子使用鉴权参数值对接口进行fuzz:
1 | ffuf -w tokens.txt -H "Authorization: Bearer FUZZ" -u https://example.com/api/resource |
这将对不同的鉴权参数进行fuzz。
另一个例子——用于识别 X-Forwarded-For 或 User-Agent 等标头中的漏洞。
1 | ffuf -w /path/to/wordlist.txt -u http://example.com -H "X-Forwarded-For: FUZZ" |
该命令将 FUZZ 替换为页眉中字典的每个值,使你能够发现可能绕过安全检查或泄露内部细节的变化。
输出选项:
完成fuzz后,把结果存下来以便日后分析或者其他操作。ffuf 允许以各种格式(如 JSON 或 CSV)输出
1 | ffuf -w /path/to/wordlist.txt -u https://example.com/FUZZ -o results.json -of json |
这将以 JSON 格式存储输出,然后就可以用其他工具继续利用或进行手工测试。
你还可以 CSV 或 HTML 格式记录:
1 | ffuf -w wordlist.txt -u https://example.com/FUZZ -o results.csv -of csv |
要将输出保存为所有支持的格式,请使用
1 | ffuf -w wordlist.txt -u https://example.com/FUZZ -o results -of all |
在线参考:
本文参考与棉花糖
文章学习
这里有一份在线参考:
https://www.mhtsec.com/tool/ffuf/