目录与参数 Fuzzing
Fuzzing(模糊测试)是漏洞挖掘里"用字典暴力探测未知"的核心技能——把字典里的每一项替换到请求的某个位置,根据响应差异发现隐藏的目录、文件、参数和子域名。这篇以 Kali 自带的高速工具 ffuf 为主线,讲透目录爆破、参数发现、虚拟主机枚举,以及如何用过滤器从海量响应里筛出有价值的结果。
Fuzzing 会向目标发送大量请求,只能对授权目标或自建靶场执行,否则等同于攻击。注意控制并发,避免压垮目标。
Fuzzing 的核心思想
所有 Fuzzing 工具都在做同一件事:在请求里放一个占位符,用字典逐项替换,发请求,再根据响应区分"存在/不存在"。区别只在占位符放在哪:
| 放置位置 | 发现什么 | 例子 |
|---|---|---|
| URL 路径 | 隐藏目录、文件 | /admin、/backup.zip |
| URL 参数名 | 隐藏参数 | ?debug=1、?id= |
| Host 头 | 虚拟主机、内部站点 | 同 IP 上的其它域名 |
| 子域名 | 子域名枚举 | dev.target.com |
| POST 数据 | 隐藏字段 | 表单未公开的字段 |
难点不在发请求,而在从成千上万条响应里把有意义的那几条筛出来——这就要靠过滤器。
ffuf 基础用法
ffuf(Fuzz Faster U Fool)是 Go 写的高速 Fuzzer,用 FUZZ 关键字标记占位符。
# 目录爆破:FUZZ 出现在 URL 路径处
ffuf -w /usr/share/seclists/Discovery/Web-Content/common.txt \
-u https://target.com/FUZZ
# 指定扩展名,同时探测文件
ffuf -w wordlist.txt -u https://target.com/FUZZ -e .php,.bak,.zip,.txt
# 控制速度:-t 并发线程,-rate 每秒请求数,-p 请求间隔
ffuf -w wordlist.txt -u https://target.com/FUZZ -t 40 -rate 100用过滤器筛选结果
这是 ffuf 的精髓。可以匹配(match,保留)或过滤(filter,剔除),依据状态码、大小、字数、行数、正则:
# 只保留 200 和 301/302(-mc 匹配状态码)
ffuf -w wordlist.txt -u https://target.com/FUZZ -mc 200,301,302
# 过滤掉响应大小为 4242 字节的(通常是统一的 404 页面)
ffuf -w wordlist.txt -u https://target.com/FUZZ -fs 4242
# 过滤掉特定字数 / 行数
ffuf -w wordlist.txt -u https://target.com/FUZZ -fw 12 -fl 5
# 用正则过滤响应内容
ffuf -w wordlist.txt -u https://target.com/FUZZ -fr "Not Found"| 参数 | 含义 | 匹配版 |
|---|---|---|
-fc | 过滤状态码 | -mc |
-fs | 过滤响应大小 | -ms |
-fw | 过滤字数 | -mw |
-fl | 过滤行数 | -ml |
-fr | 过滤正则 | -mr |
很多站点对不存在的路径返回 200 + 统一"软 404"页面,靠状态码区分不了。这时先发一个肯定不存在的路径看响应大小/字数,再用
-fs / -fw 把这个固定大小过滤掉,剩下的就是真实存在的内容。这是用 ffuf 的关键技巧。参数发现
很多漏洞藏在未公开的参数里(调试开关、隐藏功能)。把 FUZZ 放到参数名位置:
# GET 参数名爆破,过滤掉无效参数的统一响应大小
ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt \
-u "https://target.com/page?FUZZ=test" -fs 1234
# POST 参数发现
ffuf -w params.txt -u https://target.com/api \
-X POST -d "FUZZ=test" -H "Content-Type: application/x-www-form-urlencoded" -fs 0专用工具 arjun 也擅长参数发现,可作为补充。
子域名与虚拟主机枚举
# 虚拟主机爆破:FUZZ 放在 Host 头,发现同 IP 上的其它站点
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-u https://target.com -H "Host: FUZZ.target.com" -fs 1234
# 子域名爆破(基于 DNS 解析)也可用 ffuf 配合 -u 指向各子域
ffuf -w subdomains.txt -u https://FUZZ.target.com -mc 200,301,302,403虚拟主机爆破能发现没有公开 DNS 记录、但在同一服务器上托管的内部站点,是常被忽视的攻击面。
多位置同时 Fuzz
ffuf 支持多个关键字组合,例如同时爆用户名和密码:
ffuf -w users.txt:USER -w pass.txt:PASS \
-u https://target.com/login -X POST \
-d "username=USER&password=PASS" \
-mode clusterbomb -fc 401clusterbomb 模式遍历两个字典的所有组合,pitchfork 则按行一一对应。
其它常用工具
| 工具 | 特点 |
|---|---|
| feroxbuster | Rust 编写,自动递归目录,速度快,Kali 可装 |
| gobuster | 经典目录/DNS/vhost 爆破工具 |
| dirsearch | Python,内置优秀字典,对扩展名处理友好 |
| wfuzz | ffuf 的前辈,功能全但更慢 |
工具选型不必纠结,理解"占位符 + 字典 + 过滤响应"的思想后,它们都是一回事。
防御视角
- 统一错误响应:存在与不存在的资源返回一致的状态码和页面,增加攻击者区分难度。
- 限速与 WAF:对短时间高频请求的源 IP 限速/封禁,识别 ffuf 等工具的特征 UA 和访问模式。
- 不暴露敏感路径:删除线上环境的备份文件(
.bak/.zip/.git)、调试接口、默认后台路径。 - 目录权限:禁止目录列举(directory listing),敏感目录加认证。
最后更新于