Blocking main page to steal postmessage

Reading time: 3 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks

Winning RCs with Iframes

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

Im Grunde 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 ist das Ziel des Angreifers, 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 halten, 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 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:

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

Es war also 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:

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

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

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks