DOM XSS

Reading time: 11 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

Vulnérabilités DOM

Les vulnérabilités DOM se produisent lorsque des données provenant de sources contrôlées par un attaquant (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.

  • Sources sont des entrées qui peuvent être manipulées par des attaquants, y compris les URL, les cookies et les messages web.
  • Sinks sont des points de terminaison 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 des données circulent d'une source à un sink sans validation ou assainissement appropriés, permettant des attaques comme le XSS.

note

Vous pouvez trouver une liste plus à jour de sources et de sinks dans https://github.com/wisec/domxsswiki/wiki

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

Sinks courants :

Redirection ouverteInjection JavascriptManipulation de données DOMjQuery
locationeval()scriptElement.srcadd()
location.hostFunction() constructorscriptElement.textafter()
location.hostnamesetTimeout()scriptElement.textContentappend()
location.hrefsetInterval()scriptElement.innerTextanimate()
location.pathnamesetImmediate()someDOMElement.setAttribute()insertAfter()
location.searchexecCommand()someDOMElement.searchinsertBefore()
location.protocolexecScript()someDOMElement.textbefore()
location.assign()msSetImmediate()someDOMElement.textContenthtml()
location.replace()range.createContextualFragment()someDOMElement.innerTextprepend()
open()crypto.generateCRMFRequest()someDOMElement.outerTextreplaceAll()
domElem.srcdoc``Manipulation de chemin de fichier localsomeDOMElement.valuereplaceWith()
XMLHttpRequest.open()FileReader.readAsArrayBuffer()someDOMElement.namewrap()
XMLHttpRequest.send()FileReader.readAsBinaryString()someDOMElement.targetwrapInner()
jQuery.ajax()FileReader.readAsDataURL()someDOMElement.methodwrapAll()
$.ajax()FileReader.readAsText()someDOMElement.typehas()
``Manipulation de requête AjaxFileReader.readAsFile()someDOMElement.backgroundImageconstructor()
XMLHttpRequest.setRequestHeader()FileReader.root.getFile()someDOMElement.cssTextinit()
XMLHttpRequest.open()FileReader.root.getFile()someDOMElement.codebaseindex()
XMLHttpRequest.send()Manipulation de liensomeDOMElement.innerHTMLjQuery.parseHTML()
jQuery.globalEval()someDOMElement.hrefsomeDOMElement.outerHTML$.parseHTML()
$.globalEval()someDOMElement.srcsomeDOMElement.insertAdjacentHTMLInjection JSON côté client
``Manipulation de stockage HTML5someDOMElement.actionsomeDOMElement.oneventJSON.parse()
sessionStorage.setItem()Injection XPathdocument.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
requestFileSystem()``Manipulation de domaine de documentdocument.implementation.createHTMLDocument()document.cookie
RegExp()document.domainhistory.pushState()Empoisonnement d'URL WebSocket
Injection SQL côté clientManipulation de message Webhistory.replaceState()WebSocket
executeSql()postMessage()````

Le sink innerHTML n'accepte pas les éléments script dans 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 la valeur est sous votre contrôle, et dans ce cas, voir s'il existe un moyen d'en abuser pour exécuter du JS arbitraire.

Outils pour les trouver

Exemples

Redirection ouverte

De : 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 l'attaquant peut contrôler, dans un sink capable d'initier une navigation entre domaines.

Il est crucial de comprendre qu'il est possible d'exécuter du code arbitraire, tel que javascript:alert(1), si vous avez le contrôle sur le début de l'URL où la redirection se produit.

Sinks :

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 des cookies

From: https://portswigger.net/web-security/dom-based/cookie-manipulation

Les vulnérabilités de manipulation des cookies basées sur le DOM se produisent lorsqu'un script intègre des données, qui peuvent être contrôlées 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 réaliser une attaque de fixation de session si le cookie est impliqué dans le suivi des sessions utilisateur. Le principal sink associé à cette vulnérabilité est :

Sinks:

javascript
document.cookie

Injection JavaScript

From: https://portswigger.net/web-security/dom-based/javascript-injection

Les vulnérabilités d'injection JavaScript basées sur le DOM se produisent 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 de document

From: https://portswigger.net/web-security/dom-based/document-domain-manipulation

Les vulnérabilités de manipulation du domaine de document se produisent lorsqu'un script définit la propriété document.domain en utilisant des données que l'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 à la même valeur, elles peuvent interagir sans restrictions. Bien que les navigateurs imposent certaines limites sur les valeurs assignables à document.domain, empêchant l'assignation de valeurs complètement non liées à l'origine réelle de la page, des exceptions existent. En général, les navigateurs permettent l'utilisation de domaines enfants ou domaines parents.

Sinks:

javascript
document.domain

WebSocket-URL poisoning

From: https://portswigger.net/web-security/dom-based/websocket-url-poisoning

WebSocket-URL poisoning se produit lorsqu'un script utilise des données contrôlables comme l'URL cible pour une connexion WebSocket.

Sinks:

Le constructeur WebSocket peut conduire à des vulnérabilités de WebSocket-URL poisoning.

From: 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 à 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 des requêtes Ajax

De : https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation

Les vulnérabilités de manipulation des requêtes Ajax surviennent lorsqu'un script écrit des données contrôlables par l'attaquant dans une requête Ajax qui est émise à l'aide d'un objet XmlHttpRequest.

Sinks :

javascript
XMLHttpRequest.setRequestHeader()
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.globalEval()
$.globalEval()

Manipulation de chemin de fichier local

From: 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 passe des données contrôlables 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

De : 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 incorpore des données contrôlables par l'attaquant dans une requête SQL côté client de manière non sécurisée.

Sinks:

javascript
executeSql()

Manipulation du stockage HTML5

From: 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 les données stockées et les traite de manière non sécurisée. Cela pourrait permettre à un attaquant d'exploiter le mécanisme de stockage pour mener d'autres attaques basées sur le DOM, telles que le cross-site scripting et l'injection JavaScript.

Sinks:

javascript
sessionStorage.setItem()
localStorage.setItem()

Injection XPath

De : 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 incorpore des données contrôlables par l'attaquant dans une requête XPath.

Sinks :

javascript
document.evaluate()
someDOMElement.evaluate()

Injection JSON côté client

From: 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 incorpore des données contrôlables par l'attaquant dans une chaîne qui est analysée comme une structure de données JSON et ensuite traitée par l'application.

Sinks:

javascript
JSON.parse()
jQuery.parseJSON()
$.parseJSON()

Manipulation de messages web

From: https://portswigger.net/web-security/dom-based/web-message-manipulation

Les vulnérabilités de messages web surviennent lorsqu'un script envoie des données contrôlables par l'attaquant sous forme de message web à un autre document dans le navigateur. Un exemple de manipulation de message web vulnérable peut être trouvé sur l'Académie de sécurité web de PortSwigger.

Sinks:

La méthode postMessage() pour envoyer des messages web peut conduire à des vulnérabilités si l'écouteur d'événements pour recevoir des messages traite les données entrantes de manière non sécurisée.

Manipulation de données DOM

From: 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 l'attaquant dans un champ au sein du DOM qui est utilisé dans l'UI 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 altérer l'apparence ou le comportement de l'UI côté client.

Sinks:

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

From: 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 passe des données contrôlables par l'attaquant de manière non sécurisée à une API problématique de la plateforme. 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 rejetant les tentatives de stockage de données dans localStorage ou en terminant des scripts occupés.

Sinks:

javascript
requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering

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