目录
- [Nuclei 扫描任务执行流程详解](#Nuclei 扫描任务执行流程详解)
-
- [1. 程序启动与参数解析](#1. 程序启动与参数解析)
- [2. 初始化 Runner](#2. 初始化 Runner)
- [3. 执行枚举任务](#3. 执行枚举任务)
-
- [3.1 模板加载与过滤](#3.1 模板加载与过滤)
- [3.2 模板验证](#3.2 模板验证)
- [3.3 模板聚类优化](#3.3 模板聚类优化)
- [3.4 并发执行扫描](#3.4 并发执行扫描)
- [3.5 结果处理与输出](#3.5 结果处理与输出)
- [4. 协议执行流程](#4. 协议执行流程)
- [5. 工作流执行](#5. 工作流执行)
- 流程图
Nuclei 扫描任务执行流程详解
当一个新的扫描任务下达时,Nuclei 会按照以下步骤执行:
1. 程序启动与参数解析
首先,Nuclei 从 v2/cmd/nuclei/main.go 的 main() 函数开始执行:
go
func main() {
readConfig()
runner.ParseOptions(options) // 解析参数
nucleiRunner, err := runner.New(options)
// ...
if err := nucleiRunner.RunEnumeration(); err != nil {
// 这里是执行实际的扫描任务
// ...
}
nucleiRunner.Close()
}
在这个阶段,Nuclei 会解析用户提供的所有命令行参数,包括:
- 扫描目标(单个目标、目标列表文件等)
- 要使用的模板(特定模板、模板目录等)
- 过滤条件(按标签、严重性、作者等)【过滤模板】
- 输出选项(输出格式、输出文件等)
- 扫描配置(并发数、速率限制、超时等)
2. 初始化 Runner
在 runner.New() 函数中,Nuclei 进行一系列初始化操作:
- 处理模板更新:如果用户要求更新模板,则执行更新操作
- 初始化目录:设置模板目录路径
- 初始化 catalog:创建用于模板查找的目录结构
- 处理报告配置:如果配置了 Issue Tracker,则初始化相关客户端
- 处理输入目标:
- 从命令行参数读取目标
- 从文件读取目标列表
- 从标准输入读取目标
- 对目标进行去重处理
- 初始化输出:设置输出格式和输出文件
- 初始化进度条:设置进度跟踪和统计信息
- 初始化 Interactsh 客户端:用于检测带外交互(OOB)
- 设置速率限制器:根据用户配置限制请求速率
3. 执行枚举任务
初始化完成后,调用 RunEnumeration() 方法开始执行实际的扫描任务:
3.1 模板加载与过滤
- 处理新模板:如果用户指定了 -new-templates 参数,则只加载新增的模板
- 应用忽略规则:读取忽略配置文件,排除指定的标签和模板
- 创建执行器选项:设置模板执行所需的各种配置选项
- 创建模板加载器:初始化用于加载和解析模板的 loader
- 加载模板:
- 根据用户指定的路径加载模板
- 应用各种过滤条件(标签、严重性、作者等)
- 加载工作流模板
3.2 模板验证
如果用户指定了 -validate 参数,则只验证模板语法而不执行扫描。
3.3 模板聚类优化
为了提高效率,Nuclei 会对 HTTP 模板进行聚类处理:
- 将具有相似请求的模板分组
- 减少重复请求的发送
- 有效降低网络负载
3.4 并发执行扫描
Nuclei 使用并发方式执行扫描任务:
- 创建工作协程组:根据 -c 参数设置并发模板执行数
- 模板分类处理:
- 自包含模板:调用 processSelfContainedTemplates()
- 工作流模板:调用 processWorkflowWithList()
- 普通模板:调用 processTemplateWithList()
- 针对每个目标执行模板:
- 对于每个目标,执行模板中定义的所有请求
- 根据模板中定义的匹配器(matchers)和提取器(extractors)处理响应
- 将匹配结果输出到指定的输出位置
3.5 结果处理与输出
- 处理 Interactsh 回调:检查是否有带外交互结果
- 停止进度跟踪:结束进度条和统计信息收集
- 关闭资源:关闭浏览器实例、输出文件等
- 输出最终统计:显示扫描结果汇总信息
4. 协议执行流程
每种协议(HTTP、DNS、Network等)都有自己的执行流程:
- 编译阶段:准备请求数据,预处理变量等
- 执行阶段:发送请求并接收响应
- 匹配阶段:根据 Matchers 和 Extractors 判断是否匹配
- 输出阶段:将结果写入输出文件或屏幕
5. 工作流执行
对于工作流模板,Nuclei 会按照定义的逻辑顺序执行多个子模板,并根据匹配结果决定是否继续执行后续步骤。
流程图
整个流程可以用以下图表表示:

graph TD
A[程序启动] --> B[参数解析]
B --> C[初始化Runner]
C --> D[加载和过滤模板]
D --> E[模板聚类优化]
E --> F[并发执行扫描]
F --> G[处理各协议请求]
G --> H[匹配和提取结果]
H --> I[输出结果]
I --> J[清理资源]
通过这种结构化的设计,Nuclei 能够高效地执行大量模板扫描任务,并通过各种优化技术(如模板聚类、速率限制、错误缓存等)提高扫描效率和准确性。
by 久违 2025.10.20