DOM XSS

Reading time: 11 minutes

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 Ευπάθειες

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

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

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

note

Μπορείτε να βρείτε μια πιο ενημερωμένη λίστα πηγών και αποδεκτών στο https://github.com/wisec/domxsswiki/wiki

Κοινές πηγές:

javascript
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

Κοινές Σημειακές Εξόδους:

Ανοιχτή ΑνακατεύθυνσηΕισαγωγή JavascriptManipulation δεδομένων DOMjQuery
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``Manipulation τοπικής διαδρομής αρχείουsomeDOMElement.valuereplaceWith()
XMLHttpRequest.open()FileReader.readAsArrayBuffer()someDOMElement.namewrap()
XMLHttpRequest.send()FileReader.readAsBinaryString()someDOMElement.targetwrapInner()
jQuery.ajax()FileReader.readAsDataURL()someDOMElement.methodwrapAll()
$.ajax()FileReader.readAsText()someDOMElement.typehas()
``Manipulation αιτήσεων AjaxFileReader.readAsFile()someDOMElement.backgroundImageconstructor()
XMLHttpRequest.setRequestHeader()FileReader.root.getFile()someDOMElement.cssTextinit()
XMLHttpRequest.open()FileReader.root.getFile()someDOMElement.codebaseindex()
XMLHttpRequest.send()Manipulation συνδέσμωνsomeDOMElement.innerHTMLjQuery.parseHTML()
jQuery.globalEval()someDOMElement.hrefsomeDOMElement.outerHTML$.parseHTML()
$.globalEval()someDOMElement.srcsomeDOMElement.insertAdjacentHTMLΕισαγωγή JSON από τον πελάτη
``Manipulation αποθήκευσης HTML5someDOMElement.actionsomeDOMElement.oneventJSON.parse()
sessionStorage.setItem()Εισαγωγή XPathdocument.write()jQuery.parseJSON()
localStorage.setItem()document.evaluate()document.writeln()$.parseJSON()
**[**`Άρνηση Υπηρεσίας`**](dom-xss.md#denial-of-service)**someDOMElement.evaluate()document.title``Manipulation cookie
requestFileSystem()``Manipulation τομέα εγγράφουdocument.implementation.createHTMLDocument()document.cookie
RegExp()document.domainhistory.pushState()Δηλητηρίαση URL WebSocket
Εισαγωγή SQl από τον πελάτηManipulation μηνυμάτων Webhistory.replaceState()WebSocket
executeSql()postMessage()````

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

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

Εργαλεία για να τα βρείτε

Παραδείγματα

Ανοιχτή Ανακατεύθυνση

Από: https://portswigger.net/web-security/dom-based/open-redirection

Οι ευπάθειες ανοιχτής ανακατεύθυνσης στο DOM συμβαίνουν όταν ένα σενάριο γράφει δεδομένα, τα οποία μπορεί να ελέγξει ένας επιτιθέμενος, σε μια έξοδο ικανή να ξεκινήσει πλοήγηση σε διάφορους τομείς.

Είναι κρίσιμο να κατανοήσετε ότι η εκτέλεση αυθαίρετου κώδικα, όπως javascript:alert(1), είναι δυνατή αν έχετε έλεγχο στην αρχή της διεύθυνσης URL όπου συμβαίνει η ανακατεύθυνση.

Σημεία:

javascript
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

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

Αποδέκτες:

javascript
document.cookie

JavaScript Injection

Από: https://portswigger.net/web-security/dom-based/javascript-injection

Οι ευπάθειες εισαγωγής JavaScript που βασίζονται στο DOM δημιουργούνται όταν ένα σενάριο εκτελεί δεδομένα, τα οποία μπορούν να ελεγχθούν από έναν επιτιθέμενο, ως κώδικα JavaScript.

Sinks:

javascript
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 προκύπτουν όταν ένα σενάριο ορίζει την ιδιότητα document.domain χρησιμοποιώντας δεδομένα που μπορεί να ελέγξει ένας επιτιθέμενος.

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

Sinks:

javascript
document.domain

WebSocket-URL poisoning

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

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

Sinks:

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

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

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

Sinks:

javascript
someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulation αιτήσεων Ajax

Από: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation

Ευπάθειες χειρισμού αιτήσεων Ajax προκύπτουν όταν ένα σενάριο γράφει δεδομένα που ελέγχονται από τον επιτιθέμενο σε μια αίτηση Ajax που εκδίδεται χρησιμοποιώντας ένα αντικείμενο XmlHttpRequest.

Sinks:

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

Τοπική παραποίηση διαδρομής αρχείου

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

Οι ευπάθειες τοπικής παραποίησης διαδρομής αρχείου προκύπτουν όταν ένα σενάριο περνά δεδομένα ελεγχόμενα από τον επιτιθέμενο σε μια API διαχείρισης αρχείων ως παράμετρο filename. Αυτή η ευπάθεια μπορεί να εκμεταλλευτεί από έναν επιτιθέμενο για να κατασκευάσει μια διεύθυνση URL που, αν επισκεφθεί από έναν άλλο χρήστη, θα μπορούσε να οδηγήσει στο να ανοίξει ή να γράψει ένα αυθαίρετο τοπικό αρχείο στον περιηγητή του χρήστη.

Sinks:

javascript
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

Ευπάθειες SQL injection πλευράς πελάτη συμβαίνουν όταν ένα σενάριο ενσωματώνει δεδομένα που ελέγχονται από τον επιτιθέμενο σε ένα ερώτημα SQL πλευράς πελάτη με μη ασφαλή τρόπο.

Sinks:

javascript
executeSql()

HTML5-storage manipulation

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

Οι ευπάθειες χειρισμού HTML5-storage προκύπτουν όταν ένα σενάριο αποθηκεύει δεδομένα που ελέγχονται από τον επιτιθέμενο στην αποθήκευση HTML5 του φυλλομετρητή (localStorage ή sessionStorage). Ενώ αυτή η ενέργεια δεν είναι εγγενώς μια ευπάθεια ασφαλείας, γίνεται προβληματική αν η εφαρμογή στη συνέχεια διαβάσει τα αποθηκευμένα δεδομένα και τα επεξεργαστεί με ανασφαλή τρόπο. Αυτό θα μπορούσε να επιτρέψει σε έναν επιτιθέμενο να εκμεταλλευτεί τον μηχανισμό αποθήκευσης για να διεξάγει άλλες επιθέσεις βασισμένες σε DOM, όπως η διασταυρούμενη σάρωση ιστοσελίδων και η έγχυση JavaScript.

Sinks:

javascript
sessionStorage.setItem()
localStorage.setItem()

XPath injection

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

Ευπάθειες XPath-injection που βασίζονται σε DOM συμβαίνουν όταν ένα σενάριο ενσωματώνει δεδομένα που ελέγχονται από τον επιτιθέμενο σε ένα ερώτημα XPath.

Sinks:

javascript
document.evaluate()
someDOMElement.evaluate()

Client-side JSON injection

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

Οι ευπάθειες JSON injection που βασίζονται στο DOM συμβαίνουν όταν ένα σενάριο ενσωματώνει δεδομένα που ελέγχονται από τον επιτιθέμενο σε μια συμβολοσειρά που αναλύεται ως δομή δεδομένων JSON και στη συνέχεια επεξεργάζεται από την εφαρμογή.

Sinks:

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

Web-message manipulation

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

Ευπάθειες web-message προκύπτουν όταν ένα σενάριο στέλνει δεδομένα ελεγχόμενα από τον επιτιθέμενο ως web message σε άλλο έγγραφο μέσα στον περιηγητή. Ένα παράδειγμα ευάλωτης web-message manipulation μπορεί να βρεθεί στην Web Security Academy του PortSwigger.

Sinks:

Η μέθοδος postMessage() για την αποστολή web messages μπορεί να οδηγήσει σε ευπάθειες αν ο ακροατής γεγονότων για την παραλαβή μηνυμάτων χειρίζεται τα εισερχόμενα δεδομένα με μη ασφαλή τρόπο.

DOM-data manipulation

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

Ευπάθειες DOM-data manipulation προκύπτουν όταν ένα σενάριο γράφει δεδομένα ελεγχόμενα από τον επιτιθέμενο σε ένα πεδίο μέσα στο DOM που χρησιμοποιείται στην ορατή διεπαφή χρήστη ή στη λογική πλευρά του πελάτη. Αυτή η ευπάθεια μπορεί να εκμεταλλευτεί από έναν επιτιθέμενο για να κατασκευάσει μια διεύθυνση URL που, αν επισκεφθεί από άλλο χρήστη, μπορεί να αλλάξει την εμφάνιση ή τη συμπεριφορά της διεπαφής χρήστη πλευράς του πελάτη.

Sinks:

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

Άρνηση Υπηρεσίας

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

Ευπάθειες άρνησης υπηρεσίας βασισμένες σε DOM συμβαίνουν όταν ένα σενάριο περνά δεδομένα που ελέγχονται από τον επιτιθέμενο με ανασφαλή τρόπο σε μια προβληματική πλατφόρμα API. Αυτό περιλαμβάνει APIs που, όταν καλούνται, μπορούν να οδηγήσουν τον υπολογιστή του χρήστη να καταναλώνει υπερβολικές ποσότητες CPU ή χώρου δίσκου. Τέτοιες ευπάθειες μπορεί να έχουν σημαντικές παρενέργειες, όπως η περιορισμένη λειτουργικότητα της ιστοσελίδας από τον περιηγητή, απορρίπτοντας τις προσπάθειες αποθήκευσης δεδομένων στο localStorage ή τερματίζοντας απασχολημένα σενάρια.

Sinks:

javascript
requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering

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