使用Nuclei v3.2 模糊测试未知漏洞

使用Nuclei v3.2 模糊测试未知漏洞

模糊测试概念

学习使用 Nuclei 进行 HTTP 请求的模糊测试

Nuclei 支持基于 HTTP 请求的模糊测试,这是根据在 HTTP 请求的模糊测试部分定义的规则进行的。这允许创建通用 Web 应用程序漏洞(如 SQLi、SSRF、CMDi 等)的模板,而无需了解目标的任何信息,就像传统的 Web 模糊测试器一样。我们将这个概念称为未知漏洞的模糊测试。

概述

Nuclei v3.2.0 代表了模糊测试功能的重大进步。此版本引入了对制作模糊测试模板的完整支持,涵盖从 Proxify、httpx 和 Burp Suite 等工具导入 HTTP 流量到从 OpenAPI 和 Swagger 等 API 模式文件生成请求的所有内容。让我们更详细地探索 Nuclei v3.2.0 中的模糊测试增强功能!

nuclei -l fuzzplayground-proxify.yaml -im yaml -t fuzz/

                     __ _
   ____ __ _______/ /__ (_)
  / __ \/ / / / ___/ / _ \/ /
 / / / / /_/ / /__/ / __/ /
/_/ /_/\__,_/\___/_/\___/_/ v3.2.0-dev

        projectdiscovery.io

[INF] Current nuclei version: v3.2.0 (latest)
[INF] Current nuclei-templates version: v9.7.7 (latest)
[WRN] Scan results upload to cloud is disabled.
[INF] New templates added in latest release: 82
[INF] Templates loaded for current scan: 14
[WRN] Executing 15 unsigned templates. Use with caution.
[INF] Targets loaded for current scan: 9
[fuzz-query-num] [http] [info] http://127.0.0.1:8082/blog/post?postId=200&source=proxify
[fuzz-body-generic] [http] [info] http://127.0.0.1:8082/user
[body-params-error-sqli] [http] [info] http://127.0.0.1:8082/user       
[path-based-sqli] [http] [info] http://127.0.0.1:8082/user/55%2520OR%2520True/profile
[fuzz-body-generic] [http] [info] http://127.0.0.1:8082/user
[fuzz-query-num] [http] [info] http://127.0.0.1:8082/blog/post?postId=201&source=proxify
[fuzz-body-generic] [http] [info] http://127.0.0.1:8082/user
[body-multipart-error-sqli] [http] [info] http://127.0.0.1:8082/user
[fuzz-body-generic] [http] [info] http://127.0.0.1:8082/user
[cookie-fuzzing-error-sqli] [http] [info] http://127.0.0.1:8082/blog/posts
[host-header-injection] [http] [info] http://127.0.0.1:8082/host-header-lab

什么是模糊测试?

模糊测试是一种通过采用既定的策略和方法(通常称为规则)来发现应用程序中未知或尚未发现的漏洞的技术。这些规则系统地应用于 HTTP 请求的不同组件,以检测应用程序响应或行为的更改。

使用Nuclei v3.2 模糊测试未知漏洞

模糊测试部件

支持的模糊测试部分

如前所述,模糊测试规则应用于 HTTP 请求的各个部分。我们将这些部分称为part:Nuclei 模板;随着 Nuclei v2.8.0 的发布,我们引入了对查询模糊测试 (Query Fuzzing part: Query) 的支持,但在此版本中,我们添加了对 HTTP 请求的所有其他部分以及抽象的支持。以下是 Nuclei v3.2.0 中支持的部件列表:

  • part: query– 查询模糊测试(在 Nuclei v2.8.0 中引入)
  • part: path– 路径模糊测试
  • part: header– 标头模糊测试
  • part: cookie– Cookie 模糊测试
  • part: body– 身体模糊测试

编写模糊测试规则时,每个规则的范围仅限于 HTTP 请求的特定部分。这意味着编写的规则part: Query将仅应用于 HTTP 请求的查询参数,而不应用于请求的任何其他部分。

HTTP 请求部分值

Query、Path、Header 和 Cookie 在 HTTP 请求中仅以固定格式表示,而 Body 则以 JSON、XML、Form、多部分表单数据等多种格式表示。通常,在编写模糊测试模板时,需要为每种格式单独编写规则,这将是一项繁琐的任务并且包含重复的规则。为了解决这个问题,

Nuclei 将每个部分的值抽象为键值对

HTTP 请求和部分示例

在下面的示例 HTTP 请求中,每个部分的键值对如下:

POST /reset-password?token=x0x0x0&source=app HTTP/1.1
Host: 127.0.0.1:8082
User-Agent: Go-http-client/1.1
Cookie: PHPSESSID=1234567890
Content-Length: 23
Content-Type: application/json
Accept-Encoding: gzip
Connection: close

{"password":"12345678"}

查询部分

关键字
tokenx0x0x0
sourceapp

路径部分

关键字
value/reset-password

header部分

关键字
Host127.0.0.1:8082
User-AgentGo-http-client/1.1
Content-Length23
Content-Typeapplication/json
Accept-Encodinggzip
Connectionclose

cookie部分

关键字
PHPSESSID1234567890

body部分

关键字
password12345678

注意: XML、JSON、表单、多部分表单数据将采用键/值格式,但如果主体是二进制或任何其他格式,则整个主体将表示为单个键值对,其中键为“值” ` 并作为整个body的值。

value \x08\x96\x01\x12\x07\x74

这种抽象显着提高了效率,因为它允许为正文创建适用于所有格式的单一规则。例如,在测试正文值中的 SQL 注入漏洞时,可以有效地利用单个规则来处理各种格式,包括 JSON、XML、表单和多部分表单数据。这种简化的方法简化了测试过程并扩大了漏洞检测的范围。

模糊测试规则类型

每个规则对值执行特定操作,nuclei 支持以下类型的规则:

  • prefix– 添加有效负载作为值的前缀
  • postfix– 将有效负载作为后缀添加到值中
  • replace– 将值替换为有效负载
  • infix– 添加有效负载作为值的中缀
  • replace-regex– 使用正则表达式将值替换为有效负载

加载 HTTP 流量

Nuclei 现在支持各种输入格式来加载 HTTP 请求,这些格式可以分为两类:

来自工具的 HTTP 流量

从 API 架构文件生成请求

  • OpenAPI
  • Swagger
  • Postman (via OpenAPI)

注意:由于 OpenAPI 是描述 RESTful API 的标准,因此其他格式和工具(例如 Postman)可以直接通过客户端应用程序或使用流行的实用工具进行转换导出到 OpenAPI。

向 Nuclei 提供 HTTP 输入

-l -list上述格式的文件可以与新标志一起提供给现有标志-im -input-mode,以指定文件的输入模式或格式。例子:

$ nuclei -l ginandjuice. proxify.jsonl -im jsonl
$  ./nuclei -h target-format
Nuclei 是一个快速的、基于模板的漏洞扫描器,重点是可配置性强、可扩展性强和易于使用。

用法:
  ./nuclei [标志]

标志:
目标格式:
   -im, -input-mode string        输入文件的模式(列表,burp,jsonl,yaml,openapi,swagger) (默认 "list")
   -ro, -required-only            仅在生成请求时使用输入格式中的必需字段
   -sfv, -skip-format-validation  解析输入文件时跳过格式验证(如丢失变量)

Nuclei 还通过新选项增强了请求生成:使用-V标志覆盖/传递变量、在请求的基本字段或所有字段之间进行选择,以及跳过格式验证以使用专用标志进行测试。

模糊测试规则格式

模糊测试规则写在HTTP 协议部分的 key 下fuzzing。以下是编写模糊规则的通用格式:

http:
    ...
    payloads:
      injection:          # 负载的变量名
        - "'"
        ...
    fuzzing:
      - part: query       # 请求的部分之一:query, path, header, cookie, body
        type: postfix     # 规则类型(前缀,后缀,替换,中缀,替换正则)
        mode: single      # 变异模式(单一,多个)(例如:一次性替换所有现有的键值对或逐个替换)
        # replace-regex: #(可选)在替换正则类型中使用的正则表达式
        # keys-regex: #(可选)使用正则表达式将此规则限制为请求部分的特定键
        # keys: #(可选)将此规则限制为请求部分的特定键
        # values: #(可选)使用正则表达式将此规则限制为请求部分的特定值
        fuzz:
          - '{{injection}}' # 要注入的有效负载

过滤器

由于 Nuclei 现在支持 HTTP 请求所有段的各种输入格式和规则,因此制定任何规则似乎都很简单。然而,有一个重要的方面需要考虑:管理请求量或噪音的挑战。具体来说,当对受 Web 应用程序防火墙 (WAF) 保护的目标进行模糊测试时,不加区别的模糊测试可能会导致 IP 封禁等问题。减轻这种担忧的最有效策略是明智地使用模糊测试,这就是过滤器的作用变得至关重要的地方。过滤器评估是否应针对特定 HTTP 请求激活特定的模糊测试模板,以确保有针对性且有效的模糊测试实践。

过滤器可以被认为是核模板中匹配器的双胞胎。它们支持所有匹配器类型,包括 DSL,唯一的区别是每种类型的用途。


注意:
目前,只有标头、主机、输入、方法、路径等请求数据可用,但很快,一旦添加了随请求一起加载响应的支持,响应数据将可用。

这是一个基本过滤器,仅在请求为 POST 并且必须具有某些正文时才执行此模板:

  - filters:
      - type: dsl
        dsl:
          - method == POST
          - len(body) > 0
        condition: and

提示:编写/执行模板时,您可以-v -svd在应用过滤器之前使用标志来查看过滤器中可用的所有变量。

示例模板

正文中基于错误的 SQLi

以下模板配置为在使用 POST 方法且具有非空正文的所有请求上运行。它将指定的有效负载作为后缀附加到主体中的每个值。

http:
    # 过滤器检查模板是否应该在给定的请求上执行
  - filters:
      - type: dsl
        dsl:
          - method == POST
          - len(body) > 0
        condition: and
    # 将用于模糊测试的有效负载
    payloads:
      injection: # 有效负载的变量名
        - "'"
        - "\""
        - ";"
    # 模糊测试规则
    fuzzing:
      - part: body  # 此规则将应用于Body
        type: postfix # 后缀类型的规则(即,有效负载将被添加到现有值的末尾)
        mode: single  # 单一模式(即,现有值将逐个替换)
        fuzz:         # 要注入的有效负载的格式
          - '{{injection}}' # 在这里,我们直接使用了注入变量的值

完整模板请参见body-error-sqli.yaml

主机头注入

主机标头注入是攻击者注入恶意主机标头的漏洞,通常通过 HTTP 请求走私或重置密码中毒等技术来利用。所描述的模板旨在通过篡改重置密码请求中的主机标头来利用此漏洞,通过更新的代理标头将它们重定向到攻击者控制下的服务器。

http:
    # 过滤器确定模板是否应该被执行
  - filters:
      - type: dsl
        dsl:
          - 'method == "POST"'       # 仅在方法为 POST 时运行
          - 'contains(path,"reset")' # 仅在路径包含 reset 字词时运行
        condition: and
    # 模糊测试规则
    fuzzing:
      - part: header # 此规则将应用于头部
        type: replace # 替换类型的规则(即,现有值将被替换为有效负载)
        mode: multiple # 多个模式(即,所有现有值将一次性被替换/使用)
        fuzz:
          X-Forwarded-For: "{{domain}}"  # 在这里,{{domain}} 是攻击者控制的服务器
          X-Forwarded-Host: "{{domain}}"
          Forwarded: "{{domain}}"
          X-Real-IP: "{{domain}}"
          X-Original-URL: "{{domain}}"
          X-Rewrite-URL: "{{domain}}"
          Host: "{{domain}}"

与之前的模板相比,这里需要注意的一个区别是,我们没有直接使用有效负载并在模糊测试中指定键/值对。这是因为我们尝试添加或替换fuzzHTTP 请求中的键下指定的多个标头,而不是更新。💡

提示:在编写模糊测试模板时,如果要添加新的键值对而不是更新现有值,则应在 HTTP 请求中的 key 下指定键值对fuzz,如上例所示。

了解更多

您可以在此处阅读有关模糊测试的更新文档

除了支持扫描目标之外,Nuclei v3.2.0 还包括许多主要增强功能:

结论

Nuclei v3.2 代表了模糊测试功能的重大进步,融合了使您能够创建自定义模糊测试模板的基本功能。此外,我们还引入了从一系列工具导入 HTTP 流量并根据 API 架构文件生成请求的功能。我们相信这些增强功能将被证明是无价的,我们热切期待见证您利用它们的创新方式。

Nuclei v3.2下载地址

转载请注明出处及链接

from

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注