名称: ffuf-web-fuzzing 描述: 渗透测试中FFUF web模糊测试的专家指导,包括使用原始请求进行认证模糊测试、自动校准和结果分析
FFUF(Fuzz Faster U Fool)技能
概述
FFUF 是一个用Go编写的快速web模糊测试工具,专为在渗透测试中发现隐藏内容、目录、文件、子域名以及测试漏洞而设计。它比传统工具如dirb或dirbuster快得多。
安装
# 使用Go
go install github.com/ffuf/ffuf/v2@latest
# 使用Homebrew(macOS)
brew install ffuf
# 二进制下载
# 从以下地址下载:https://github.com/ffuf/ffuf/releases/latest
核心概念
FUZZ关键字
FUZZ 关键字用作占位符,被您的单词列表中的条目替换。您可以将其放置在任何地方:
- URL:
https://target.com/FUZZ - 头部:
-H "Host: FUZZ" - POST数据:
-d "username=admin&password=FUZZ" - 多位置使用自定义关键字:
-w wordlist.txt:CUSTOM然后使用CUSTOM代替FUZZ
多单词列表模式
- clusterbomb:测试所有组合(默认) - 笛卡尔积
- pitchfork:并行迭代单词列表(1对1匹配)
- sniper:一次测试一个位置(用于多个FUZZ位置)
常见用例
1. 目录和文件发现
# 基本目录模糊测试
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ
# 带文件扩展名
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -e .php,.html,.txt,.pdf
# 彩色和详细输出
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -c -v
# 带递归(发现嵌套目录)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -recursion -recursion-depth 2
2. 子域名枚举
# 虚拟主机发现
ffuf -w /path/to/subdomains.txt -u https://target.com -H "Host: FUZZ.target.com" -fs 4242
# 注意:-fs 4242 过滤掉大小为4242的响应(根据默认响应大小调整)
3. 参数模糊测试
# GET参数名称
ffuf -w /path/to/params.txt -u https://target.com/script.php?FUZZ=test_value -fs 4242
# GET参数值
ffuf -w /path/to/values.txt -u https://target.com/script.php?id=FUZZ -fc 401
# 多参数
ffuf -w params.txt:PARAM -w values.txt:VAL -u https://target.com/?PARAM=VAL -mode clusterbomb
4. POST数据模糊测试
# 基本POST模糊测试
ffuf -w /path/to/passwords.txt -X POST -d "username=admin&password=FUZZ" -u https://target.com/login.php -fc 401
# JSON POST数据
ffuf -w entries.txt -u https://target.com/api -X POST -H "Content-Type: application/json" -d '{"name": "FUZZ", "key": "value"}' -fr "error"
# 模糊测试多个POST字段
ffuf -w users.txt:USER -w passes.txt:PASS -X POST -d "username=USER&password=PASS" -u https://target.com/login -mode pitchfork
5. 头部模糊测试
# 自定义头部
ffuf -w /path/to/wordlist.txt -u https://target.com -H "X-Custom-Header: FUZZ"
# 多头部
ffuf -w /path/to/wordlist.txt -u https://target.com -H "User-Agent: FUZZ" -H "X-Forwarded-For: 127.0.0.1"
过滤和匹配
匹配器(包含结果)
-mc:匹配状态码(默认:200-299,301,302,307,401,403,405,500)-ml:匹配行数-mr:匹配正则表达式-ms:匹配响应大小-mt:匹配响应时间(例如,>100或<100毫秒)-mw:匹配单词数
过滤器(排除结果)
-fc:过滤状态码(例如,-fc 404,403,401)-fl:过滤行数-fr:过滤正则表达式(例如,-fr "error")-fs:过滤响应大小(例如,-fs 42,4242)-ft:过滤响应时间-fw:过滤单词数
自动校准(默认使用!)
关键: 除非有特定原因,否则始终使用 -ac。这在让Claude分析结果时尤为重要,因为它显著减少噪声和误报。
# 自动校准 - 始终使用此选项
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -ac
# 每主机自动校准(用于多主机)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -ach
# 自定义自动校准字符串(用于特定模式)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -acc "404NotFound"
为什么 -ac 是必要的:
- 自动检测和过滤重复的误报响应
- 去除动态网站中随机内容的噪声
- 使结果分析对人类和Claude都更容易
- 防止数千个相同的404/403响应使输出混乱
- 适应目标的具体行为
当Claude分析您的ffuf结果时,-ac 是强制性的 - 没有它,Claude将浪费时间筛选数千个误报,而不是发现有趣的反常现象。
速率限制和定时
速率控制
# 限制为每秒2个请求(隐身模式)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -rate 2
# 在请求之间添加延迟(0.1到2秒随机)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -p 0.1-2.0
# 设置并发线程数(默认:40)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -t 10
时间限制
# 最大总执行时间(60秒)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -maxtime 60
# 每作业最大时间(递归时有用)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -maxtime-job 60 -recursion
输出选项
输出格式
# JSON输出
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -o results.json
# HTML输出
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -of html -o results.html
# CSV输出
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -of csv -o results.csv
# 所有格式
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -of all -o results
# 静默模式(无进度,仅结果)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -s
# 使用tee管道到文件
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -s | tee results.txt
高级技术
使用原始HTTP请求(认证模糊测试的关键)
这是ffuf最强大的功能之一,尤其适用于具有复杂头部、cookie或令牌的认证请求。
工作流:
- 捕获完整的认证请求(从Burp Suite、浏览器DevTools等)
- 保存到文件(例如,
req.txt) - 用
FUZZ关键字替换您想要模糊测试的值 - 使用
--request标志
# 从包含原始HTTP请求的文件
ffuf --request req.txt -w /path/to/wordlist.txt -ac
示例req.txt文件:
POST /api/v1/users/FUZZ HTTP/1.1
Host: target.com
User-Agent: Mozilla/5.0
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Cookie: session=abc123xyz; csrftoken=def456
Content-Type: application/json
Content-Length: 27
{"action":"view","id":"1"}
用例:
- 模糊测试具有复杂认证头部的认证端点
- 测试具有JWT令牌的API端点
- 模糊测试具有CSRF令牌、会话cookie和自定义头部的端点
- 测试需要特定User-Agent或Accept头部的端点
- POST/PUT/DELETE请求的认证
专业提示:
- 您可以将FUZZ放置在多个位置:URL路径、头部、主体
- 如果需要,使用
-request-proto https(默认为https) - 始终使用
-ac过滤掉认证的“未找到”或错误响应 - 适用于IDOR测试:模糊测试认证上下文中的用户ID、文档ID等
# 常见认证模糊测试模式
ffuf --request req.txt -w user_ids.txt -ac -mc 200 -o results.json
# 使用自定义关键字的多FUZZ位置
ffuf --request req.txt -w endpoints.txt:ENDPOINT -w ids.txt:ID -mode pitchfork -ac
代理使用
# HTTP代理(适用于Burp Suite)
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -x http://127.0.0.1:8080
# SOCKS5代理
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -x socks5://127.0.0.1:1080
# 通过代理重放匹配的请求
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -replay-proxy http://127.0.0.1:8080
Cookie和认证
# 使用cookie
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -b "sessionid=abc123; token=xyz789"
# 客户端证书认证
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -cc client.crt -ck client.key
编码
# URL编码
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -enc 'FUZZ:urlencode'
# 多编码
ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -enc 'FUZZ:urlencode b64encode'
漏洞测试
# SQL注入测试
ffuf -w sqli_payloads.txt -u https://target.com/page.php?id=FUZZ -fs 1234
# XSS测试
ffuf -w xss_payloads.txt -u https://target.com/search?q=FUZZ -mr "<script>"
# 命令注入
ffuf -w cmdi_payloads.txt -u https://target.com/execute?cmd=FUZZ -fr "error"
批处理多个目标
# 处理多个URL
cat targets.txt | xargs -I@ sh -c 'ffuf -w wordlist.txt -u @/FUZZ -ac'
# 循环处理多个目标并保存结果
for url in $(cat targets.txt); do
ffuf -w wordlist.txt -u $url/FUZZ -ac -o "results_$(echo $url | md5sum | cut -d' ' -f1).json"
done
最佳实践
1. 始终使用自动校准
为每次扫描默认使用 -ac。这是生产性渗透测试的不可协商条件:
ffuf -w wordlist.txt -u https://target.com/FUZZ -ac
2. 使用原始请求进行认证
不要为复杂认证而挣扎于命令行标志。捕获完整请求并使用 --request:
# 1. 从Burp/DevTools捕获认证请求
# 2. 保存到req.txt,并在适当位置插入FUZZ关键字
# 3. 使用-ac运行
ffuf --request req.txt -w wordlist.txt -ac -o results.json
3. 使用适当的单词列表
- 目录发现:SecLists Discovery/Web-Content(raft-large-directories.txt, directory-list-2.3-medium.txt)
- 子域名:SecLists Discovery/DNS(subdomains-top1million-5000.txt)
- 参数:SecLists Discovery/Web-Content(burp-parameter-names.txt)
- 用户名:SecLists Usernames
- 密码:SecLists Passwords
- 来源:https://github.com/danielmiessler/SecLists
4. 为隐身性使用速率限制
使用 -rate 避免触发WAF/IDS或压倒服务器:
ffuf -w wordlist.txt -u https://target.com/FUZZ -rate 2 -t 10
5. 策略性地过滤
- 首先检查默认响应以识别常见响应大小、状态码或模式
- 使用
-fs按大小过滤或-fc按状态码过滤 - 组合过滤器:
-fc 403,404 -fs 1234
6. 适当保存结果
始终将结果保存到文件以便后续分析:
ffuf -w wordlist.txt -u https://target.com/FUZZ -o results.json -of json
7. 使用交互模式
在执行期间按ENTER键进入交互模式,您可以:
- 动态调整过滤器
- 保存当前结果
- 重启扫描
- 管理队列
8. 递归深度
小心递归深度,以避免陷入无限循环或压倒服务器:
ffuf -w wordlist.txt -u https://target.com/FUZZ -recursion -recursion-depth 2 -maxtime-job 120
常见模式和一行命令
快速目录扫描
ffuf -w ~/wordlists/common.txt -u https://target.com/FUZZ -mc 200,301,302,403 -ac -c -v
带扩展名的全面扫描
ffuf -w ~/wordlists/raft-large-directories.txt -u https://target.com/FUZZ -e .php,.html,.txt,.bak,.old -ac -c -v -o results.json
认证模糊测试(原始请求)
# 1. 将您的认证请求保存到req.txt,并使用FUZZ关键字
# 2. 运行:
ffuf --request req.txt -w ~/wordlists/api-endpoints.txt -ac -o results.json -of json
API端点发现
ffuf -w ~/wordlists/api-endpoints.txt -u https://api.target.com/v1/FUZZ -H "Authorization: Bearer TOKEN" -mc 200,201 -ac -c
带自动校准的子域名发现
ffuf -w ~/wordlists/subdomains-top5000.txt -u https://FUZZ.target.com -ac -c -v
POST登录暴力破解
ffuf -w ~/wordlists/passwords.txt -X POST -d "username=admin&password=FUZZ" -u https://target.com/login -fc 401 -rate 5 -ac
带认证的IDOR测试
# 使用req.txt包含认证头部和ID参数中的FUZZ
ffuf --request req.txt -w numbers.txt -ac -mc 200 -fw 100-200
配置文件
创建 ~/.config/ffuf/ffufrc 用于默认设置:
[http]
headers = ["User-Agent: Mozilla/5.0"]
timeout = 10
[general]
colors = true
threads = 40
[matcher]
status = "200-299,301,302,307,401,403,405,500"
故障排除
太多误报
- 使用
-ac进行自动校准 - 检查默认响应并使用
-fs按大小过滤 - 使用正则表达式过滤
-fr
太慢
- 增加线程:
-t 100 - 减少单词列表大小
- 如果不需要响应内容,使用
-ignore-body
被阻止
- 降低速率:
-rate 2 - 添加延迟:
-p 0.5-1.5 - 减少线程:
-t 10 - 随机化User-Agent
- 使用代理轮换
缺少结果
- 检查是否过滤过于激进
- 使用
-mc all查看所有响应 - 临时禁用自动校准
- 使用详细模式
-v查看发生了什么
资源
- 官方GitHub:https://github.com/ffuf/ffuf
- 维基:https://github.com/ffuf/ffuf/wiki
- Codingo指南:https://codingo.io/tools/ffuf/bounty/2020/09/17/everything-you-need-to-know-about-ffuf.html
- 实践实验室:http://ffuf.me
- SecLists单词列表:https://github.com/danielmiessler/SecLists
快速参考卡
| 任务 | 命令模板 |
|---|---|
| 目录发现 | ffuf -w wordlist.txt -u https://target.com/FUZZ -ac |
| 子域名发现 | ffuf -w subdomains.txt -u https://FUZZ.target.com -ac |
| 参数模糊测试 | ffuf -w params.txt -u https://target.com/page?FUZZ=value -ac |
| POST数据模糊测试 | ffuf -w wordlist.txt -X POST -d "param=FUZZ" -u https://target.com/endpoint |
| 带扩展名 | 添加 -e .php,.html,.txt |
| 过滤状态 | 添加 -fc 404,403 |
| 过滤大小 | 添加 -fs 1234 |
| 速率限制 | 添加 -rate 2 |
| 保存输出 | 添加 -o results.json |
| 详细 | 添加 -c -v |
| 递归 | 添加 -recursion -recursion-depth 2 |
| 通过代理 | 添加 -x http://127.0.0.1:8080 |
附加资源
此技能包含 resources/ 目录中的补充材料:
资源文件
- WORDLISTS.md:SecLists单词列表的全面指南,针对不同场景的推荐列表、文件扩展名和快速参考模式
- REQUEST_TEMPLATES.md:常见认证场景(JWT、OAuth、会话cookie、API密钥等)的预建req.txt模板及使用示例
助手脚本
- ffuf_helper.py:Python脚本,用于:
- 分析ffuf JSON结果以发现反常现象和有趣发现
- 从命令行参数创建req.txt模板文件
- 为IDOR测试生成基于数字的单词列表
助手脚本使用:
# 分析结果以发现有趣反常现象
python3 ffuf_helper.py analyze results.json
# 创建认证请求模板
python3 ffuf_helper.py create-req -o req.txt -m POST -u "https://api.target.com/users" \
-H "Authorization: Bearer TOKEN" -d '{"action":"FUZZ"}'
# 生成IDOR测试单词列表
python3 ffuf_helper.py wordlist -o ids.txt -t numbers -s 1 -e 10000
何时使用资源:
- 用户需要单词列表推荐 → 参考WORDLISTS.md
- 用户需要帮助处理认证请求 → 参考REQUEST_TEMPLATES.md
- 用户想分析结果 → 使用ffuf_helper.py analyze
- 用户需要生成req.txt → 使用ffuf_helper.py create-req
- 用户需要IDOR数字范围 → 使用ffuf_helper.py wordlist
给Claude的注意事项
帮助用户使用ffuf时:
- 始终在每个命令中包含
-ac- 这是生产性渗透测试和结果分析的强制性要求 - 当用户提到认证模糊测试或提供认证令牌/cookie时:
- 建议创建一个包含完整HTTP请求的
req.txt文件 - 展示如何在想要模糊测试的位置插入FUZZ
- 使用
ffuf --request req.txt -w wordlist.txt -ac
- 建议创建一个包含完整HTTP请求的
- 始终建议从
-ac开始进行自动校准 - 根据任务建议来自SecLists的适当单词列表
- 提醒用户对生产目标使用速率限制(
-rate) - 鼓励将输出保存到文件以进行文档记录:
-o results.json - 基于初始侦察建议过滤策略
- 始终使用FUZZ关键字(区分大小写)
- 考虑隐身性:降低线程、速率限制和延迟以处理敏感目标
- 对于渗透测试报告,使用
-of html或-of csv以获得客户友好的格式 - 当为用户分析ffuf结果时:
- 假设他们使用了
-ac(如果没有,结果将过于嘈杂) - 关注反常现象:不同的状态码、响应大小、时间
- 寻找有趣的端点:admin、api、backup、config、.git等
- 标记潜在漏洞:错误消息、堆栈跟踪、版本信息
- 建议对有趣发现进行后续模糊测试
- 假设他们使用了