DOM XSS

Unterstützen Sie HackTricks

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 sie mit bösartigen Daten versorgt 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 nachteiligen Auswirkungen führen können, wie z. B. der Ausführung von Skripten.

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

Eine aktuellere 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 Senken:

jQuery

location

eval()

scriptElement.src

add()

location.host

Function() Konstruktor

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 Senke akzeptiert in modernen Browsern keine script-Elemente, noch werden svg onload-Ereignisse ausgelöst. Das bedeutet, dass Sie alternative Elemente wie img oder iframe verwenden müssen.

Diese Art von XSS ist wahrscheinlich die schwierigste zu finden, da Sie den JS-Code durchsuchen müssen, um zu sehen, ob er irgendein Objekt verwendet, dessen Wert Sie kontrollieren, und in diesem Fall prüfen, ob es irgendeine Möglichkeit gibt, es zu missbrauchen, um beliebigen JS auszuführen.

Werkzeuge, um sie zu finden

Beispiele

Open Redirect

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

Open Redirect-Schwachstellen im DOM treten auf, wenn ein Skript Daten, die ein Angreifer kontrollieren kann, in eine Senke schreibt, die in der Lage ist, die Navigation über Domains hinweg zu initiieren.

Es ist entscheidend zu verstehen, dass die Ausführung beliebigen Codes, wie javascript:alert(1), möglich ist, wenn Sie die Kontrolle über den Anfang der URL haben, wo die Umleitung erfolgt.

Senken:

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-Manipulationsanfälligkeiten treten auf, wenn ein Skript Daten, die von einem Angreifer kontrolliert werden können, in den Wert eines Cookies einfügt. Diese Anfälligkeit 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-Fixation-Angriff durchzuführen, wenn das Cookie an der Verfolgung von Benutzersitzungen beteiligt ist. Der primäre Sink, der mit dieser Anfälligkeit verbunden ist, ist:

Sinks:

document.cookie

JavaScript-Injektion

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

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

Sinks:

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

Document-Domain-Manipulation

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

Document-Domain-Manipulation-Schwachstellen treten auf, wenn ein Skript die document.domain-Eigenschaft mit Daten festlegt, die ein Angreifer kontrollieren kann.

Die document.domain-Eigenschaft spielt eine Schlüsselrolle bei der Durchsetzung der Same-Origin-Policy durch Browser. Wenn zwei Seiten aus unterschiedlichen Ursprüngen ihre document.domain auf den gleichen Wert setzen, können sie ohne Einschränkungen interagieren. Obwohl Browser bestimmte Grenzen für die Werte, die document.domain zugewiesen werden können, auferlegen und die Zuweisung von völlig nicht verwandten Werten zum tatsächlichen Seitenursprung verhindern, gibt es Ausnahmen. Typischerweise erlauben Browser die Verwendung von Kind- oder Eltern-Domains.

Sinks:

document.domain

WebSocket-URL-Poisoning

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

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

Sinks:

Der WebSocket-Konstruktor kann zu WebSocket-URL-Poisoning-Schwachstellen führen.

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

DOM-basierte Link-Manipulationsschwachstellen entstehen, wenn ein Skript angreifer-kontrollierbare Daten an ein Navigationsziel innerhalb der aktuellen Seite schreibt, wie z.B. einen klickbaren Link oder die Einreichungs-URL eines Formulars.

Sinks:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajax-Anforderungsmanipulation

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

Schwachstellen bei der Manipulation von Ajax-Anfragen entstehen, wenn ein Skript angreiferkontrollierte Daten in eine Ajax-Anfrage schreibt, die mit einem XmlHttpRequest-Objekt ausgegeben wird.

Sinks:

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

Lokale Dateipfadmanipulation

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

Schwachstellen bei der lokalen Dateipfadmanipulation entstehen, wenn ein Skript vom Angreifer kontrollierbare Daten an eine Datei-Verarbeitungs-API als 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-Side SQL-Injection

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

Client-side SQL-Injection-Schwachstellen treten auf, wenn ein Skript angreiferkontrollierte Daten auf unsichere Weise in eine clientseitige SQL-Abfrage einfügt.

Sinks:

executeSql()

HTML5-Speicher-Manipulation

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

HTML5-Speicher-Manipulationsanfälligkeiten entstehen, wenn ein Skript angreiferkontrollierte Daten im HTML5-Speicher des Webbrowsers (localStorage oder sessionStorage) speichert. Während diese Aktion an sich keine Sicherheitsanfälligkeit darstellt, wird sie problematisch, wenn die Anwendung anschließend die gespeicherten Daten liest und unsicher verarbeitet. Dies könnte es einem Angreifer ermöglichen, den Speichermechanismus auszunutzen, um andere DOM-basierte Angriffe durchzuführen, wie z.B. Cross-Site-Scripting und JavaScript-Injection.

Sinks:

sessionStorage.setItem()
localStorage.setItem()

XPath-Injection

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

DOM-basierte XPath-Injektionsanfälligkeiten treten auf, wenn ein Skript angreiferkontrollierte Daten in eine XPath-Abfrage einfügt.

Sinks:

document.evaluate()
someDOMElement.evaluate()

Client-side JSON injection

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

DOM-basierte JSON-Injektionsanfälligkeiten treten auf, wenn ein Skript von einem Angreifer kontrollierbare Daten in einen String einfügt, der als JSON-Datenstruktur geparst und dann von der Anwendung verarbeitet wird.

Sinks:

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

Web-Nachrichtenmanipulation

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

Web-Nachrichtenanfälligkeiten entstehen, wenn ein Skript angreiferkontrollierbare Daten als Web-Nachricht an ein anderes Dokument innerhalb des Browsers sendet. Ein Beispiel für anfällige Web-Nachrichtenmanipulation findet sich in PortSwiggers Web Security Academy.

Sinks:

Die postMessage()-Methode zum Senden von Web-Nachrichten kann zu Sicherheitsanfälligkeiten führen, wenn der Ereignislistener für den Empfang von Nachrichten die eingehenden Daten auf unsichere Weise verarbeitet.

DOM-Datenmanipulation

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

DOM-Datenmanipulationsanfälligkeiten entstehen, wenn ein Skript angreiferkontrollierbare Daten in ein Feld innerhalb des DOM schreibt, das in der sichtbaren UI oder der clientseitigen Logik verwendet wird. Diese Sicherheitsanfälligkeit kann von einem Angreifer ausgenutzt werden, um eine URL zu konstruieren, die, wenn sie von einem anderen Benutzer besucht wird, das Erscheinungsbild oder Verhalten der clientseitigen UI ä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

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

DOM-basierte Denial-of-Service-Schwachstellen treten auf, wenn ein Skript angreiferkontrollierte Daten unsicher an eine problematische Plattform-API übergibt. Dazu gehören APIs, die, wenn sie aufgerufen werden, dazu führen können, dass der Computer des Benutzers übermäßige Mengen an CPU oder Speicherplatz 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 in localStorage zu speichern, ablehnt oder beschäftigte Skripte beendet.

Sinks:

requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering
Unterstütze HackTricks

Last updated