Hello there, ('ω')ノ
🎯 1. HTTPリクエストスマグリングとは?
HTTP Request Smuggling(リクエストスマグリング)とは、 複数のサーバ(リバースプロキシとアプリケーションサーバなど)がHTTPリクエストを異なる解釈で処理することを悪用し、 不正なリクエストをすり抜けさせる攻撃手法です。
主に次のような構成で発生: [クライアント] → [リバースプロキシ] → [Webアプリ]
🧨 2. 攻撃で可能になること
攻撃例 | 内容 |
---|---|
🔐 セッションの乗っ取り | 他ユーザのリクエストに割り込む |
🛑 リクエスト偽造(内向き攻撃) | 管理者リソースへのアクセス |
🕵️♂️ キャッシュポイズニング | プロキシのキャッシュを操作し全ユーザに影響 |
⏱️ DoS攻撃 | パイプライン処理が壊れてリクエスト停止 |
🧭 3. 対象となる構成・条件
要素 | 説明 |
---|---|
リバースプロキシ(例:Apache, Nginx) | フロントエンド |
アプリケーションサーバ(例:Tomcat, IIS, Node.js) | バックエンド |
両者でリクエストの解釈が異なる場合に発生 | |
Transfer-Encoding や Content-Length が両方使われているときが狙い目 |
🛠️ 4. 診断手順(基本)
Step 1️⃣:リクエストをBurpなどで観察
→ POST
リクエストを中心に、ヘッダに Content-Length
や Transfer-Encoding
が使われているか確認
Step 2️⃣:ヘッダをクラフトしてテスト
→ 複数の解釈をさせるために、意図的に不整合なヘッダを送る
🧪 5. 基本的な攻撃パターン
▶️ 「CL.TE」パターン(Content-Length優先 → Transfer-Encoding誤解釈)
POST / HTTP/1.1 Host: vulnerable.site Content-Length: 44 Transfer-Encoding: chunked 0 GET /admin HTTP/1.1 Host: vulnerable.site
→ プロキシは Content-Length
を使い、後ろの GET /admin
を次のリクエストとして送信
→ バックエンドは Transfer-Encoding: chunked
を解釈し、リクエストを“ねじ込まれる”
▶️ 「TE.CL」パターン(Transfer-Encoding優先 → Content-Length誤解釈)
POST / HTTP/1.1 Host: vulnerable.site Transfer-Encoding: chunked Content-Length: 6 3 abc 0 GET /admin HTTP/1.1 Host: vulnerable.site
→ バックエンドは chunked で切り分け、残りを次のリクエストとして扱う → 割り込まれたリクエストが実行される
🧰 6. 使用ツール
ツール | 用途 |
---|---|
Burp Suite Professional | 自動スキャン・リクエスト分割テスト(最強) |
Turbo Intruder(Burp拡張) | 精密タイミングテストにも対応 |
smuggler.py(by James Kettle) | CLIで自動スキャン可能 |
🔍 7. 脆弱性確認のサイン
サイン | 内容 |
---|---|
レスポンスに他人のデータ | セッション汚染の可能性 |
2つ目のリクエストの結果が返ってくる | リクエスト分割成功 |
レスポンス遅延(タイムベーステスト) | サーバが処理を待っている証拠 |
🔐 8. 防御されているか確認すべきポイント
対策 | チェック方法 |
---|---|
不正ヘッダを正しく拒否 | Transfer-Encoding + Content-Length の併用で 400 が返るか |
どちらか一方のヘッダのみ許可 | 明示的なポリシーがあるか確認 |
Webサーバとアプリケーションサーバのバージョン | 古いものは解釈不一致が起きやすい |
✅ 9. チェックリスト(診断者向け)
項目 | 内容 |
---|---|
Content-Length と Transfer-Encoding が併用されているか |
|
レスポンスのタイミングが通常より遅いか | |
意図的にリクエスト構造を壊しても通るか | |
バックエンドが異常なリクエストを正常と解釈していないか |
📌 見つけやすいヒント
- リバースプロキシ + バックエンド構成(特にAWS ELB、Cloudflare、Nginx+Node.jsなど)
- HTTPヘッダに
Transfer-Encoding: chunked
がある - 複数リクエストを1つにまとめると動きが変わる
補足: この脆弱性は特にバグを悪用するための構造理解が求められるため、 最初は Burpの自動診断機能(Professional)を活用し、ペイロード構造を学ぶのがおすすめです。
Best regards, (^^ゞ