ffuf Web Fuzz 与参数发现
ffuf 是高速 Web Fuzz 工具。它的核心用法是把 URL、参数名、参数值、Header 或请求体中的某一段替换成 FUZZ,再用字典逐项请求目标。
在靶场里,ffuf 很适合回答两个问题:
- Web 根目录下还有哪些隐藏文件或端点。
- 一个可疑端点需要什么参数名,参数值能不能触发文件读取、报错或其他行为。
安装
Kali / Debian / Ubuntu
sudo apt update && sudo apt install -y ffuf
Go Install
go install github.com/ffuf/ffuf/v2@latest
确认版本:
ffuf -V
核心参数
| 参数 | 说明 | 示例 |
|---|---|---|
-u | 目标 URL,必须包含 FUZZ | -u http://target/FUZZ.php |
-w | 字典路径 | -w /usr/share/wordlists/dirb/common.txt |
-mc | 只匹配指定状态码 | -mc 200,500 |
-fc | 过滤指定状态码 | -fc 404 |
-fs | 过滤指定响应大小 | -fs 1234 |
-fw | 过滤指定单词数 | -fw 20 |
-fl | 过滤指定行数 | -fl 10 |
-t | 并发线程数 | -t 50 |
-o | 输出到文件 | -o ffuf.json |
-of | 输出格式 | -of json |
-H | 自定义 Header | -H "Cookie: PHPSESSID=..." |
常用场景
1. 枚举 PHP 文件
ffuf -u http://192.168.1.117/FUZZ.php \
-w /usr/share/wordlists/dirb/common.txt \
-mc 200,500
500 不一定是坏结果。对文件读取、模板渲染、数据库查询这类入口来说,缺少参数时返回 500 反而可能说明端点存在。
2. 枚举目录或普通路径
ffuf -u http://192.168.1.108/FUZZ \
-w /usr/share/seclists/Discovery/Web-Content/common.txt \
-mc 200,301,302,403
3. 参数名 Fuzz
当发现 /file.php 这种可疑入口时,可以把参数名位置设为 FUZZ:
ffuf -u 'http://192.168.1.117/file.php?FUZZ=/etc/passwd' \
-w /usr/share/wordlists/dirb/common.txt \
-mc 200
如果 file、page、path、book 等参数返回长度明显不同,下一步应手工验证它们是否能读取目标文件。
4. 参数值 Fuzz
已知参数名后,可以枚举常见文件、备份名或业务对象:
ffuf -u 'http://target/download.php?file=FUZZ' \
-w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt \
-mc 200 \
-fs 0
5. 过滤通配响应
如果目标对所有路径都返回 200,先取一个不存在路径的响应大小:
curl -s -o /dev/null -w '%{http_code} %{size_download}\n' \
http://target/definitely-not-exist-12345
再用 -fs 过滤固定大小:
ffuf -u http://target/FUZZ \
-w /usr/share/seclists/Discovery/Web-Content/common.txt \
-fs 1234
Yuan114 案例
Yuan114 中,ffuf 先发现返回 500 的 PHP 文件:
ffuf -u http://192.168.1.117/FUZZ.php \
-w /usr/share/wordlists/dirb/common.txt \
-mc 200,500
随后对参数名进行 Fuzz:
ffuf -u http://192.168.1.117/file.php?FUZZ=/etc/passwd \
-w /usr/share/wordlists/dirb/common.txt \
-mc 200
命中 file 后,再用 curl 手工验证 LFI。完整过程见:HackMyVM Yuan114 通关记录。
结果判断
| 结果 | 判断 |
|---|---|
| 状态码不同 | 高价值线索,优先手工访问 |
| 响应长度明显不同 | 可能存在真实内容、报错或过滤绕过 |
500 | 可能是缺参数、参数值不合法或后端异常 |
403 | 资源存在但访问受限,换方法、Header 或路径变体 |
| 大量相同结果 | 先用 -fs、-fw、-fl 过滤基线响应 |
ffuf 的结果只是“候选入口”。不要只凭扫描输出下结论,关键入口需要用 curl、浏览器或 Burp 单独复核。