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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
DOM Ευπάθειες
Οι ευπάθειες DOM συμβαίνουν όταν δεδομένα από πηγές που ελέγχονται από επιτιθέμενους (όπως το location.search
, το document.referrer
ή το document.cookie
) μεταφέρονται με ανασφαλή τρόπο σε αποδέκτες. Οι αποδέκτες είναι συναρτήσεις ή αντικείμενα (π.χ., eval()
, document.body.innerHTML
) που μπορούν να εκτελέσουν ή να αποδώσουν επιβλαβές περιεχόμενο αν λάβουν κακόβουλα δεδομένα.
- Πηγές είναι είσοδοι που μπορούν να χειριστούν οι επιτιθέμενοι, συμπεριλαμβανομένων των URLs, των cookies και των διαδικτυακών μηνυμάτων.
- Αποδέκτες είναι δυνητικά επικίνδυνες καταλήξεις όπου τα κακόβουλα δεδομένα μπορούν να οδηγήσουν σε αρνητικές συνέπειες, όπως η εκτέλεση σεναρίων.
Ο κίνδυνος προκύπτει όταν τα δεδομένα ρέουν από μια πηγή σε έναν αποδέκτη χωρίς κατάλληλη επικύρωση ή απολύμανση, επιτρέποντας επιθέσεις όπως το XSS.
note
Μπορείτε να βρείτε μια πιο ενημερωμένη λίστα πηγών και αποδεκτών στο https://github.com/wisec/domxsswiki/wiki
Κοινές πηγές:
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
Κοινές Σημειακές Εξόδους:
Ανοιχτή Ανακατεύθυνση | Εισαγωγή Javascript | Manipulation δεδομένων DOM | 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 | ``Manipulation τοπικής διαδρομής αρχείου | 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() |
``Manipulation αιτήσεων Ajax | FileReader.readAsFile() | someDOMElement.backgroundImage | constructor() |
XMLHttpRequest.setRequestHeader() | FileReader.root.getFile() | someDOMElement.cssText | init() |
XMLHttpRequest.open() | FileReader.root.getFile() | someDOMElement.codebase | index() |
XMLHttpRequest.send() | Manipulation συνδέσμων | someDOMElement.innerHTML | jQuery.parseHTML() |
jQuery.globalEval() | someDOMElement.href | someDOMElement.outerHTML | $.parseHTML() |
$.globalEval() | someDOMElement.src | someDOMElement.insertAdjacentHTML | Εισαγωγή JSON από τον πελάτη |
``Manipulation αποθήκευσης HTML5 | someDOMElement.action | someDOMElement.onevent | JSON.parse() |
sessionStorage.setItem() | Εισαγωγή XPath | document.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.domain | history.pushState() | Δηλητηρίαση URL WebSocket |
Εισαγωγή SQl από τον πελάτη | Manipulation μηνυμάτων Web | history.replaceState() | WebSocket |
executeSql() | postMessage() | `` | `` |
Η innerHTML
έξοδος δεν δέχεται script
στοιχεία σε κανέναν σύγχρονο περιηγητή, ούτε θα εκτελούνται τα γεγονότα svg onload
. Αυτό σημαίνει ότι θα χρειαστεί να χρησιμοποιήσετε εναλλακτικά στοιχεία όπως img
ή iframe
.
Αυτού του είδους το XSS είναι πιθανώς το πιο δύσκολο να βρεθεί, καθώς πρέπει να κοιτάξετε μέσα στον κώδικα JS, να δείτε αν χρησιμοποιεί οποιοδήποτε αντικείμενο του οποίου την τιμή ελέγχετε, και σε αυτή την περίπτωση, να δείτε αν υπάρχει οποιοσδήποτε τρόπος να το κακοποιήσετε για να εκτελέσετε αυθαίρετο JS.
Εργαλεία για να τα βρείτε
- https://github.com/mozilla/eslint-plugin-no-unsanitized
- Επέκταση περιηγητή για να ελέγχει κάθε δεδομένο που φτάνει σε μια πιθανή έξοδο: https://github.com/kevin-mizu/domloggerpp
Παραδείγματα
Ανοιχτή Ανακατεύθυνση
Από: https://portswigger.net/web-security/dom-based/open-redirection
Οι ευπάθειες ανοιχτής ανακατεύθυνσης στο DOM συμβαίνουν όταν ένα σενάριο γράφει δεδομένα, τα οποία μπορεί να ελέγξει ένας επιτιθέμενος, σε μια έξοδο ικανή να ξεκινήσει πλοήγηση σε διάφορους τομείς.
Είναι κρίσιμο να κατανοήσετε ότι η εκτέλεση αυθαίρετου κώδικα, όπως javascript:alert(1)
, είναι δυνατή αν έχετε έλεγχο στην αρχή της διεύθυνσης URL όπου συμβαίνει η ανακατεύθυνση.
Σημεία:
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()
Manipulation Cookie
Από: https://portswigger.net/web-security/dom-based/cookie-manipulation
Οι ευπάθειες που σχετίζονται με τη manipulation cookie βασισμένη σε DOM συμβαίνουν όταν ένα σενάριο ενσωματώνει δεδομένα, τα οποία μπορούν να ελεγχθούν από έναν επιτιθέμενο, στην τιμή ενός cookie. Αυτή η ευπάθεια μπορεί να οδηγήσει σε απροσδόκητη συμπεριφορά της ιστοσελίδας αν το cookie χρησιμοποιείται εντός του ιστότοπου. Επιπλέον, μπορεί να εκμεταλλευτεί για να πραγματοποιηθεί μια επίθεση session fixation αν το cookie εμπλέκεται στην παρακολούθηση των συνεδριών χρήστη. Ο κύριος αποδέκτης που σχετίζεται με αυτή την ευπάθεια είναι:
Αποδέκτες:
document.cookie
JavaScript Injection
Από: https://portswigger.net/web-security/dom-based/javascript-injection
Οι ευπάθειες εισαγωγής JavaScript που βασίζονται στο DOM δημιουργούνται όταν ένα σενάριο εκτελεί δεδομένα, τα οποία μπορούν να ελεγχθούν από έναν επιτιθέμενο, ως κώδικα JavaScript.
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 προκύπτουν όταν ένα σενάριο ορίζει την ιδιότητα document.domain
χρησιμοποιώντας δεδομένα που μπορεί να ελέγξει ένας επιτιθέμενος.
Η ιδιότητα document.domain
παίζει έναν κεντρικό ρόλο στην επιβολή της πολιτικής ίδιας προέλευσης από τους περιηγητές. Όταν δύο σελίδες από διαφορετικές προελεύσεις ορίζουν το document.domain
τους στην ίδια τιμή, μπορούν να αλληλεπιδρούν χωρίς περιορισμούς. Αν και οι περιηγητές επιβάλλουν ορισμένους περιορισμούς στις τιμές που μπορούν να ανατεθούν στο document.domain
, αποτρέποντας την ανάθεση εντελώς άσχετων τιμών στην πραγματική προέλευση της σελίδας, υπάρχουν εξαιρέσεις. Συνήθως, οι περιηγητές επιτρέπουν τη χρήση child ή parent domains.
Sinks:
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.
Link manipulation
From: https://portswigger.net/web-security/dom-based/link-manipulation
DOM-based link-manipulation vulnerabilities προκύπτουν όταν ένα σενάριο γράφει δεδομένα ελέγξιμα από τον επιτιθέμενο σε έναν στόχο πλοήγησης μέσα στην τρέχουσα σελίδα, όπως ένα κλικαρίσιμο σύνδεσμο ή το URL υποβολής μιας φόρμας.
Sinks:
someDOMElement.href
someDOMElement.src
someDOMElement.action
Manipulation αιτήσεων Ajax
Από: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation
Ευπάθειες χειρισμού αιτήσεων Ajax προκύπτουν όταν ένα σενάριο γράφει δεδομένα που ελέγχονται από τον επιτιθέμενο σε μια αίτηση Ajax που εκδίδεται χρησιμοποιώντας ένα αντικείμενο XmlHttpRequest
.
Sinks:
XMLHttpRequest.setRequestHeader()
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.globalEval()
$.globalEval()
Τοπική παραποίηση διαδρομής αρχείου
Από: https://portswigger.net/web-security/dom-based/local-file-path-manipulation
Οι ευπάθειες τοπικής παραποίησης διαδρομής αρχείου προκύπτουν όταν ένα σενάριο περνά δεδομένα ελεγχόμενα από τον επιτιθέμενο σε μια API διαχείρισης αρχείων ως παράμετρο filename
. Αυτή η ευπάθεια μπορεί να εκμεταλλευτεί από έναν επιτιθέμενο για να κατασκευάσει μια διεύθυνση URL που, αν επισκεφθεί από έναν άλλο χρήστη, θα μπορούσε να οδηγήσει στο να ανοίξει ή να γράψει ένα αυθαίρετο τοπικό αρχείο στον περιηγητή του χρήστη.
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
Ευπάθειες SQL injection πλευράς πελάτη συμβαίνουν όταν ένα σενάριο ενσωματώνει δεδομένα που ελέγχονται από τον επιτιθέμενο σε ένα ερώτημα SQL πλευράς πελάτη με μη ασφαλή τρόπο.
Sinks:
executeSql()
HTML5-storage manipulation
From: https://portswigger.net/web-security/dom-based/html5-storage-manipulation
Οι ευπάθειες χειρισμού HTML5-storage προκύπτουν όταν ένα σενάριο αποθηκεύει δεδομένα που ελέγχονται από τον επιτιθέμενο στην αποθήκευση HTML5 του φυλλομετρητή (localStorage
ή sessionStorage
). Ενώ αυτή η ενέργεια δεν είναι εγγενώς μια ευπάθεια ασφαλείας, γίνεται προβληματική αν η εφαρμογή στη συνέχεια διαβάσει τα αποθηκευμένα δεδομένα και τα επεξεργαστεί με ανασφαλή τρόπο. Αυτό θα μπορούσε να επιτρέψει σε έναν επιτιθέμενο να εκμεταλλευτεί τον μηχανισμό αποθήκευσης για να διεξάγει άλλες επιθέσεις βασισμένες σε DOM, όπως η διασταυρούμενη σάρωση ιστοσελίδων και η έγχυση JavaScript.
Sinks:
sessionStorage.setItem()
localStorage.setItem()
XPath injection
From: https://portswigger.net/web-security/dom-based/client-side-xpath-injection
Ευπάθειες XPath-injection που βασίζονται σε DOM συμβαίνουν όταν ένα σενάριο ενσωματώνει δεδομένα που ελέγχονται από τον επιτιθέμενο σε ένα ερώτημα XPath.
Sinks:
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:
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:
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:
requestFileSystem()
RegExp()
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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.