Blocking main page to steal postmessage

Support HackTricks

Winning RCs with Iframes

Laut diesem Terjanq writeup werden Blobs, die aus null Ursprüngen erstellt wurden, aus Sicherheitsgründen isoliert, was bedeutet, dass, wenn Sie die Hauptseite beschäftigt halten, die Iframe-Seite ausgeführt wird.

Im Grunde genommen wird in dieser Herausforderung ein isoliertes Iframe ausgeführt und direkt nachdem es geladen wurde, wird die Eltern-Seite eine post-Nachricht mit dem Flag senden. Diese postmessage-Kommunikation ist jedoch anfällig für XSS (das iframe kann JS-Code ausführen).

Daher besteht das Ziel des Angreifers darin, die Elternseite das Iframe erstellen zu lassen, aber bevor die Eltern-Seite die sensiblen Daten (Flag) sendet, sie beschäftigt zu halten und die Payload an das Iframe zu senden. Während die Elternseite beschäftigt ist, führt das Iframe die Payload aus, die ein JS sein wird, das auf die postmessage-Nachricht der Elternseite hört und das Flag leakt. Schließlich hat das Iframe die Payload ausgeführt und die Elternseite hört auf, beschäftigt zu sein, sodass sie das Flag sendet und die Payload es leakt.

Aber wie könnten Sie die Elternseite beschäftigt machen, direkt nachdem sie das Iframe generiert hat und nur während sie darauf wartet, dass das Iframe bereit ist, die sensiblen Daten zu senden? Im Grunde genommen müssen Sie eine asynchrone Aktion finden, die Sie die Elternseite ausführen lassen können. Zum Beispiel hörte die Elternseite in dieser Herausforderung auf postmessages wie folgt:

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

so war es möglich, eine große Ganzzahl in einer postmessage zu senden, die in diesem Vergleich in einen String umgewandelt wird, was einige Zeit in Anspruch nehmen wird:

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

Und um genau zu sein und diese postmessage genau nach der Erstellung des iframes aber vor dem bereit zu senden, um die Daten vom Elternteil zu empfangen, müssen Sie mit den Millisekunden eines setTimeout spielen.

Support HackTricks

Last updated