【安全开发】Nuclei源码分析-模板机制(一)
目录
- Nuclei 模板机制详解
- 核心概念
- 1. 模板结构
- 1.1 基本信息(Info Block)
- 1.2 请求定义
- 1.3 匹配和提取规则
- 2. 模板类型详解
- 2.1 HTTP 模板
- 标准 HTTP 请求
- 原始 HTTP 请求
- 2.2 DNS 模板
- 2.3 工作流模板
- 3. 模板加载机制
- 3.1 模板发现
- 3.2 模板过滤
- 3.3 模板解析
- 4. 模板执行机制
- 4.1 执行器创建
- 4.2 请求编译
- 4.3 并发执行
- 5. 匹配和提取机制
- 5.1 Matchers 匹配器
- 5.2 Extractors 提取器
- 6. 模板优化机制
- 6.1 模板聚类
- 6.2 缓存机制
- 7. 模板验证
- 8. 自定义变量和表达式
- 小结
Nuclei 模板机制详解
Nuclei 是一个基于模板的漏洞扫描器,模板是其核心组件。模板定义了要执行的请求、匹配条件以及相关信息。作为系列文章,本文将详细分析 Nuclei 的模板使用机制。
核心概念
- 模板是 Nuclei 的基础执行单元
- 工作流是模板的编排方式
- 工作流和模板配合可以实现复杂的多步骤,条件的扫描任务
1. 模板结构
Nuclei 模板是 YAML 格式的文件,包含以下主要部分:
1.1 基本信息(Info Block)
每个模板都有一个 info 部分,包含模板的元数据:
id: 模板唯一标识符
info:name: 模板名称author: 作者severity: 严重性等级 (info, low, medium, high, critical)description: 模板描述reference: 参考链接tags: 标签
1.2 请求定义
Nuclei 支持多种协议的请求定义:
- HTTP 请求:使用 requests 或 raw 定义
- DNS 请求:使用 dns 定义
- 网络请求:使用 network 定义
- 文件操作:使用 file 定义
- 无头浏览器:使用 headless 定义
1.3 匹配和提取规则
模板通过 matchers 和 extractors 定义匹配和提取规则:
- Matchers:定义匹配条件,用于判断请求是否成功发现漏洞
- Extractors:从响应中提取特定数据
2. 模板类型详解
2.1 HTTP 模板
HTTP 模板支持两种定义方式:
标准 HTTP 请求
requests:- method: GETpath:- "{{BaseURL}}/vuln"matchers:- type: wordwords:- "vulnerable string"
原始 HTTP 请求
requests:- raw:- |GET /vuln HTTP/1.1Host: {{Hostname}}matchers:- type: wordwords:- "vulnerable response"
2.2 DNS 模板
DNS 模板用于 DNS 相关的漏洞检测:
dns:- name: "{{FQDN}}"type: Aclass: inetrecursion: trueretries: 3matchers:- type: wordwords:- "1.1.1.1"
2.3 工作流模板
工作流模板协调多个模板的执行:
workflows:- template: workflow/match-1.yaml- template: workflow/match-2.yaml
3. 模板加载机制
3.1 模板发现
Nuclei 通过 catalog (nuclei\v2\pkg\catalog\catalogue.go#L21-L32) 包发现模板文件:
- 从指定路径加载模板
- 递归搜索目录中的模板文件
- 支持通配符匹配
3.2 模板过滤
加载模板时,Nuclei 支持多种过滤方式:
- 标签过滤:通过 tags、exclude-tags 过滤
- 作者过滤:通过 author 过滤
- 严重性过滤:通过 severity、exclude-severity 过滤
- 路径过滤:通过 include-templates、exclude-templates 过滤
过滤逻辑在 filter (nuclei\v2\pkg\catalog\loader\filter\filter.go#L11-L28) 包中实现。
3.3 模板解析
模板解析过程在 parsers (nuclei\v2\pkg\parsers\parser.go#L59-L87) 包中完成:
- 读取模板文件内容
- 使用 YAML 解析器解析模板结构
- 验证模板语法和必需字
- 创建 Template (nuclei\v2\pkg\templates\templates.go#L24-L74) 对象
4. 模板执行机制
4.1 执行器创建
每种协议类型都有对应的执行器:(基于模板定义创建相应协议的执行器)
- HTTP 协议:HTTP Executer (nuclei\v2\pkg\protocols\http\request.go#L478-L503)
- DNS 协议:DNS Executer (nuclei\v2\pkg\protocols\dns\request.go#L118-L137)
- 其他协议类似
4.2 请求编译
执行前需要编译请求:
- 解析变量和表达式
- 编译匹配器和提取器
- 初始化协议客户端
4.3 并发执行
Nuclei 使用并发机制执行模板:
- 根据 -c 参数控制并发模板数
- 每个模板可以针对多个目标并发执行
- 使用速率限制器控制请求发送速度
5. 匹配和提取机制
5.1 Matchers 匹配器
支持多种匹配类型:
- word:字符串匹配
- regex:正则表达式匹配
- binary:二进制匹配
- dsl:DSL 表达式匹配
- status:HTTP 状态码匹配
5.2 Extractors 提取器
支持从响应中提取数据:
- regex:正则表达式提取
- kval:键值对提取
- xpath:XPath 提取(仅限 HTML/XML)
- json:JSONPath 提取(仅限 JSON)
- dsl:DSL 表达式提取
6. 模板优化机制
6.1 模板聚类
为了提高效率,Nuclei 对 HTTP 模板进行聚类:
- 识别具有相似请求的模板
- 将它们组合在一起执行
- 减少重复请求的发送
6.2 缓存机制
Nuclei 使用多种缓存机制:
- 模板解析缓存
- HTTP 响应缓存
- DNS 查询缓存
7. 模板验证
Nuclei 提供模板验证功能:
- 语法验证:检查 YAML 语法和必需字段
- 结构验证:检查模板结构是否正确
- 运行验证:通过 -validate 参数执行
8. 自定义变量和表达式
Nuclei 支持丰富的变量和表达式系统:
- 内置变量:如 {{BaseURL}}、{{Hostname}} 等
- 自定义变量:通过 -var 参数传递
- 环境变量:通过 -env-vars 启用
- DSL 表达式:复杂的动态表达式
小结
Nuclei 的模板机制设计灵活且强大,支持多种协议和复杂的匹配逻辑。通过合理的模板设计,可以实现各种漏洞检测和信息提取功能。模板加载、过滤、执行和优化的完整流程确保了扫描的高效性和准确性。
by 久违 2025.10.20
