跳到主要内容

ffuf Web Fuzz 与参数发现

ffuf 是高速 Web Fuzz 工具。它的核心用法是把 URL、参数名、参数值、Header 或请求体中的某一段替换成 FUZZ,再用字典逐项请求目标。

在靶场里,ffuf 很适合回答两个问题:

  1. Web 根目录下还有哪些隐藏文件或端点。
  2. 一个可疑端点需要什么参数名,参数值能不能触发文件读取、报错或其他行为。

安装

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

如果 filepagepathbook 等参数返回长度明显不同,下一步应手工验证它们是否能读取目标文件。

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 单独复核。


相关知识