4.5 KiB
Blocking main page to steal postmessage
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Winning RCs with Iframes
According to this Terjanq writeup blob documents created from null origins are isolated for security benefits, which means that if you maintain busy the main page, the iframe page is going to be executed.
基本的にこのチャレンジでは、孤立したiframeが実行され、読み込まれた後に親ページがフラグを含むpostメッセージを送信します。
しかし、そのpostmessage通信はXSSに脆弱です(iframeはJSコードを実行できます)。
したがって、攻撃者の目標は親にiframeを作成させることですが、親ページが機密データ(フラグ)を送信する前にそれを忙しくさせ、ペイロードをiframeに送信させることです。親が忙しい間、iframeはペイロードを実行し、これは親のpostmessageメッセージをリッスンし、フラグを漏洩させるJSになります。
最終的に、iframeはペイロードを実行し、親ページは忙しさをやめるので、フラグを送信し、ペイロードがそれを漏洩させます。
しかし、どのようにして親をiframeを生成した直後に忙しくさせ、iframeが機密データを送信する準備ができるのを待っている間だけ忙しくさせることができるでしょうか? 基本的に、非同期のアクションを見つけて、親に実行させる必要があります。例えば、このチャレンジでは親がpostmessagesを次のようにリッスンしていました:
window.addEventListener('message', (e) => {
if (e.data == 'blob loaded') {
$("#previewModal").modal();
}
});
そのため、postmessageで大きな整数を送信することが可能であり、その比較で文字列に変換されるため、時間がかかることになります:
const buffer = new Uint8Array(1e7);
win?.postMessage(buffer, '*', [buffer.buffer]);
そして、正確にpostmessageをiframeが作成された後、しかし親からデータを受け取る準備ができる前に送信するためには、setTimeout
のミリ秒を調整する必要があります。
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.