DOM XSS

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

DOM-Schwachstellen

DOM-Schwachstellen treten auf, wenn Daten aus von Angreifern kontrollierten Quellen (wie location.search, document.referrer oder document.cookie) unsicher an Senken übertragen werden. Senken sind Funktionen oder Objekte (z. B. eval(), document.body.innerHTML), die schädlichen Inhalt ausführen oder rendern können, wenn ihnen bösartige Daten übergeben werden.

  • Quellen sind Eingaben, die von Angreifern manipuliert werden können, einschließlich URLs, Cookies und Webnachrichten.

  • Senken sind potenziell gefährliche Endpunkte, an denen bösartige Daten zu negativen Auswirkungen führen können, wie z. B. das Ausführen von Skripten.

Das Risiko entsteht, wenn Daten von einer Quelle zu einer Senke fließen, ohne ordnungsgemäße Validierung oder Bereinigung, was Angriffe wie XSS ermöglicht.

Eine aktualisierte Liste von Quellen und Senken finden Sie unter https://github.com/wisec/domxsswiki/wiki

Häufige Quellen:

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

Häufige Schwachstellen:

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

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

FileReader.readAsFile()

someDOMElement.backgroundImage

constructor()

XMLHttpRequest.setRequestHeader()

FileReader.root.getFile()

someDOMElement.cssText

init()

XMLHttpRequest.open()

FileReader.root.getFile()

someDOMElement.codebase

index()

XMLHttpRequest.send()

someDOMElement.innerHTML

jQuery.parseHTML()

jQuery.globalEval()

someDOMElement.href

someDOMElement.outerHTML

$.parseHTML()

$.globalEval()

someDOMElement.src

someDOMElement.insertAdjacentHTML

someDOMElement.action

someDOMElement.onevent

JSON.parse()

sessionStorage.setItem()

document.write()

jQuery.parseJSON()

localStorage.setItem()

document.evaluate()

document.writeln()

$.parseJSON()

**[**`Denial of Service`**](dom-xss.md#denial-of-service)**

someDOMElement.evaluate()

document.title

requestFileSystem()

document.implementation.createHTMLDocument()

document.cookie

RegExp()

document.domain

history.pushState()

history.replaceState()

WebSocket

executeSql()

postMessage()

``

``

Die innerHTML-Schwachstelle akzeptiert auf keinem modernen Browser script-Elemente, und auch svg onload-Ereignisse werden nicht ausgelöst. Das bedeutet, dass alternative Elemente wie img oder iframe verwendet werden müssen.

Diese Art von XSS ist wahrscheinlich am schwierigsten zu finden, da Sie den JS-Code überprüfen müssen, um zu sehen, ob er ein Objekt verwendet, dessen Wert Sie kontrollieren können, und in diesem Fall prüfen müssen, ob es eine Möglichkeit gibt, es zu missbrauchen, um beliebigen JS-Code auszuführen.

Tools zum Auffinden

Beispiele

Offene Weiterleitung

Von: https://portswigger.net/web-security/dom-based/open-redirection

Offene Weiterleitungs-Schwachstellen im DOM treten auf, wenn ein Skript Daten, die ein Angreifer kontrollieren kann, in eine Schwachstelle schreibt, die eine Navigation zwischen Domains initiieren kann.

Es ist wichtig zu verstehen, dass die Ausführung beliebigen Codes, wie z.B. javascript:alert(1), möglich ist, wenn Sie die Kontrolle über den Anfang der URL haben, an dem die Weiterleitung erfolgt.

Schwachstellen:

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

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

DOM-basierte Cookie-Manipulations-Schwachstellen treten auf, wenn ein Skript Daten, die von einem Angreifer kontrolliert werden können, in den Wert eines Cookies einbindet. Diese Schwachstelle kann zu unerwartetem Verhalten der Webseite führen, wenn das Cookie innerhalb der Seite verwendet wird. Darüber hinaus kann sie ausgenutzt werden, um einen Session-Fixierungsangriff durchzuführen, wenn das Cookie zur Verfolgung von Benutzersitzungen verwendet wird. Die Haupt-Sink-Verbindung, die mit dieser Schwachstelle verbunden ist, lautet:

Sinks:

document.cookie

JavaScript-Injektion

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

DOM-basierte JavaScript-Injektionslücken entstehen, wenn ein Skript Daten ausführt, die von einem Angreifer kontrolliert werden können, als JavaScript-Code.

Sinks:

eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()

Manipulation der Dokumentendomäne

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

Vulnerabilitäten bei der Manipulation der Dokumentendomäne treten auf, wenn ein Skript die Eigenschaft document.domain mit Daten setzt, die ein Angreifer kontrollieren kann.

Die Eigenschaft document.domain spielt eine wichtige Rolle bei der Durchsetzung der Same-Origin-Richtlinie durch Browser. Wenn zwei Seiten aus unterschiedlichen Ursprüngen ihren document.domain auf den gleichen Wert setzen, können sie ohne Einschränkungen interagieren. Obwohl Browser bestimmte Grenzen für die zuweisbaren Werte von document.domain festlegen, um die Zuweisung völlig unabhängiger Werte zum tatsächlichen Seitenursprung zu verhindern, gibt es Ausnahmen. In der Regel erlauben Browser die Verwendung von Unter- oder Elterndomänen.

Sinks:

document.domain

WebSocket-URL-Vergiftung

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

WebSocket-URL-Vergiftung tritt auf, wenn ein Skript steuerbare Daten als Ziel-URL für eine WebSocket-Verbindung verwendet.

Sinks:

Der WebSocket-Konstruktor kann zu WebSocket-URL-Vergiftungsschwachstellen führen.

Von: https://portswigger.net/web-security/dom-based/link-manipulation

DOM-basierte Link-Manipulationsschwachstellen treten auf, wenn ein Skript angreifersteuerbare Daten in ein Navigationsziel innerhalb der aktuellen Seite schreibt, wie z.B. einen anklickbaren Link oder die Übermittlungs-URL eines Formulars.

Sinks:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulation von Ajax-Anfragen

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

Vulnerabilitäten bei der Manipulation von Ajax-Anfragen treten auf, wenn ein Skript angreiferkontrollierte Daten in eine Ajax-Anfrage schreibt, die mithilfe eines XmlHttpRequest-Objekts gesendet wird.

Empfänger:

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

Lokale Dateipfadmanipulation

Von: https://portswigger.net/web-security/dom-based/local-file-path-manipulation

Lokale Dateipfadmanipulationsschwachstellen treten auf, wenn ein Skript angreifersteuerbare Daten an eine Dateiverarbeitungs-API als den filename-Parameter übergibt. Diese Schwachstelle kann von einem Angreifer ausgenutzt werden, um eine URL zu konstruieren, die, wenn sie von einem anderen Benutzer besucht wird, dazu führen könnte, dass der Browser des Benutzers eine beliebige lokale Datei öffnet oder schreibt.

Sinks:

FileReader.readAsArrayBuffer()
FileReader.readAsBinaryString()
FileReader.readAsDataURL()
FileReader.readAsText()
FileReader.readAsFile()
FileReader.root.getFile()
FileReader.root.getFile()

Client-seitige SQL-Injektion

Von: https://portswigger.net/web-security/dom-based/client-side-sql-injection

Client-seitige SQL-Injektionslücken treten auf, wenn ein Skript angreiferkontrollierte Daten unsicher in eine clientseitige SQL-Abfrage einbindet.

Senken:

executeSql()

HTML5-Speichermanipulation

Von: https://portswigger.net/web-security/dom-based/html5-storage-manipulation

HTML5-Speichermanipulationslücken entstehen, wenn ein Skript angreiferkontrollierte Daten im HTML5-Speicher des Webbrowsers (localStorage oder sessionStorage) speichert. Obwohl diese Aktion an sich keine Sicherheitslücke darstellt, wird sie problematisch, wenn die Anwendung anschließend die gespeicherten Daten unsicher liest und verarbeitet. Dadurch könnte ein Angreifer den Speichermechanismus nutzen, um andere DOM-basierte Angriffe wie Cross-Site Scripting und JavaScript-Injection durchzuführen.

Sinks:

sessionStorage.setItem()
localStorage.setItem()

XPath-Injektion

Von: https://portswigger.net/web-security/dom-based/client-side-xpath-injection

DOM-basierte XPath-Injektionslücken treten auf, wenn ein Skript angreiferkontrollierte Daten in eine XPath-Abfrage einbindet.

Sinks:

document.evaluate()
someDOMElement.evaluate()

Client-seitige JSON-Injektion

Von: https://portswigger.net/web-security/dom-based/client-side-json-injection

DOM-basierte JSON-Injektionslücken treten auf, wenn ein Skript angreiferkontrollierte Daten in einen String einfügt, der als JSON-Datenstruktur interpretiert und dann von der Anwendung verarbeitet wird.

Sinks:

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

Web-Nachrichtenmanipulation

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

Web-Nachrichten-Schwachstellen treten auf, wenn ein Skript angreiferkontrollierte Daten als Web-Nachricht an ein anderes Dokument im Browser sendet. Ein Beispiel für anfällige Web-Nachrichtenmanipulation finden Sie in der Web Security Academy von PortSwigger.

Sinks:

Die Methode postMessage() zum Senden von Web-Nachrichten kann zu Schwachstellen führen, wenn der Ereignislistener zum Empfangen von Nachrichten die eingehenden Daten unsicher verarbeitet.

DOM-Datenmanipulation

Von: https://portswigger.net/web-security/dom-based/dom-data-manipulation

DOM-Datenmanipulationsschwachstellen treten auf, wenn ein Skript angreiferkontrollierte Daten in ein Feld innerhalb des DOM schreibt, das in der sichtbaren Benutzeroberfläche oder der clientseitigen Logik verwendet wird. Diese Schwachstelle kann von einem Angreifer ausgenutzt werden, um eine URL zu konstruieren, die, wenn sie von einem anderen Benutzer besucht wird, das Aussehen oder Verhalten der clientseitigen Benutzeroberfläche ändern kann.

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

Denial of Service

Von: https://portswigger.net/web-security/dom-based/denial-of-service

DOM-basierte Denial-of-Service-Schwachstellen treten auf, wenn ein Skript angreifersteuerbare Daten unsicher an eine problematische Plattform-API übergibt. Dies umfasst APIs, die, wenn sie aufgerufen werden, dazu führen können, dass der Computer des Benutzers übermäßig viel CPU- oder Festplattenspeicher verbraucht. Solche Schwachstellen können erhebliche Nebenwirkungen haben, wie z.B. dass der Browser die Funktionalität der Website einschränkt, indem er Versuche, Daten im localStorage zu speichern, ablehnt oder beschäftigte Skripte beendet.

Sinks:

requestFileSystem()
RegExp()

Dom Clobbering

pageDom Clobbering
Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Last updated