Blocage de la page principale pour voler le postmessage

Reading time: 3 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Gagner des RC avec des Iframes

Selon ce rapport de Terjanq, les documents blob crĂ©Ă©s Ă  partir d'origines nulles sont isolĂ©s pour des raisons de sĂ©curitĂ©, ce qui signifie que si vous maintenez occupĂ©e la page principale, la page iframe va ĂȘtre exĂ©cutĂ©e.

Fondamentalement, dans ce défi, un iframe isolé est exécuté et juste aprÚs qu'il soit chargé, la page parente va envoyer un post message avec le flag.
Cependant, cette communication postmessage est vulnérable à XSS (l'iframe peut exécuter du code JS).

Par conséquent, l'objectif de l'attaquant est de laisser la page parente créer l'iframe, mais avant de laisser la page parente envoyer les données sensibles (flag), la garder occupée et envoyer le payload à l'iframe. Pendant que la page parente est occupée, l'iframe exécute le payload qui sera un JS qui écoutera le message postmessage de la page parente et volera le flag.
Enfin, l'iframe a exĂ©cutĂ© le payload et la page parente cesse d'ĂȘtre occupĂ©e, donc elle envoie le flag et le payload le vole.

Mais comment pourriez-vous faire en sorte que la page parente soit occupĂ©e juste aprĂšs avoir gĂ©nĂ©rĂ© l'iframe et juste pendant qu'elle attend que l'iframe soit prĂȘte Ă  envoyer les donnĂ©es sensibles ? Fondamentalement, vous devez trouver une action async que vous pourriez faire exĂ©cuter Ă  la page parente. Par exemple, dans ce dĂ©fi, la page parente Ă©coutait les postmessages comme ceci :

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

il Ă©tait donc possible d'envoyer un grand entier dans un postmessage qui sera converti en chaĂźne dans cette comparaison, ce qui prendra un certain temps :

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

Et pour ĂȘtre prĂ©cis et envoyer ce postmessage juste aprĂšs la crĂ©ation de l'iframe mais avant qu'il soit prĂȘt Ă  recevoir les donnĂ©es du parent, vous devrez jouer avec les millisecondes d'un setTimeout.

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks