Shikata Ga Nai

Private? There is no such things.

HTTPリクエスト・スマグリング検出ツールの仕組みを理解する

Hello there, ('ω')ノ

HTTPリクエスト・スマグリング(HRS)は、フロントエンドとバックエンドの リクエスト解釈の食い違い を突いて「隠れたリクエスト」を密輸する攻撃です。2005年に最初に報告され、2019年には James Kettle(@albinowax)が DEF CON / Black Hat で再び注目させました。

ここでは、攻撃者がどのように脆弱性を検出するか、そして紹介されている Python ツールがどのように動作するのかを、初心者にもわかりやすく解説します。


なぜ時間遅延で検出できるのか?

攻撃者は「フロントとバックでリクエストの終わりをどう解釈するか」を揺さぶります。その結果、サーバーが次のリクエストを待ち続けて応答が遅れることがあります。これが検出のサインです。


代表的な2つの手法

1. CL.TE(Content-Length と Transfer-Encoding の食い違い)

例リクエスト:

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 5
Transfer-Encoding: chunked

1
Z
Q
  • フロントエンド:Content-Length=5 を信じて「Z」まで処理
  • バックエンド:chunked を信じて「Q」を待つ
  • 結果:バックエンドが「まだ続きが来るはず」と待ち続け、応答が遅れる

2. TE.CL(Transfer-Encoding と Content-Length の食い違い)

例リクエスト:

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 6
Transfer-Encoding: chunked

0

G
  • フロントエンド:0 チャンクでリクエスト終了と判断
  • バックエンド:Content-Length=6 を信じて「G」を待つ
  • 結果:バックエンドが追加データを待ってしまい応答遅延

Python 検出ツールの仕組み

作者は PortSwigger の研究を参考に、自動でこれらの矛盾リクエストを送信し、応答時間を測定するツールを作成しました。

特徴

  • 37種類のペイロードを組み合わせて試行
  • 単一URL / 複数URLに対応
  • リトライ機能(--retry)で再送 → 精度向上
  • CL.TE / TE.CL 両方に対応した検出ロジック

インストール手順

git clone https://github.com/anshumanpattnaik/http-request-smuggling.git
cd http-request-smuggling
pip3 install -r requirements.txt

使い方の例

単一URLをスキャン:

python3 smuggle.py -u https://target.com

複数URLをスキャン:

python3 smuggle.py -urls urls.txt

オプション例:

  • -t TIMEOUT :応答待ち時間(デフォルト10秒)
  • -m METHOD :GET / POST の切り替え(デフォルトPOST)
  • -r RETRY :再送回数(デフォルト2回)

注意点(攻撃者のリスク)

  • 許可なく実行するのは違法:検出用でも不正アクセス禁止法に抵触する可能性がある
  • バックエンドを「汚染」するリスク:中途半端なペイロードが残ると、正規ユーザーが攻撃用レスポンスを見てしまう
  • 時間ベース検出は誤検知あり:本当に脆弱性があるかは Burp Suite の Turbo Intruder などで確認が必要

まとめ:攻撃者の思考プロセス

  1. 矛盾を生むリクエストを投げる(CL.TE / TE.CL)
  2. 応答遅延を観察する(ズレの兆候)
  3. ペイロードを繰り返し試す(精度を上げる)
  4. 確実性を高めるために手動ツールで再確認

攻撃者は「応答の遅さ」を弱点発見の指標にします。つまり、防御側もログや遅延を監視すれば、攻撃の兆候を早期に検知できるのです。

Best regards, (^^ゞ