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

31 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Блокування головної сторінки для крадіжки postmessage
{{#include ../../banners/hacktricks-training.md}}
## Перемога RC з Iframes
Згідно з цим [**описом Terjanq**](https://gist.github.com/terjanq/7c1a71b83db5e02253c218765f96a710), блоб-документи, створені з нульових джерел, ізольовані для безпеки, що означає, що якщо ви зайняті головною сторінкою, сторінка iframe буде виконана.
В основному, в цьому виклику **ізольований iframe виконується**, і відразу **після** його **завантаження** **батьківська** сторінка **надішле** повідомлення post з **флагом**.\
Однак, ця комунікація postmessage є **вразливою до XSS** (**iframe** може виконувати JS-код).
Отже, мета зловмисника полягає в тому, щоб **дозволити батьківській сторінці створити iframe**, але **перед тим**, як **батьківська** сторінка **надішле** чутливі дані (**флаг**), **тримати її зайнятою** і надіслати **payload до iframe**. Поки **батьківська сторінка зайнята**, **iframe виконує payload**, який буде деяким JS, що слухатиме **повідомлення postmessage батьківської сторінки і витікатиме флаг**.\
Нарешті, iframe виконав payload, і батьківська сторінка перестає бути зайнятою, тому вона надсилає флаг, а payload його витікає.
Але як ви могли б змусити батьківську сторінку бути **зайнятою відразу після того, як вона згенерувала iframe і лише поки чекає, щоб iframe був готовий надіслати чутливі дані?** В основному, вам потрібно знайти **асинхронну** **дію**, яку ви могли б змусити батьківську сторінку **виконати**. Наприклад, в цьому виклику батьківська сторінка **слухала** **postmessages** ось так:
```javascript
window.addEventListener("message", (e) => {
if (e.data == "blob loaded") {
$("#previewModal").modal()
}
})
```
отже, було можливим надіслати **велике ціле число в postmessage**, яке буде **перетворено в рядок** в цьому порівнянні, що займе деякий час:
```bash
const buffer = new Uint8Array(1e7);
win?.postMessage(buffer, '*', [buffer.buffer]);
```
І щоб бути точним і **надіслати** це **postmessage** одразу **після** створення **iframe**, але **до** того, як він буде **готовий** отримати дані від батьківського елемента, вам потрібно буде **погратися з мілісекундами `setTimeout`**.
{{#include ../../banners/hacktricks-training.md}}