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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.
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 :
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 ouverte | Injection Javascript | Manipulation de données DOM | jQuery |
---|---|---|---|
location | eval() | scriptElement.src | add() |
location.host | Function() constructor | 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 de fichier local | 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 | FileReader.readAsFile() | someDOMElement.backgroundImage | constructor() |
XMLHttpRequest.setRequestHeader() | FileReader.root.getFile() | someDOMElement.cssText | init() |
XMLHttpRequest.open() | FileReader.root.getFile() | someDOMElement.codebase | index() |
XMLHttpRequest.send() | Manipulation de lien | someDOMElement.innerHTML | jQuery.parseHTML() |
jQuery.globalEval() | someDOMElement.href | someDOMElement.outerHTML | $.parseHTML() |
$.globalEval() | someDOMElement.src | someDOMElement.insertAdjacentHTML | Injection JSON côté client |
``Manipulation de stockage HTML5 | someDOMElement.action | someDOMElement.onevent | JSON.parse() |
sessionStorage.setItem() | Injection XPath | 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 |
requestFileSystem() | ``Manipulation de domaine de document | document.implementation.createHTMLDocument() | document.cookie |
RegExp() | document.domain | history.pushState() | Empoisonnement d'URL WebSocket |
Injection SQL côté client | Manipulation de message Web | history.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
- https://github.com/mozilla/eslint-plugin-no-unsanitized
- Extension de navigateur pour vérifier chaque donnée qui atteint un sink potentiel : https://github.com/kevin-mizu/domloggerpp
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 :
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:
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:
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:
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.
Link manipulation
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:
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 :
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:
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:
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:
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 :
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:
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:
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:
requestFileSystem()
RegExp()
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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.