Blocking main page to steal postmessage

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Виграш RCs з Iframes

Згідно з цим Terjanq writeup створені з нульових джерел блоб-документи ізольовані для забезпечення безпеки, що означає, що якщо ви утримуєте головну сторінку зайнятою, сторінка iframe буде виконана.

Фактично в цьому виклику виконується ізольована iframe і після її завантаження головна сторінка буде надсилати повідомлення post з прапорцем. Однак ця комунікація postmessage вразлива на XSS (iframe може виконати JS-код).

Отже, метою атакуючого є дозволити головній сторінці створити iframe, але перед тим, як головна сторінка надішле чутливі дані (прапорець), займіть її і надішліть навантаження на iframe. Поки головна сторінка зайнята, iframe виконує навантаження, яке буде деяким JS, який буде слухати повідомлення postmessage від батьківської сторінки та витікати прапорець. На завершення, iframe виконало навантаження, а головна сторінка перестає бути зайнятою, тому вона надсилає прапорець, а навантаження витікає.

Але як можна зробити головну сторінку зайнятою одразу після створення iframe і просто поки вона чекає, щоб iframe була готовою для надсилання чутливих даних? Фактично, вам потрібно знайти асинхронну дію, яку можна виконати головній сторінці. Наприклад, в цьому виклику головна сторінка слухала повідомлення postmessages таким чином:

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

таким чином, було можливо відправити велике ціле число в postmessage, яке буде перетворено на рядок у порівнянні, що займе певний час:

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

І для того, щоб бути точним і надіслати цей повідомлення після створення iframe, але перед тим, як він буде готовий приймати дані від батьківського елемента, вам потрібно поекспериментувати з мілісекундами функції setTimeout.

Last updated