nuclei

非常优秀的漏洞扫描工具,值得学习!


免责声明

本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.


项目地址

语法规则

  • https://nuclei.projectdiscovery.io/templating-guide

  • https://nuclei.projectdiscovery.io/template-examples/http/

模板库

相关文章


安装及维护

安装

  • 二进制文件安装

    1. 从 Releases 页面下载已经构建好的二进制文件压缩包

  • 源码安装

  • 编译安装

  • 基于 docker

模板库更新

该命令会从 https://github.com/projectdiscovery/nuclei-templates 模板库中下载最新版本

命令参数

命令
描述
例子

bulk-size

每个模板最大并行的主机数 (默认 25)

nuclei -bulk-size 25

burp-collaborator-biid

使用 burp-collaborator 插件

nuclei -burp-collaborator-biid XXXX

c

并行的最大模板数量 (默认 10)

nuclei -c 10

l

对 URL 列表进行测试

nuclei -l urls.txt

target

对目标进行测试

nuclei -target hxxps://example.com

t

要检测的模板种类

nuclei -t git-core.yaml -t cves/

no-color

输出不显示颜色

nuclei -no-color

no-meta

不显示匹配的元数据

nuclei -no-meta

json

输出为 json 格式

nuclei -json

include-rr

json 输出格式中包含请求和响应数据

nuclei -json -include-rr

o

输出为文件

nuclei -o output.txt

project

避免发送相同的请求

nuclei -project

stats

使用进度条

nuclei -stats

silent

只输出测试成功的结果

nuclei -silent

retries

失败后的重试次数

nuclei -retries 1

timeout

超时时间 (默认为 5 秒)

nuclei -timeout 5

trace-log

输出日志到 log 文件

nuclei -trace-log logs

rate-limit

每秒最大请求数 (默认 150)

nuclei -rate-limit 150

severity

根据严重性选择模板

nuclei -severity critical,high

stop-at-first-match

第一次匹配不要处理 HTTP 请求

nuclei -stop-at-frst-match

exclude

排除的模板或文件夹

nuclei -exclude panels -exclude tokens

debug

调试请求或者响应

nuclei -debug

update-templates

下载或者升级模板

nuclei -update-templates

update-directory

选择储存模板的目录 (可选)

nuclei -update-directory templates

tl

列出可用的模板

nuclei -tl

templates-version

显示已安装的模板版本

nuclei -templates-version

v

显示发送请求的详细信息

nuclei -v

version

显示 nuclei 的版本号

nuclei -version

proxy-url

输入代理地址

nuclei -proxy-url hxxp://127.0.0.1:8080

proxy-socks-url

输入 socks 代理地址

nuclei -proxy-socks-url socks5://127.0.0.1:8080

H

自定义请求头

nuclei -H "x-bug-bounty:hacker"


使用

运行单个模板

对 urls.txt 中所有的主机运行 git-core.yaml 并返回结果到 results.txt

这将对 urls.txt 中所有的主机运行 git-core.yaml 并返回结果到 results.txt

你可以轻松的通过管道使用标准的输入 (STDIN) 传递 URL 列表。

Nuclei 可以接受如下列表的 URL 作为输入,例如以下 URL:

运行多个模板

这将会对 urls.txt 中所有的 URL 运行 cvesfiles 模板检查,并返回输出到 results.txt

组合运行

docker 调用

urls.txt 中的 URL 通过 docker 中的 nuclei 进行检测,并将结果输出到本机的 results.txt 文件:

记得更改本机的模板路径


使用优化

速率限制

Nuclei 有多种控制速率的方法,包括并行执行多个模板、并行检查多个主机,以及使 nuclei 限制全局的请求速率,下面就是示例。

  • -c 参数 - 限制并行的模板数

  • -bulk-size 参数 - 限制并行的主机数

  • -rate-limit 参数 - 全局速率限制

如果你想快速扫描或者控制扫描,请使用这些标志并输入限制数,速率限制 只保证控制传出的请求,与其他参数无关。

排除模板

Nuclei模板 包含多种检查,其中有许多对攻击有用的检查,但并不是都有用的。如果您只希望扫描少数特定的模板或目录,则可以使用如下的参数筛选模板,或将某些模板排除。

  • 排除模板运行

    我们不建议同时运行所有的 nuclei 模板,如果要排除模板,可以使用 exclude 参数来排除特定的目录或模板。

    注意:如上述示例中显示的那样,目录和特定模板都将不会扫描

  • 基于严重性运行模板

    您可以根据模板的严重性运行模板,扫描时可以选择单个严重性或多个严重性。

    上面的例子将运行 cves 目录下所有 严重中等 的模板。

    上面的例子将运行 panelstechnologies 目录下严重性标记为 info 的模板

  • 使用 .nuclei-ignore 文件排除模板

    自从 nuclei 的 v2.1.1 版本 以来,我们添加了对 .nuclei-ignore 文件的支持,该文件与 update-templates 参数一起使用,在 .nuclei-ignore 文件中,您可以定义要从 nuclei 扫描中排除的所有模板目录或者模板路径,要开始使用此功能,请确保使用 nuclei-update-templates 参数安装 nuclei 模板,现在可以根据 .nuclei-ignore 的文件来添加、更新、删除模板文件。

    默认的 nuclei 忽略列表可以访问 这里 ,如果不想排除任何内容,只需要删除 .nuclei-ignore 文件。

挂代理

调试

其他

file

workflow


模板语法总结


保留字


基础模板

ffffffff0x 风格

官方风格


开头


请求

Get

POST

RAW

跳转

stop-at-first-match

Same support as we have via flag using -stop-at-first-match flag, will be helpful for the case where we have multiple possible paths for same file, in cases where we found matches at the start, we can avoid making additional requests.

大意就是一个模板里有多个扫描路径,当第一个命中时,自动停止后面几个路径的扫描,当然这个不会影响其他模板.

OOB

自 Nuclei v2.3.6 发行以来,Nuclei 支持使用 interact.sh API 内置自动请求关联来实现基于 OOB 的漏洞扫描。就像 {{interactsh-url}} 在请求中的任何位置编写并为添加匹配器一样简单 interact_protocol。Nuclei 将处理交互作用与模板的相关性,以及通过允许轻松进行 OOB 扫描而生成的请求的相关性。

linux

windows

JAVA反序列化

  • https://nuclei.projectdiscovery.io/templating-guide/helper-functions/#deserialization-helper-functions


读取大小


skip-variables-check

what if my payload contains {{payload here}} and that is not cli env var. Can i escape it or somehow disable nuclei vars detection ?

当你的请求内容里包含 {{ 时,会被 nuclei 解析为变量,加这个就是告诉nuclei不要解析.


匹配

匹配时间

重命名

匹配大小

提取器

提取器案例2

提取器案例3

以下是使用否定条件的示例语法,这将返回响应 header 中没有 phpsessID 的所有 URL。

一个简单的判断蜜罐的示例

Dynamic variabe


爆破

pitchfork


常用匹配

etc/passwd

c:/windows/win.ini

windows 回显

linux 回显


进阶用法

全局请求头

当目标采用 Basic Auth , 可以直接在调用的命令中加上全局请求头,而不用修改每个模板

Reusing dynamically extracted values as iterators in http request

  • https://github.com/projectdiscovery/nuclei/pull/1288

对 robots.txt 内容进行抓取并运用于下一个请求

help_functions

嵌套表达式

在 extractor 中使用

  • https://github.com/projectdiscovery/nuclei/discussions/1622

self-contained

A new attribute to HTTP requests that marks all the HTTP Requests in that template as self-sufficient, meaning they do not require any input to be executed.

这个用的比较局限,一般就是用于批量检测 API 可用性的,举个例子,你通过信息泄露获得了一个 API_Key 但你不知道这个是哪个服务的 APIkey,没有特征,那么就只能找哪些官方API接口一个一个试,看哪一个平台可以生效,就是这个意思。

国内环境用的不多,我对这块也没研究过.

  • https://blog.projectdiscovery.io/nuclei-v2-5-3-release/

文件协议

The default file size of the file template read is 1GB

文件模板默认读取的文件大小 1GB

  • https://github.com/projectdiscovery/nuclei/pull/1577

网络层

自定义模版变量

自 2.6.9 版本开始支持


需要验证的问题

  • 多个工作流模板之间是否可以进行请求合并

    • 截至 2.5.4 支持了单个工作流模板的请求合并,多个工作流模板的请求合并并不支持

    • https://github.com/projectdiscovery/nuclei/issues/1379

      • 2.8 疑似已解决(并没有😢)

  • 对于网络层的探测是否可以通过调用外部库来获得结果

    • issue 里官方有提,但目前没有进一步计划

    • 想要参考 fapro

    • https://github.com/projectdiscovery/network-fingerprint

  • 值的管道用法

    • 单模板内可传递,多模板之间不可传递

  • BS版本 nuclei/api

    • 目前不支持