Blocking main page to steal postmessage

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Gewinnen von RCs mit Iframes

Gemäß diesem Terjanq-Bericht werden aus null Ursprüngen erstellte Blob-Dokumente aus Sicherheitsgründen isoliert, was bedeutet, dass die iframe-Seite ausgeführt wird, solange die Hauptseite beschäftigt ist.

Im Wesentlichen wird in dieser Herausforderung eine isolierte iframe-Seite ausgeführt und unmittelbar danach, wenn sie geladen ist, sendet die übergeordnete Seite eine postMessage mit der Flagge. Diese postMessage-Kommunikation ist jedoch anfällig für XSS (die iframe kann JS-Code ausführen).

Das Ziel des Angreifers ist es daher, die übergeordnete Seite die iframe-Seite erstellen zu lassen, aber bevor sie die sensiblen Daten (Flagge) sendet, sie beschäftigt zu halten und die Payload an die iframe-Seite zu senden. Während die übergeordnete Seite beschäftigt ist, führt die iframe-Seite die Payload aus, die JS-Code enthält, der auf die postMessage-Nachricht der übergeordneten Seite lauscht und die Flagge preisgibt. Schließlich hat die iframe-Seite die Payload ausgeführt und die übergeordnete Seite hört auf, beschäftigt zu sein, sodass sie die Flagge sendet und die Payload sie preisgibt.

Aber wie können Sie die übergeordnete Seite direkt nach der Erzeugung der iframe-Seite blockieren und nur während des Wartens auf die Bereitschaft der iframe-Seite, die sensiblen Daten zu senden, beschäftigt halten? Im Wesentlichen müssen Sie eine asynchrone Aktion finden, die die übergeordnete Seite ausführt. In dieser Herausforderung hat die übergeordnete Seite beispielsweise auf postMessages wie folgt gehört:

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 bei diesem Vergleich in einen String umgewandelt wird und dadurch einige Zeit in Anspruch nimmt:

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

Und um präzise zu sein und diese postmessage genau nach der Erstellung des iframes, aber vor dem Zeitpunkt, an dem er bereit ist, Daten vom übergeordneten Element zu empfangen, zu senden, müssen Sie mit den Millisekunden eines setTimeout spielen.

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Last updated