Das Document Object Model beschreibt den hierarchischen Aufbau einer Webseite. Javascript kann dazu benutzt werden, die verschiedenen Knoten und Objekte zu manipullieren. Dies ist eine normale Funktion die auch häufig genutzt wird um Funktionen auf der Webseite bereitzustellen. Allerdings kann das unsichere verarbeiten von Daten zu Schwachstellen führen. Dies passiert etwa, wenn vom Angreifer kontrollierbare Daten, auch als source bezeichnet vom Javascript verarbeitet wird. Dies wird dann in eine gefährliche Funktion geschrieben, auch als sink bezeichnet.
Ein beispiel für eine source ist die location.search source. Diese ist besonders leicht vom Angreifer kontrollierbar, andere sourcen sind document.referrer und document.cookie. Zudem gehören hierzu web messages. Eine sink ist beispielsweise die eval() Funktion, da diese Javascript ohne jegliche überprüfung ausführt. Ein weiteres beispiel für ein HTML sink ist document.body.innerHTML, da es potenziel das ausführen von HTML und das ausführen von Javascript erlaubt. Die folgenden sind einige der häufigsten sources:
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
DOM-basiertes open redirection
DOM basierte open-redirection Schwachstellen treten auf, wenn ein Skript Daten in ein Sink schreibt, welches cross-domain Navigation auslösen kann. Dieses verhalten kann für Phishing Angriffe genutzt werden. Dazu kann eine authentische Anwendung genutzt werden, welche Vertrauen ausstrahlt und keinen Grund für Misstrauen gibt. Der Nutzer wird dann unbemerkt auf eine andere Webseite weitergeleitet.
Ist es dem Angreifer möglich den Start des Strings zu kontrollieren, welcher zu der weiterleitungsapi gegeben wird, ist es auch möglich eine Javascript injection attack zu nutzen. Ein Angreifer kann eine URL konstruieren mit dem javascript: pseudo protokoll um code auszuführen, wenn die Url ausgeführt wird.
https://portswigger.net/web-security/dom-based/open-redirection
DOM basiertes Web Socket Poisoning
Web Socket Poisoning tritt auf, wenn Nutzer kontrollierbare Daten als Ziel URL einer Web Socket Verbindung genutzt wird. Ein Angreifer kann dies dazu nutzen, eine URL zu konstruieren. Wird diese URL von einem anderen Nutzer genutzt führt dies zur Öffnung eines Web Sockets zu einer URL des Angreifers.
DOM basierte Link Manipulation
Mit DOM basierter Link Manipulation ist es möglich den Nutzer an eine externe URL weiterzuleiten und dabei auch noch sensible Informationen zu übertragen. Den User dazu zu bringen Aktionen auszuführen oder auch anti-XSS umgehen. Die folgenden Sinks können dabei genutzt werden:
element.href
element.src
element.action
Web Nachrichten Manipulation
Diese Schwachstelle tritt auf, wenn Daten die vom Angreifer manipulierbar sind an ein anderes Dokument im Browser. Um diese Schwachstelle auszunutzen wird die postMessage() Methode benutzt werden.
DOM basierte AJAX Anfrage Header Manipulation
AJAX Anfrage Header Manipulation kann ausgenutzt werden, wenn ein Skript Angreifer kontrollierbare Daten in den Anfrage Header eines AJAX requests schreibt, welcher ein XmlHttpRequest Objekt nutzt. Ein Angreifer könnte eine URL konstruieren, die beim besuchen eines anderen Nutzers einen beliebigen Header in der nachfolgenden AJAX Anfrage setzt. Dies kann als Ausgangspunkt für die Verkettung anderer Angriffsarten verwendet werden, wodurch sich der potenzielle Schweregrad dieser Sicherheitslücke erhöht. Die folgenden Sinks können zu DOM basierter AJAX Header Anfrage Manipulation führen:
XMLHttpRequest.setRequestHeader()
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.globalEval()
$.globalEval()
DOM basiertes lokale Dateipfad Manipultaion
DOM basierte lokale Dateipfad Manipulation entsteht, wenn ein Skript Angreifer kontrollierbare Daten zu einer Datei Handling API als Dateinamen Parameter gibt. Dies kann dazu führen, dass eine URL erstellt wird, welche beim Besuch den Browser des Users dazu verleiten kann eine Datei zu öffnen. Die Auswirkungen dieser Schwachstelle können dazu führen, dass Daten gelesen oder geschrieben werden können. Die Sinks die für die Attacke genutzt werden können sind:
FileReader.readAsArrayBuffer()
FileReader.readAsBinaryString()
FileReader.readAsDataURL()
FileReader.readAsText()
FileReader.readAsFile()
FileReader.root.getFile()
DOM basierte Client-seitige SQL Injection
Schädlicher SQL Code wird in eine Webseite mittels DOM eingefügt. Ein Skript verarbeitet dies dann auf unsichere Weise.
Die Javascript Datenbank kann mithilfe der executeSql() Funktion ausgenutzt werden.
DOM basierte HTML5 speicher manipulation
Bei der HTML5 Speicher manipulation wird eine Schwachstelle ausgenutzt durch das Speichern von Angreifer kontrollierbaren Daten. Also wie localStorage oder sessionStorage. Werden nun Daten aus einem Speicher in einem unsicheren Weg verarbeitet, kann dies ausgenutzt werden. Dies ist nicht direkt eine Schwachstelle, doch in Kombination mit anderen Angriffen kann dies ausgenutzt werden.
Die ausnutzbaren sinks sind:
- sessionStorage.setItem()
- localStorage.setItem()
DOM basierte Client seitige XPath injection
Diese Schwachstelle tritt auf, wenn Angreifer kontrollierbare Daten in eine XPath-Abfrage gelangen. Die folgenden Sinks können zu XPath Injection führen:
- document.evaluate()
- element.evaluate()
DOM basierte Client seitige JSON Injection
Die DOM basierte JSON Injection kann auftreten, wenn Angreifer kontrollierbare Daten in einen String geschrieben werden, welcher als JSON geparst wird. Die Sinks, welche für diese Schwachstelle verwendet werden können sind:
- JSON.parse()
- jQuery.parseJSON()
- $.parseJSON()
DOM Daten Manipulation
Die DOM Daten Manipulation kann auftreten, wenn ein Skript Angreifer kontrollierbare Daten in ein DOM Feld schreibt, welches innerhalb der UI Sichtbar ist. Ein Angreifer kann dadurch das Aussehen oder Verhalten der UI Manipulieren. Die folgenden Sinks können zu Daten Manipulation führen:
script.src
script.text
script.textContent
script.innerText
element.setAttribute()
element.search
element.text
element.textContent
element.innerText
element.outerText
element.value
element.name
element.target
element.method
element.type
element.backgroundImage
element.cssText
element.codebase
document.title document.implementation.createHTMLDocument()
history.pushState()
history.replaceState()
DOM basierte DoS
Bei dieser Attacke kann Angreifer kontrollierbare Daten an eine platform API weitergegeben werden, welche große Mengen CPU Rechenleistung verbrauchen. Die folgenden Sinks können zu DoS führen:
- requestFileSystem
- RegExp()
Kontrollieren der Web Message Quelle
Erhält eine Seite Web Messages in einer unsicheren Weise, beispiel durch nicht verifizieren der Quelle in dem Event Listener, können Eigenschaften und Funktionen, welche vom Event Listener aufgerufen werden zu Sinks werden. Ein Angreifer kann einen schädlichen Iframe hosten und mithilfe der postMessage() Methode, schädliche Payloads zu den Sinks schicken.
Das folgende Beispiel zeigt einen Angreifbaren Event Listener:
```html
Das folgende Iframe könnte dies ausnutzen:html