utsuroi cache poisoning labsLab 01 / 5 — Practitioner
01

X-Forwarded-Host で全ユーザに XSS を配信

Mass-distributing XSS via cache poisoning

うつろい EC のホームページ /home は CDN にキャッシュされている。アプリは X-Forwarded-Host ヘッダから「正規ホスト名」を取得して、<script src="https://{host}/static/main.js"> を生成する(リバースプロキシ越しのために便利機能として実装)。

CDN 側のキャッシュキーは URL のみ(X-Forwarded-Host は含まない)。攻撃者が改ざんしたヘッダで1回リクエストすると、その後の全ユーザに同じレスポンスが配信される。

X-Forwarded-Host を改ざんしてキャッシュを汚染し、後続の正規ユーザに攻撃者ドメインの JavaScript を読み込ませてください。

CDN キャッシュの状態

Cache Key: shop.utsuroi.example.com/home
(まだキャッシュされていません)

後続の正規ユーザのリクエスト

脆弱な構成
// アプリ側 - X-Forwarded-Host を信用
$host = $_SERVER['HTTP_X_FORWARDED_HOST'] ?? $_SERVER['HTTP_HOST'];
echo "<script src='https://$host/static/main.js'></script>";

// CDN 側 - キャッシュキーは URL のみ
cache_key = method + host + path + query
// X-Forwarded-Host は含まれない

アプリは「自分は CDN の後ろにある」と前提し、X-Forwarded-Host を「実際のクライアントホスト」と解釈。CDN は「URL が同じならキャッシュヒット」と判断。両者の前提が噛み合っていない。