* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Comme expliqué dans [**ce rapport**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), si vous trouvez une page qui peut être **iframée** (sans protection `X-Frame-Header`) et qui envoie des messages **sensibles** via **postMessage** en utilisant un **joker** (\*), vous pouvez **modifier** l'**origine** de l'**iframe** et **fuir** le **message sensible** vers un domaine contrôlé par vous.\
Notez que si la page peut être iframée mais que le **targetOrigin** est **défini sur une URL et non sur un joker**, cette **astuce ne fonctionnera pas**.
Notez dans ce cas comment la **première chose** que le code fait est de **vérifier l'origine**. C'est terriblement **important**, surtout si la page va faire **quelque chose de sensible** avec les informations reçues (comme changer un mot de passe). **Si elle ne vérifie pas l'origine, les attaquants peuvent faire en sorte que les victimes envoient des données arbitraires à ces points d'extrémité** et changer les mots de passe des victimes (dans cet exemple).
* Utilisez une **extension de navigateur** comme [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) ou [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). Ces extensions de navigateur **intercepteront tous les messages** et vous les montreront.
* Si **`indexOf()`** est utilisé pour **vérifier** l'**origine** de l'événement PostMessage, rappelez-vous qu'il peut être facilement contourné comme dans l'exemple suivant : `("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")`\\
* Si **`search()`** est utilisé pour **valider** l'**origine**, cela peut être insécurisé. Selon la documentation de `String.prototype.search()`, la méthode **prend un objet d'expression régulière** au lieu d'une chaîne. Si autre chose qu'une expression régulière est passé, il sera implicitement converti en une expression régulière.\
Dans une expression régulière, **un point (.) est traité comme un caractère générique**. Un attaquant peut en profiter et **utiliser** un **domaine spécial** au lieu de celui officiel pour contourner la validation, comme dans : `"https://www.safedomain.com".search("www.s.fedomain.com")`.\\
* Si la fonction **`escapeHtml`** est utilisée, la fonction ne crée pas un nouvel objet échappé, mais elle **écrase les propriétés** de l'objet existant. Cela signifie que si nous sommes capables de créer un objet avec une propriété contrôlée qui ne répond pas à `hasOwnProperty`, elle ne sera pas échappée.
L'objet `File` est parfait pour cette exploitation car il possède une propriété en lecture seule `name` qui est utilisée par notre modèle et contournera la fonction `escapeHtml`.
Lorsqu'une page est intégrée dans une **iframe sandboxée** via `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">`, l'**origine** de cette **iframe** sera **`null`**.
Lorsque la valeur de **sandbox `allow-popups` est définie**, la **popup ouverte****héritera** de tous les **attributs sandboxés** sauf si `allow-popups-to-escape-sandbox` est défini.\
Ainsi, l'ouverture d'une **popup** à partir d'une **origine nulle** rendra également **`window.origin`** à l'intérieur de la popup **`null`**.
Par conséquent, si vous ouvrez une **iframe sandboxée** autorisant les popups, puis vous **ouvrez une popup** à partir de l'intérieur de l'iframe, et **envoyez un message** de l'iframe **à la popup**, les deux origines sont nulles, donc: **`e.origin == window.origin == null`**
Vous pouvez forcer **`e.source`** d'un message à être nul en créant une **iframe** qui **envoie** le **postMessage** et est **immédiatement supprimée**.
Pour effectuer ces attaques, vous pourrez idéalement **mettre la page web victime** à l'intérieur d'un `iframe`. Mais certains en-têtes comme `X-Frame-Header` peuvent **empêcher** ce **comportement**.\
Dans ces scénarios, vous pouvez toujours utiliser une attaque moins furtive. Vous pouvez ouvrir un nouvel onglet vers l'application web vulnérable et communiquer avec elle:
Sur la page suivante, vous pouvez voir comment vous pourriez voler des données sensibles envoyées par **postmessage** à un **iframe enfant** en **bloquant** la **page principale** avant d'envoyer les données et en exploitant un **XSS dans l'enfant** pour **fuir les données** avant qu'elles ne soient reçues :
Si vous pouvez inclure une page web sans en-tête X-Frame qui contient un autre iframe, vous pouvez **changer l'emplacement de cet iframe enfant**, donc si elle reçoit un **postmessage** envoyé en utilisant un **joker**, un attaquant pourrait **changer** l'**origine** de cet iframe vers une page **contrôlée** par lui et **voler** le message :
Dans les scénarios où les données envoyées via `postMessage` sont exécutées par JS, vous pouvez **inclure** la **page** et **exploiter** la **pollution de prototype/XSS** en envoyant l'exploit via `postMessage`.
Un couple de **XSS très bien expliqués via `postMessage`** peuvent être trouvés dans [https://jlajara.gitlab.io/web/2020/07/17/Dom\_XSS\_PostMessage\_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom\_XSS\_PostMessage\_2.html)
* Lien vers la page sur la [**pollution de prototype**](../deserialization/nodejs-proto-prototype-pollution/)
* Lien vers la page sur le [**XSS**](../xss-cross-site-scripting/)
* Lien vers la page sur la [**pollution de prototype côté client vers XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).