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, (^^ゞ