hacktricks/pentesting-web/xss-cross-site-scripting/dom-xss.md

25 KiB

DOM XSS

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

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 s'ils reçoivent des données malveillantes.

  • Les sources sont des entrées qui peuvent ê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 XSS.

{% hint style="info" %} Vous pouvez trouver une liste plus à jour des sources et des sinks sur https://github.com/wisec/domxsswiki/wiki {% endhint %}

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

Fuites courantes:

Redirection ouverte Injection de Javascript Manipulation des données du DOM 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 du chemin d'accès aux fichiers locaux 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 la requête Ajax FileReader.readAsFile() someDOMElement.backgroundImage constructeur()
XMLHttpRequest.setRequestHeader() FileReader.root.getFile() someDOMElement.cssText init()
XMLHttpRequest.open() FileReader.root.getFile() someDOMElement.codebase index()
XMLHttpRequest.send() Manipulation des liens someDOMElement.innerHTML jQuery.parseHTML()
jQuery.globalEval() someDOMElement.href someDOMElement.outerHTML $.parseHTML()
$.globalEval() someDOMElement.src someDOMElement.insertAdjacentHTML Injection JSON côté client
``Manipulation du 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 des cookies
requestFileSystem() ``Manipulation du domaine du document document.implementation.createHTMLDocument() document.cookie
RegExp() document.domain history.pushState() Empoisonnement des URL WebSocket
Injection SQL côté client Manipulation des messages Web 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 y a un moyen de l'exploiter 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 puits capable d'initier une navigation entre les 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ù se produit la redirection.

Puits:

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

De : 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 :

document.cookie

Injection de JavaScript

De : 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:

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

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.

document.domain

Poisoning d'URL de WebSocket

From: 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

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:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulation de requête Ajax

De : 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:

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

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

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

Sinks:

executeSql()

Manipulation du stockage HTML5

De : 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ôlées par l'attaquant dans le stockage HTML5 du navigateur web (localStorage ou sessionStorage). Alors que cette action n'est 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:

sessionStorage.setItem()
localStorage.setItem()

Injection XPath

From: 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:

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 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:

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

Manipulation de messages Web

À partir de : 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 l'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.

Sinks :

La méthode postMessage() pour l'envoi de messages Web peut entraîner des vulnérabilités si l'écouteur d'événements pour la réception des messages gère 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

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 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 visitée par un autre utilisateur, peut modifier l'apparence ou le comportement de l'interface utilisateur côté client.

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

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ôlables 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.

Sources:

requestFileSystem()
RegExp()

Dom Clobbering

{% content-ref url="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)!