Blocking main page to steal postmessage

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Gagner des RC avec les Iframes

Selon ce writeup de Terjanq les blobs 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 s'exécuter.

Essentiellement, dans ce défi, une iframe isolée est exécutée et juste après son chargement, la page parent va envoyer un message post avec le drapeau. Cependant, cette communication postmessage est vulnérable au XSS (l'iframe peut exécuter du code JS).

Par conséquent, l'objectif de l'attaquant est de permettre au parent de créer l'iframe, mais avant de laisser la page parent envoyer les données sensibles (drapeau) le maintenir occupé et envoyer la charge utile à l'iframe. Pendant que le parent est occupé, l'iframe exécute la charge utile qui sera un peu de JS qui écoutera le message postmessage du parent et divulguera le drapeau. Enfin, l'iframe a exécuté la charge utile et la page parent cesse d'être occupée, donc elle envoie le drapeau et la charge utile le divulgue.

Mais comment pourriez-vous faire en sorte que le parent soit occupé juste après avoir généré l'iframe et juste pendant qu'il attend que l'iframe soit prête à envoyer les données sensibles? Fondamentalement, vous devez trouver une action asynchrone que vous pourriez faire exécuter par le parent. Par exemple, dans ce défi, le parent écoutait les postmessages comme ceci:

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

Ainsi, il était possible d'envoyer un grand entier dans un postmessage qui sera converti en chaîne de caractères dans cette comparaison, ce qui prendra du temps :

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

Et afin d'être précis et envoyer ce postmessage juste après la création de l'iframe mais avant qu'elle ne soit prête à recevoir les données du parent, vous devrez jouer avec les millisecondes d'un setTimeout.

Dernière mise à jour