Blocking main page to steal postmessage

Support HackTricks

Winning RCs with Iframes

Prema ovom Terjanq writeup blob dokumenti kreirani iz null izvora su izolovani zbog bezbednosnih prednosti, što znači da ako zadržite glavnu stranicu zauzetom, stranica iframe će biti izvršena.

U suštini, u tom izazovu izolovani iframe se izvršava i odmah nakon što je učitan, roditeljska stranica će poslati post poruku sa flagom. Međutim, ta postmessage komunikacija je vulnerable to XSS (iframe može izvršiti JS kod).

Stoga, cilj napadača je da omogući roditelju da kreira iframe, ali pre nego što roditeljska stranica pošalje osetljive podatke (flag) drži je zauzetom i pošalje payload u iframe. Dok je roditelj zauzet, iframe izvršava payload koji će biti neki JS koji će slušati za roditelj postmessage poruku i leakovati flag. Na kraju, iframe je izvršio payload i roditeljska stranica prestaje da bude zauzeta, tako da šalje flag i payload ga leakuje.

Ali kako biste mogli da učinite da roditelj bude zauzet odmah nakon što je generisao iframe i samo dok čeka da iframe bude spreman da pošalje osetljive podatke? U suštini, treba da pronađete async akciju koju možete naterati roditelja da izvrši. Na primer, u tom izazovu roditelj je slušao postmessages ovako:

window.addEventListener('message', (e) => {
if (e.data == 'blob loaded') {
$("#previewModal").modal();
}
});

tako da je bilo moguće poslati veliki ceo broj u postmessage koji će biti pretvoren u string u toj uporedbi, što će potrajati neko vreme:

const buffer = new Uint8Array(1e7);
win?.postMessage(buffer, '*', [buffer.buffer]);

I da biste bili precizni i poslali tu postmessage odmah nakon što je iframe kreiran, ali pre nego što bude spreman da primi podatke od roditelja, moraćete da igrate sa milisekundama setTimeout.

Support HackTricks

Last updated