概述
模板流引擎在 nuclei v3 中引入,为 Nuclei 带来了两项重要增强功能: 这些功能通过 goja 后端使用 JavaScript (ECMAScript 5.1) 实现。条件执行
在编写复杂模板时,我们可能需要在执行请求的某些部分之前添加一些额外的检查(或条件语句)。 一个理想的例子是使用默认用户名和密码暴力破解 WordPress 登录,但如果我们仔细重新评估这个模板,我们可以看到模板发送了 276 个请求,而没有检查 URL 是否实际存在或目标站点是否确实是 WordPress 站点。 随着 Nuclei v3 中 flow 的增加,我们可以重写此模板,首先检查目标是否为 WordPress 站点,如果是,则使用默认凭据暴力破解登录,这可以通过简单添加一行内容来实现,即flow: http(1) && http(2),nuclei 将处理其余一切。
请求执行编排
Flow 是 Nuclei 的一项强大功能,为执行请求提供了增强的编排能力。条件执行的简单性只是开始。使用 flow,您可以:- 遍历值列表并为每个值执行请求
- 从请求中提取值,遍历它们,并为每个值执行另一个请求
- 获取和设置模板上下文(全局变量)中的值
- 将输出写入 stdout 用于调试目的或基于特定条件
- 在模板执行期间引入自定义逻辑
- 使用 ECMAScript 5.1 JavaScript 功能在运行时构建和修改变量
- 在运行时更新变量并在后续请求中使用它们
- 检索提供的 IP 的 SSL 证书(使用 tlsx)
- 从证书中提取
subject_cn(CN) - 从证书中提取
subject_an(SAN) - 从上述步骤中获取的值中删除通配符前缀
- 从证书中提取
- 使用从 SSL 请求中找到的所有域名暴力破解请求
ssl():此函数执行 SSL 请求。template["ssl_domains"]:从模板上下文中检索ssl_domains的值。iterate():辅助函数,可以遍历任何值类型,同时处理空值或 null 值。set("vhost", vhost):在模板中创建一个新变量vhost,并将vhost变量的值分配给它。http():此函数执行 HTTP 请求。
flow,您可以重新定义编排请求执行的方式,使您的模板更强大、更高效。
以下是使用 flow 进行 vhost 枚举的工作模板:
JS 绑定
本节简要描述所有 nuclei JS 绑定及其用法。协议执行函数
在 nuclei 中,任何列出的协议都可以使用protocol_name() 格式在 JavaScript 中调用或执行。例如,您可以使用 http()、dns()、ssl() 等。
如果您想执行协议的特定请求(参考 nuclei-flow-dns 示例),可以通过传递以下任一项来实现:
- 协议中该请求的索引(例如,
dns(1)、dns(2)) - 协议中该请求的 ID(例如,
dns("extract-vps")、http("probe-http"))
dns("extract-vps","1"))
Iterate 辅助函数
Iterate 是一个 nuclei js 辅助函数,可用于遍历任何类型的值,如数组、映射、字符串、数字,同时处理空/nil 值。 这是 nuclei 的附加辅助函数,用于省略检查值是否为空然后遍历它的样板代码Set 辅助函数
当遍历值/数组或其他用例时,我们可能想使用自定义/给定值调用请求,这可以通过使用set() 辅助函数来实现。调用时,它将给定变量添加到模板上下文(全局变量)中,该值在执行请求/协议期间使用。set() 的格式是 set("variable_name",value),例如:set("username","admin")。
set("vhost", vhost),它将 vhost 添加到模板上下文(全局变量)中,然后调用 http(1),后者在请求中使用了这个值。
模板上下文
模板上下文只是一个包含所有数据的 map/jsonl,同时包含仅在运行时可用的内部/未导出数据(例如:从先前请求中提取的值,使用set() 添加的变量等)。此模板上下文在 JavaScript 中作为 template 变量可用,可用于从中访问任何数据。例如:template["dns_cname"]、template["ssl_subject_cn"] 等。
log() 函数将其打印到 stdout 轻松找到
Log 辅助函数
它是 nuclei js 替代console.log 的函数,以可读格式漂亮地打印 map 数据
注意: 这应仅用于调试目的,因为它将数据打印到 stdout
Dedupe
很多时候仅有数组/切片是不够的,我们可能需要删除重复变量。例如,在前面的 vhost 枚举中,我们没有删除任何重复项,因为ssl_subject_cn 和 ssl_subject_an 中总是有重复值的可能,这可以通过使用 dedupe() 对象来实现。这是 nuclei js 辅助函数,用于抽象从数组/切片中删除重复项的样板代码
类似于 DSL 辅助函数,我们可以使用 Javascript (ECMAScript 5.1) 提供的内置函数或使用 DSL 辅助函数,由用户决定使用哪一个。
在多协议/Flow 模板中跳过内部匹配器
在 nuclei v3.1.4 之前,像CVE-2023-43177 这样的模板,它有多个请求/协议并使用 flow 进行逻辑处理,通常只返回一个结果,但当在 flow 中使用 for 循环时,这与逻辑冲突。为了解决这个问题,从 v3.1.4 开始,nuclei 引擎将打印模板中的所有事件/结果,模板编写者可以在匹配器中使用 internal: true 来跳过打印事件/结果,就像动态提取器一样。
注意:这仅在先前请求/协议中使用了匹配器/提取器时相关
使用新的 internal: true 逻辑的 CVE-2023-6553 示例如下: