DOM XSS

Support HackTricks

DOM Ευπάθειες

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

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

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

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

You can find a more updated list of sources and sinks in 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

Κοινές Σημείες Εισόδου:

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

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

**[**`Άρνηση Υπηρεσίας`**](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()

``

``

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

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

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

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

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

Από: 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()

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

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

Sinks:

document.cookie

JavaScript Injection

From: 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, αποτρέποντας την ανάθεση εντελώς άσχετων τιμών στην πραγματική προέλευση της σελίδας, υπάρχουν εξαιρέσεις. Συνήθως, οι περιηγητές επιτρέπουν τη χρήση υποτομέων ή γονικών τομέων.

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.

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

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

Sinks:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajax request manipulation

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

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

Sinks:

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

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

From: 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, όπως η διασταυρούμενη σcripting και η ένεση JavaScript.

Sinks:

sessionStorage.setItem()
localStorage.setItem()

XPath injection

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

Ευπάθειες DOM-based XPath-injection συμβαίνουν όταν ένα σενάριο ενσωματώνει δεδομένα που ελέγχονται από τον επιτιθέμενο σε ένα ερώτημα 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 χειραγώγησης μπορεί να βρεθεί στην Ακαδημία Ασφαλείας Ιστού του 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()

Denial of Service

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

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

Sinks:

requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering
Υποστήριξη HackTricks

Last updated