Blocking main page to steal postmessage

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Wygrywanie RC za pomocą Iframes

Zgodnie z tym wpisem Terjanq dokumenty blob utworzone z pustych źródeł są izolowane ze względów bezpieczeństwa, co oznacza, że jeśli utrzymujesz zajętą główną stronę, strona iframe zostanie wykonana.

W zasadzie w tym wyzwaniu wykonywana jest izolowana strona iframe, a zaraz po jej załadowaniu strona nadrzędna wysyła wiadomość post z flagą. Jednak komunikacja postmessage jest podatna na XSS (strona iframe może wykonywać kod JS).

Dlatego celem atakującego jest pozwolić rodzicowi na utworzenie iframe, ale przed tym należy zajęć rodzica i wysłać payload do iframe. Podczas gdy rodzic jest zajęty, iframe wykonuje payload, który będzie pewnym kodem JS, który będzie nasłuchiwał na wiadomość postmessage od rodzica i wycieka flagę. W końcu iframe wykonuje payload, a strona nadrzędna przestaje być zajęta, więc wysyła flagę, a payload ją wycieka.

Ale jak można sprawić, aby rodzic był zajęty zaraz po wygenerowaniu iframe i tylko wtedy, gdy czeka na gotowość iframe do wysłania wrażliwych danych? W zasadzie musisz znaleźć asynchroniczną akcję, którą rodzic może wykonać. Na przykład, w tym wyzwaniu rodzic nasłuchiwał wiadomości postmessage w ten sposób:

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

więc było możliwe wysłanie dużej liczby całkowitej w postmessage, która zostanie przekonwertowana na ciąg znaków w tej porównaniu, co zajmie trochę czasu:

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

Aby być precyzyjnym i wysłać to postmessage zaraz po utworzeniu iframe, ale przed jego gotowością do odbierania danych od rodzica, będziesz musiał pobawić się milisekundami w funkcji setTimeout.

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Last updated