# DOM XSS
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)! * Travaillez-vous dans une **entreprise de cybersécurité**? Vous voulez voir votre **entreprise annoncée dans HackTricks**? ou voulez-vous avoir accès à la **dernière version du PEASS ou télécharger HackTricks en PDF**? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)! * Découvrez [**La famille PEASS**](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** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Partagez vos astuces de piratage en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
## Vulnérabilités DOM Les vulnérabilités DOM se produisent lorsque des données provenant de **sources** contrôlées par des attaquants (comme `location.search`, `document.referrer` ou `document.cookie`) sont transférées de manière non sécurisée vers des **sinks**. Les sinks sont des fonctions ou des objets (par exemple, `eval()`, `document.body.innerHTML`) qui peuvent exécuter ou rendre du contenu nuisible si des données malveillantes leur sont fournies. * Les **sources** sont des entrées pouvant être manipulées par des attaquants, y compris les URL, les cookies et les messages web. * Les **sinks** sont des points d'extrémité potentiellement dangereux où des données malveillantes peuvent entraîner des effets indésirables, tels que l'exécution de scripts. Le risque survient lorsque les données circulent d'une source vers un sink sans validation ou assainissement approprié, permettant des attaques telles que les XSS. {% hint style="info" %} **Vous pouvez trouver une liste plus à jour des sources et des sinks sur** [**https://github.com/wisec/domxsswiki/wiki**](https://github.com/wisec/domxsswiki/wiki) {% endhint %} **Sources courantes:** ```javascript document.URL document.documentURI document.URLUnencoded document.baseURI location document.cookie document.referrer window.name history.pushState history.replaceState localStorage sessionStorage IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB) Database ``` **Fuites courantes :** | [**Redirection ouverte**](dom-xss.md#open-redirect) | [**Injection de Javascript**](dom-xss.md#javascript-injection) | [**Manipulation de données DOM**](dom-xss.md#dom-data-manipulation) | **jQuery** | | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------- | | `location` | `eval()` | `scriptElement.src` | `add()` | | `location.host` | `constructeur Function()` | `scriptElement.text` | `after()` | | `location.hostname` | `setTimeout()` | `scriptElement.textContent` | `append()` | | `location.href` | `setInterval()` | `scriptElement.innerText` | `animate()` | | `location.pathname` | `setImmediate()` | `someDOMElement.setAttribute()` | `insertAfter()` | | `location.search` | `execCommand()` | `someDOMElement.search` | `insertBefore()` | | `location.protocol` | `execScript()` | `someDOMElement.text` | `before()` | | `location.assign()` | `msSetImmediate()` | `someDOMElement.textContent` | `html()` | | `location.replace()` | `range.createContextualFragment()` | `someDOMElement.innerText` | `prepend()` | | `open()` | `crypto.generateCRMFRequest()` | `someDOMElement.outerText` | `replaceAll()` | | `domElem.srcdoc` | **\`\`**[**Manipulation de chemin d'accès de fichier local**](dom-xss.md#local-file-path-manipulation) | `someDOMElement.value` | `replaceWith()` | | `XMLHttpRequest.open()` | `FileReader.readAsArrayBuffer()` | `someDOMElement.name` | `wrap()` | | `XMLHttpRequest.send()` | `FileReader.readAsBinaryString()` | `someDOMElement.target` | `wrapInner()` | | `jQuery.ajax()` | `FileReader.readAsDataURL()` | `someDOMElement.method` | `wrapAll()` | | `$.ajax()` | `FileReader.readAsText()` | `someDOMElement.type` | `has()` | | **\`\`**[**Manipulation de requête Ajax**](dom-xss.md#ajax-request-manipulation) | `FileReader.readAsFile()` | `someDOMElement.backgroundImage` | `constructeur()` | | `XMLHttpRequest.setRequestHeader()` | `FileReader.root.getFile()` | `someDOMElement.cssText` | `init()` | | `XMLHttpRequest.open()` | `FileReader.root.getFile()` | `someDOMElement.codebase` | `index()` | | `XMLHttpRequest.send()` | [**Manipulation de lien**](dom-xss.md#link-manipulation) | `someDOMElement.innerHTML` | `jQuery.parseHTML()` | | `jQuery.globalEval()` | `someDOMElement.href` | `someDOMElement.outerHTML` | `$.parseHTML()` | | `$.globalEval()` | `someDOMElement.src` | `someDOMElement.insertAdjacentHTML` | [**Injection JSON côté client**](dom-xss.md#client-side-sql-injection) | | **\`\`**[**Manipulation de stockage HTML5**](dom-xss.md#html-5-storage-manipulation) | `someDOMElement.action` | `someDOMElement.onevent` | `JSON.parse()` | | `sessionStorage.setItem()` | [**Injection XPath**](dom-xss.md#xpath-injection) | `document.write()` | `jQuery.parseJSON()` | | `localStorage.setItem()` | `document.evaluate()` | `document.writeln()` | `$.parseJSON()` | | **``**[**`Déni de service`**](dom-xss.md#denial-of-service)**``** | `someDOMElement.evaluate()` | `document.title` | **\`\`**[**Manipulation de cookie**](dom-xss.md#cookie-manipulation) | | `requestFileSystem()` | **\`\`**[**Manipulation de domaine de document**](dom-xss.md#document-domain-manipulation) | `document.implementation.createHTMLDocument()` | `document.cookie` | | `RegExp()` | `document.domain` | `history.pushState()` | [**Empoisonnement d'URL WebSocket**](dom-xss.md#websocket-url-poisoning) | | [**Injection SQL côté client**](dom-xss.md#client-side-sql-injection) | [**Manipulation de message Web**](dom-xss.md#web-message-manipulation) | `history.replaceState()` | `WebSocket` | | `executeSql()` | `postMessage()` | \`\` | \`\` | Le **puits `innerHTML`** n'accepte pas les éléments `script` sur les navigateurs modernes, ni les événements `svg onload`. Cela signifie que vous devrez utiliser des éléments alternatifs comme `img` ou `iframe`. Ce type de XSS est probablement le **plus difficile à trouver**, car vous devez examiner le code JS, voir s'il **utilise** un objet dont **vous contrôlez** la valeur, et dans ce cas, voir s'il existe **un moyen de l'exploiter** pour exécuter du JS arbitraire. ## Outils pour les trouver * [https://github.com/mozilla/eslint-plugin-no-unsanitized](https://github.com/mozilla/eslint-plugin-no-unsanitized) * Extension de navigateur pour vérifier chaque donnée atteignant un puits potentiel : [https://github.com/kevin-mizu/domloggerpp](https://github.com/kevin-mizu/domloggerpp) ## Exemples ### Redirection ouverte De : [https://portswigger.net/web-security/dom-based/open-redirection](https://portswigger.net/web-security/dom-based/open-redirection) Les **vulnérabilités de redirection ouverte dans le DOM** se produisent lorsqu'un script écrit des données, que un attaquant peut contrôler, dans un puits capable d'initier une navigation entre les domaines. Il est crucial de comprendre qu'exécuter du code arbitraire, tel que **`javascript:alert(1)`**, est possible si vous avez le contrôle sur le début de l'URL où se produit la redirection. Puits: ```javascript location location.host location.hostname location.href location.pathname location.search location.protocol location.assign() location.replace() open() domElem.srcdoc XMLHttpRequest.open() XMLHttpRequest.send() jQuery.ajax() $.ajax() ``` ### Manipulation de cookies À partir de : [https://portswigger.net/web-security/dom-based/cookie-manipulation](https://portswigger.net/web-security/dom-based/cookie-manipulation) Les vulnérabilités de manipulation de cookies basées sur le DOM se produisent lorsqu'un script intègre des données, contrôlables par un attaquant, dans la valeur d'un cookie. Cette vulnérabilité peut entraîner un comportement inattendu de la page web si le cookie est utilisé sur le site. De plus, elle peut être exploitée pour mener une attaque de fixation de session si le cookie est impliqué dans le suivi des sessions utilisateur. Le principal point de fuite associé à cette vulnérabilité est : Points de fuite : ```javascript document.cookie ``` ### Injection de JavaScript De: [https://portswigger.net/web-security/dom-based/javascript-injection](https://portswigger.net/web-security/dom-based/javascript-injection) Les vulnérabilités d'injection de JavaScript basées sur le DOM sont créées lorsqu'un script exécute des données, qui peuvent être contrôlées par un attaquant, en tant que code JavaScript. Sinks: ```javascript eval() Function() constructor setTimeout() setInterval() setImmediate() execCommand() execScript() msSetImmediate() range.createContextualFragment() crypto.generateCRMFRequest() ``` ### Manipulation du domaine du document De : [https://portswigger.net/web-security/dom-based/document-domain-manipulation](https://portswigger.net/web-security/dom-based/document-domain-manipulation) Les vulnérabilités de **manipulation du domaine du document** se produisent lorsqu'un script définit la propriété `document.domain` en utilisant des données qu'un attaquant peut contrôler. La propriété `document.domain` joue un **rôle clé** dans **l'application** de la **politique de même origine** par les navigateurs. Lorsque deux pages de différentes origines définissent leur `document.domain` sur la **même valeur**, elles peuvent interagir sans restrictions. Bien que les navigateurs imposent certaines **limites** sur les valeurs pouvant être attribuées à `document.domain`, empêchant l'attribution de valeurs complètement non liées à l'origine de la page réelle, des exceptions existent. En général, les navigateurs autorisent l'utilisation de **domaines enfants** ou **parent**. Sources de vulnérabilités : ```javascript document.domain ``` ### Poisoning d'URL de WebSocket From: [https://portswigger.net/web-security/dom-based/websocket-url-poisoning](https://portswigger.net/web-security/dom-based/websocket-url-poisoning) Le **poisoning d'URL de WebSocket** se produit lorsqu'un script utilise **des données contrôlables comme URL cible** pour une connexion WebSocket. Sinks: Le constructeur `WebSocket` peut entraîner des vulnérabilités de poisoning d'URL de WebSocket. ### Manipulation de lien From: [https://portswigger.net/web-security/dom-based/link-manipulation](https://portswigger.net/web-security/dom-based/link-manipulation) Les **vulnérabilités de manipulation de lien basées sur le DOM** surviennent lorsqu'un script écrit **des données contrôlables par l'attaquant vers une cible de navigation** dans la page actuelle, comme un lien cliquable ou l'URL de soumission d'un formulaire. Sinks: ```javascript someDOMElement.href someDOMElement.src someDOMElement.action ``` ### Manipulation de requête Ajax De : [https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation](https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation) Les vulnérabilités de manipulation de requête Ajax surviennent lorsqu'un script écrit des données contrôlables par un attaquant dans une requête Ajax émise à l'aide d'un objet `XmlHttpRequest`. Sinks: ```javascript XMLHttpRequest.setRequestHeader() XMLHttpRequest.open() XMLHttpRequest.send() jQuery.globalEval() $.globalEval() ``` ### Manipulation de chemin de fichier local De : [https://portswigger.net/web-security/dom-based/local-file-path-manipulation](https://portswigger.net/web-security/dom-based/local-file-path-manipulation) Les **vulnérabilités de manipulation de chemin de fichier local** surviennent lorsqu'un script transmet des données contrôlées par l'attaquant à une API de gestion de fichiers en tant que paramètre `filename`. Cette vulnérabilité peut être exploitée par un attaquant pour construire une URL qui, si elle est visitée par un autre utilisateur, pourrait amener le **navigateur de l'utilisateur à ouvrir ou écrire un fichier local arbitraire**. Sinks: ```javascript FileReader.readAsArrayBuffer() FileReader.readAsBinaryString() FileReader.readAsDataURL() FileReader.readAsText() FileReader.readAsFile() FileReader.root.getFile() FileReader.root.getFile() ``` ### Injection SQL côté client From: [https://portswigger.net/web-security/dom-based/client-side-sql-injection](https://portswigger.net/web-security/dom-based/client-side-sql-injection) Les **vulnérabilités d'injection SQL côté client** se produisent lorsqu'un script intègre de manière non sécurisée des données contrôlées par l'attaquant dans une requête SQL côté client. Sinks: ```javascript executeSql() ``` ### Manipulation du stockage HTML5 De : [https://portswigger.net/web-security/dom-based/html5-storage-manipulation](https://portswigger.net/web-security/dom-based/html5-storage-manipulation) Les vulnérabilités de manipulation du stockage HTML5 surviennent lorsqu'un script stocke des données contrôlables par l'attaquant dans le stockage HTML5 du navigateur web (`localStorage` ou `sessionStorage`). Bien que cette action ne soit pas intrinsèquement une vulnérabilité de sécurité, elle devient problématique si l'application lit ensuite les données stockées et les traite de manière non sécurisée. Cela pourrait permettre à un attaquant d'utiliser le mécanisme de stockage pour mener d'autres attaques basées sur le DOM, telles que le script entre sites et l'injection de JavaScript. Sinks: ```javascript sessionStorage.setItem() localStorage.setItem() ``` ### Injection XPath De : [https://portswigger.net/web-security/dom-based/client-side-xpath-injection](https://portswigger.net/web-security/dom-based/client-side-xpath-injection) Les vulnérabilités **d'injection XPath basées sur le DOM** se produisent lorsqu'un script intègre **des données contrôlables par l'attaquant dans une requête XPath**. Sinks: ```javascript document.evaluate() someDOMElement.evaluate() ``` ### Injection JSON côté client De : [https://portswigger.net/web-security/dom-based/client-side-json-injection](https://portswigger.net/web-security/dom-based/client-side-json-injection) Les **vulnérabilités d'injection JSON basées sur le DOM** se produisent lorsqu'un script intègre des données contrôlées par l'attaquant dans une chaîne qui est analysée comme une structure de données JSON, puis traitée par l'application. Sinks: ```javascript JSON.parse() jQuery.parseJSON() $.parseJSON() ``` ### Manipulation de messages Web À partir de : [https://portswigger.net/web-security/dom-based/web-message-manipulation](https://portswigger.net/web-security/dom-based/web-message-manipulation) Les **vulnérabilités des messages Web** surviennent lorsqu'un script envoie des données **contrôlables par un attaquant en tant que message Web vers un autre document** dans le navigateur. Un **exemple** de manipulation de messages Web vulnérable peut être trouvé sur [l'Académie de sécurité Web de PortSwigger](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source). Sinks : La méthode `postMessage()` pour l'envoi de messages Web peut entraîner des vulnérabilités si le gestionnaire d'événements pour la réception des messages traite les données entrantes de manière non sécurisée. ### Manipulation de données DOM À partir de : [https://portswigger.net/web-security/dom-based/dom-data-manipulation](https://portswigger.net/web-security/dom-based/dom-data-manipulation) Les **vulnérabilités de manipulation de données DOM** surviennent lorsqu'un script écrit des données **contrôlables par un attaquant dans un champ du DOM** qui est utilisé dans l'interface utilisateur visible ou la logique côté client. Cette vulnérabilité peut être exploitée par un attaquant pour construire une URL qui, si elle est visitée par un autre utilisateur, peut modifier l'apparence ou le comportement de l'interface utilisateur côté client. ```javascript scriptElement.src scriptElement.text scriptElement.textContent scriptElement.innerText someDOMElement.setAttribute() someDOMElement.search someDOMElement.text someDOMElement.textContent someDOMElement.innerText someDOMElement.outerText someDOMElement.value someDOMElement.name someDOMElement.target someDOMElement.method someDOMElement.type someDOMElement.backgroundImage someDOMElement.cssText someDOMElement.codebase document.title document.implementation.createHTMLDocument() history.pushState() history.replaceState() ``` ### Déni de service À partir de : [https://portswigger.net/web-security/dom-based/denial-of-service](https://portswigger.net/web-security/dom-based/denial-of-service) Les **vulnérabilités de déni de service basées sur le DOM** se produisent lorsqu'un script transmet de manière non sécurisée des données contrôlées par l'attaquant à une **API de plateforme problématique**. Cela inclut les API qui, lorsqu'elles sont invoquées, peuvent amener l'ordinateur de l'utilisateur à consommer **des quantités excessives de CPU ou d'espace disque**. De telles vulnérabilités peuvent avoir des effets secondaires significatifs, tels que le navigateur restreignant la fonctionnalité du site web en refusant les tentatives de stockage de données dans `localStorage` ou en mettant fin aux scripts occupés. Sinks: ```javascript requestFileSystem() RegExp() ``` ## Dom Clobbering {% content-ref url="dom-clobbering.md" %} [dom-clobbering.md](dom-clobbering.md) {% endcontent-ref %}
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)! * 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 du PEASS ou télécharger HackTricks en PDF**? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)! * Découvrez [**La famille PEASS**](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** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Partagez vos astuces de piratage en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).