Hello there, ('ω')ノ
✅ デリミタ(区切り文字)とは?
デリミタとは、URL中で構造を区切るために使われる記号や文字列のことです。
一般的な例:
?
:パスとクエリパラメータを分ける#
:フラグメント識別子;
:あまり一般的ではないが、Java系で使われる場合がある
🧠 脆弱性の本質:デリミタの解釈の違い
キャッシュとアプリケーションが、区切り文字を異なる意味で解釈すると、Web Cache Deceptionが成立します。
🔍 具体例:/profile;foo.css
🔸 オリジンサーバー(Java Spring)
;
は 「マトリックスパラメータ」 という形式で使用されます。/profile;foo.css
→;foo.css
を無視して/profile
として処理- 結果:
/profile
の動的レスポンス(ログインユーザーの個人情報)を返す
🔹 キャッシュサーバー(一般的なCDNなど)
;
を特別な意味とは解釈せず、そのままURLの一部と扱う- パス:
/profile;foo.css
→.css
で終わる静的ファイルに見える - 結果:レスポンスがキャッシュされてしまう
💥 攻撃の流れ
- 攻撃者が被害者を
/profile;foo.css
に誘導 - 被害者のプロフィールレスポンスがキャッシュされる
- 攻撃者が同じURLにアクセスし、被害者の情報を盗み見る
⚠️ 重要なポイント
要素 | 意味 | 説明 |
---|---|---|
; |
マトリックスパラメータ区切り | Spring Frameworkのみ対応 |
.css |
静的ファイル拡張子 | キャッシュ保存のトリガーになりやすい |
/profile;foo.css |
解釈の分岐点 | アプリとキャッシュで意味が違う |
✅ 防御策
対策 | 内容 |
---|---|
サーバー側でセグメント正規化を厳密に行う | 不正なセグメントを403で拒否など |
キャッシュの拡張子依存を避ける | .css だからキャッシュするというルールは脆弱 |
セキュリティテスト時にセミコロンやパス末尾を検査 | Burp Scanner や DAST ツールで自動化可能 |
✅ まとめ
;
(セミコロン)やその他の区切り文字は、環境やフレームワークによって解釈が異なることがあります。
その結果:
- アプリは
/profile
として処理 - キャッシュは
/profile;foo.css
として処理 - → 機密情報が静的ファイルとしてキャッシュされ、情報漏洩が発生
Best regards, (^^ゞ