Hello there, ('ω')ノ
キーのないヘッダによる Web キャッシュ ポイズニングを。
キーのないヘッダからの入力を安全でない方法で処理するため、
Web キャッシュ ポイズニングに対して脆弱で。
何の疑いも持たないユーザは定期的にサイトのホームページにアクセスして。
このラボを解決するには、訪問者のブラウザでalert(document.cookie)を
実行するレスポンスでキャッシュを毒して。
リクエストをリピータへ。
送信して、レスポンスのX-Cacheに注目して。
Cache-Controlで指定されている30秒間はキャッシュされたプールから
取得するようで。
30秒が経過するとX-Cache: missとなり、オリジンサーバから取得したことがわかり。
次のリクエストからは、X-Cache: hitなのでキャッシュされたプールから
取得されていて。
次に適当なエンドポイントを送信してみると。
X-Cache: missとなって。
ただし、エンドポイントは存在しなくて。
次にエンドポイントでなくパラメータを試すことに。
パラメータを追加するとキャッシュキーとして30秒内でも
X-Cache: missとなり、違うリクエストと認識され。
X-Forwarded-Hostを追加して送信すると、X-Cache: missとはならないので
無視されるようで。
つまり、X-Forwarded-Hostの有無はキャッシュには影響ないので
被害者がサイトにアクセスした際にX-Forwarded-Hostを追加しなくても
キャッシュされたプールから取得することになって。
まずは、エンドポイントでなくパラメータ(キャッシュバスター)を試すことに。
次に送信するとキャッシュされたプールから取得されて。
さらにレスポンスの一部が、Hostヘッダの一部と合致していて。
X-Forwarded-Host: example.comを追加して送信してみると。
レスポンスに反映され、さらにはキャッシュには影響がないので。
エクスプロイトサーバにて、レスポンスのJSを起動するようにして。
単純なペイロードを設定してからStoreして。
エクスプロイトサーバのドメインをX-Forwarded-Hostに移して。
キャッシュバスターを削除してオリジナルのリクエストにもどして
X-Forwarded-Hostがレスポンスに反映されるので、
値をエクスプロイトサーバのドメインに変更して送信すると。
キャッシュにないので、X-Cache: missで。
2 回目にリクエストを送信すると、X-Cache: hitを受け取ったことがわかり。
これで同じサイトへアクセスしたすべてのリクエストは
X-Forwarded-Host パラメータが読み込まれることになって。
ブラウザをリロードするとペイロードが実行できて。
Best regards, (^^ゞ