Nuclei 模糊测试实战:4步从第一份模板到性能调优的完整指南
【免费下载链接】nucleiNuclei is a fast, customizable vulnerability scanner powered by the global security community and built on a simple YAML-based DSL, enabling collaboration to tackle trending vulnerabilities on the internet. It helps you find vulnerabilities in your applications, APIs, networks, DNS, and cloud configurations.项目地址: https://gitcode.com/GitHub_Trending/nu/nuclei
Nuclei 是一款基于 YAML 模板的开源漏洞扫描器,它内置的 fuzzing(模糊测试,即按规则批量替换请求中的参数并观察响应变化)模块可以把 payload 注入到 HTTP 请求的任意位置,自动完成变异、发送和判定。本文按"跑通→读懂→滤噪→提速"四步,带你走一遍完整的 Nuclei 模糊测试流程:从写出第一份模板,到用-fuzz-param-frequency参数把扫描资源集中到真正有价值的参数上。
如何编写第一个 Nuclei Fuzz 模板
假设你拿到一个形如/admin/user/55/profile的接口,怀疑路径里的数字参数存在 SQL 注入。仓库自带示例 fuzz-path-sqli.yaml 演示的正是这个场景,核心部分如下:
http: - payloads: pathsqli: - '%20OR%20True' fuzzing: - part: path type: postfix mode: single fuzz: - '{{pathsqli}}' matchers: - type: status status: [200]怎么读:payload 先在payloads块里声明,fuzzing通过{{pathsqli}}引用它;part: path说明攻击面是 URL 路径,type: postfix表示把 payload 追加在原值末尾,mode: single表示一次只变异一个位置;matchers定义命中标准,这里是状态码 200。如果 payload 不多,也可以省略payloads块,直接在fuzz下写字符串列表。模板落盘后,一条命令即可运行:
nuclei -t fuzz-path-sqli.yaml -u http://target仓库在internal/tests/integration/testdata/fuzz/下还放了十余份示例,覆盖 JSON、XML、multipart 请求体、cookie、host 头注入等场景,改一改就能当自己的模板起点。
读懂 Nuclei Fuzz 模板核心配置:part、type、mode 三要素
模板的行为由fuzzing块中的 Rule 结构体决定,源码在 pkg/fuzz/fuzz.go。三个字段各管一件事,配合起来就是一次完整的变异描述。
part决定打在请求的哪个位置,支持 query、header、path、body、cookie 五种,写成request则表示作用于整个请求,也可以用parts字段一次列出多个位置。type决定变异方式,共有五种:replace整体替换原值,prefix和postfix分别作为前缀、后缀附加,infix插入到值中间,replace-regex则按正则匹配后替换,需要额外提供replace-regex字段写明匹配模式,比如把请求里所有 URL 替换成探针地址。mode控制节奏:single逐个位置试,multiple则对所有命中的位置同时注入,后者在参数较多时效率更高,但单次请求的变化面更大。
若只想碰部分参数,还有两个限定符:keys按参数名精确圈定,keys-regex按名称正则匹配(例如url.*命中所有以 url 开头的参数),values按参数值正则过滤。仓库里的 fuzz-body-json-sqli.yaml 就是组合用法:先确认响应头是 JSON,再对请求体中的 key 做后缀注入,避免模板误伤其他接口。
如何过滤 Nuclei 模糊测试的误报:pre-condition 与多条件匹配
模糊测试请求量大,噪声也天然偏多,示例模板用了两层手段来压住它。
第一层是pre-condition:在发起任何变异之前,先用 DSL 表达式检查请求本身,不满足就直接跳过。cookie 注入示例 fuzz-cookie-error-sqli.yaml 要求method == "GET"且len(cookie) > 0,也就是说非 GET 请求、没有 cookie 的请求根本不会进入模糊流程,无效请求在发送前就被拦掉了。
第二层是收紧 matchers。给matchers-condition设为and,让 word、status 等条件必须同时成立才判定命中,再开启stop-at-first-match: true,一旦某个 payload 命中就停止后续发送——既不再产生无关告警,也省下了剩余 payload 的请求量。命中后的结果可以直接在控制台按目标、模板维度浏览和筛选,误判条目一眼就能排除。
如何用 -fuzz-param-frequency 跳过低价值参数,提升扫描性能
批量跑目标时,同一个参数反复"无果"却仍被不断重试,是资源浪费的大头。Nuclei 为此内置了一个频率追踪器(实现在 pkg/fuzz/frequency/tracker.go):按"目标+模板+参数"三个维度计数,某参数连续达到阈值次没有产生结果,就会被标记为无趣并跳过;而一旦它出过结果,计数立即清零,恢复参与后续模糊。阈值由-fuzz-param-frequency参数控制,默认 10:
nuclei -t fuzz-templates/ -l targets.txt -fuzz-param-frequency 5把它调到 5,可以让测试更快收敛到高风险参数上,适合参数多、目标多的资产盘点场景。追踪器内部使用带容量上限的缓存,最多同时跟踪 10000 个参数组合,长时间运行的内存开销也是可控的。
所有字段的完整语义可以参考仓库根目录的 SYNTAX-REFERENCE.md。接下来若想贴近自己的业务做变异策略,建议从replace-regex和multiple模式入手,再结合 pre-condition 圈定生效范围。
【免费下载链接】nucleiNuclei is a fast, customizable vulnerability scanner powered by the global security community and built on a simple YAML-based DSL, enabling collaboration to tackle trending vulnerabilities on the internet. It helps you find vulnerabilities in your applications, APIs, networks, DNS, and cloud configurations.项目地址: https://gitcode.com/GitHub_Trending/nu/nuclei
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考