mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
31 lines
2.4 KiB
Markdown
31 lines
2.4 KiB
Markdown
# Blocking main page to steal postmessage
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## Winning RCs with Iframes
|
|
|
|
Laut diesem [**Terjanq writeup**](https://gist.github.com/terjanq/7c1a71b83db5e02253c218765f96a710) 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**.
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|