Shikata Ga Nai

Private? There is no such things.

Web cache poisoning with an unkeyed headerをやってみた

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