hacktricks/src/pentesting-web/postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md

31 lines
2.2 KiB
Markdown

# Blocking main page to steal postmessage
{{#include ../../banners/hacktricks-training.md}}
## Winning RCs with Iframes
Kulingana na hii [**Terjanq writeup**](https://gist.github.com/terjanq/7c1a71b83db5e02253c218765f96a710) hati za blob zilizoundwa kutoka kwa asili za null zimewekwa mbali kwa faida za usalama, ambayo inamaanisha kwamba ikiwa utaweka ukurasa mkuu kuwa na shughuli nyingi, ukurasa wa iframe utaanzishwa.
Kimsingi katika changamoto hiyo **iframe iliyotengwa inatekelezwa** na mara **baada** ya **kupakuliwa** ukurasa wa **mzazi** uta **tuma ujumbe wa post** na **bendera**.\
Hata hivyo, mawasiliano ya postmessage ni **hayana usalama dhidi ya XSS** (**iframe** inaweza kutekeleza msimbo wa JS).
Kwa hivyo, lengo la mshambuliaji ni **kuruhusu mzazi kuunda iframe**, lakini **kabla** ya kuruhusu ukurasa wa **mzazi** **kutuma** data nyeti (**bendera**) **uweke shughuli nyingi** na utume **payload kwa iframe**. Wakati **mzazi ana shughuli nyingi** **iframe inatekeleza payload** ambayo itakuwa ni JS itakayokuwa inasikiliza ujumbe wa **postmessage wa mzazi na kuvuja bendera**.\
Hatimaye, iframe imekamilisha payload na ukurasa wa mzazi unakoma kuwa na shughuli nyingi, hivyo unatumia bendera na payload inavuja.
Lakini unaweza vipi kufanya mzazi kuwa **na shughuli nyingi mara tu baada ya kuunda iframe na wakati tu inasubiri iframe iwe tayari kutuma data nyeti?** Kimsingi, unahitaji kutafuta **kitendo** cha **async** ambacho unaweza kumfanya mzazi **atekeleze**. Kwa mfano, katika changamoto hiyo mzazi alikuwa **akisikiliza** **postmessages** kama hii:
```javascript
window.addEventListener("message", (e) => {
if (e.data == "blob loaded") {
$("#previewModal").modal()
}
})
```
ilikuwa inawezekana kutuma **nambari kubwa katika postmessage** ambayo itakuwa **imebadilishwa kuwa mfuatano** katika kulinganisha hiyo, ambayo itachukua muda:
```bash
const buffer = new Uint8Array(1e7);
win?.postMessage(buffer, '*', [buffer.buffer]);
```
Na ili uwe sahihi na **tuma** hiyo **postmessage** mara tu **iframe** inapotengenezwa lakini **kabla** ya kuwa **tayari** kupokea data kutoka kwa mzazi, utahitaji **kucheza na milisekunde za `setTimeout`**.
{{#include ../../banners/hacktricks-training.md}}