Dom Clobbering
Βασικά
Είναι δυνατόν να δημιουργήσετε παγκόσμιες μεταβλητές μέσα στο περιβάλλον του JS με τα χαρακτηριστικά id
και name
σε ετικέτες HTML.
Μόνο συγκεκριμένα στοιχεία μπορούν να χρησιμοποιήσουν το name attribute
για να αντικαταστήσουν τις γενικές μεταβλητές, αυτά είναι: embed
, form
, iframe
, image
, img
και object
.
Ενδιαφέροντα, όταν χρησιμοποιείτε ένα στοιχείο form
για να αντικαταστήσετε μια μεταβλητή, θα λάβετε την τιμή toString
του ίδιου του στοιχείου: [object HTMLFormElement]
, αλλά με το στοιχείο anchor
, το toString
θα είναι το href
του anchor. Επομένως, αν αντικαταστήσετε χρησιμοποιώντας το στοιχείο a
, μπορείτε να ελέγξετε την τιμή όταν αντιμετωπίζεται ως συμβολοσειρά:
Πίνακες & Χαρακτηριστικά
Είναι επίσης δυνατό να καταστρέψετε έναν πίνακα και χαρακτηριστικά αντικειμένων:
Για να καταργήσετε ένα τρίτο χαρακτηριστικό (π.χ. x.y.z), πρέπει να χρησιμοποιήσετε ένα form
:
Η αντικατάσταση περισσότερων χαρακτηριστικών είναι πιο περίπλοκη αλλά εξακολουθεί να είναι δυνατή, χρησιμοποιώντας iframes:
Η ετικέτα style χρησιμοποιείται για να δώσει αρκετό χρόνο στο iframe να απεικονιστεί. Χωρίς αυτό, θα εμφανιστεί ένα αναπάντεχο μήνυμα undefined.
Για να αντικαταστήσετε βαθύτερα χαρακτηριστικά, μπορείτε να χρησιμοποιήσετε iframes με κωδικοποίηση html με τον εξής τρόπο:
Παράκαμψη Φίλτρου
Εάν ένα φίλτρο κάνει επανάληψη μέσω των ιδιοτήτων ενός κόμβου χρησιμοποιώντας κάτι σαν document.getElementByID('x').attributes
, μπορείτε να αντικαταστήσετε την ιδιότητα .attributes
και να σπάσετε το φίλτρο. Άλλες ιδιότητες του DOM όπως tagName
, nodeName
ή parentNode
και άλλες μπορούν επίσης να αντικατασταθούν.
Αντικατάσταση του window.someObject
window.someObject
Στην JavaScript είναι συνηθισμένο να βρίσκουμε:
Η παραπλάνηση του HTML στη σελίδα επιτρέπει την αντικατάσταση του someObject
με έναν κόμβο DOM, πιθανώς εισάγοντας ευπάθειες ασφαλείας. Για παράδειγμα, μπορείτε να αντικαταστήσετε το someObject
με ένα στοιχείο αγκύρωσης που δείχνει σε ένα κακόβουλο σενάριο:
Σε ένα ευάλωτο κώδικα όπως:
Αυτή η μέθοδος εκμεταλλεύεται την πηγή του script για να εκτελέσει μη επιθυμητό κώδικα.
Κόλπο: Το DOMPurify
σας επιτρέπει να χρησιμοποιήσετε το πρωτόκολλο cid:
, το οποίο δεν κωδικοποιεί τις διπλές εισαγωγικές. Αυτό σημαίνει ότι μπορείτε να εισάγετε μια κωδικοποιημένη διπλή εισαγωγική που θα αποκωδικοποιηθεί κατά την εκτέλεση. Επομένως, η εισαγωγή κάτι σαν <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
θα κάνει το κωδικοποιημένο HTML "
να αποκωδικοποιηθεί κατά την εκτέλεση και να αποδράσει από την τιμή του γνωρίσματος για να δημιουργήσει το γεγονός onerror
.
Μια άλλη τεχνική χρησιμοποιεί ένα στοιχείο form
. Ορισμένες βιβλιοθήκες πελάτη επιθεωρούν τα γνωρίσματα ενός νεοδημιουργημένου στοιχείου φόρμας για να τα καθαρίσουν. Ωστόσο, προσθέτοντας ένα input
με id=attributes
μέσα στη φόρμα, αντικαθιστάτε αποτελεσματικά την ιδιότητα γνωρισμάτων, εμποδίζοντας τον απολυμαντή να έχει πρόσβαση στα πραγματικά γνωρίσματα.
Μπορείτε να βρείτε ένα παράδειγμα αυτού του είδους του clobbering σε αυτό το CTF writeup.
Clobbering αντικειμένου document
Σύμφωνα με την τεκμηρίωση, είναι δυνατό να αντικαταστήσετε γνωρίσματα του αντικειμένου document χρησιμοποιώντας το DOM Clobbering:
Η διεπαφή Document υποστηρίζει ονομασμένες ιδιότητες. Οι υποστηριζόμενες ονομασμένες ιδιότητες ενός αντικειμένου Document σε οποιαδήποτε στιγμή αποτελούνται από τα εξής, με σειρά δέντρου σύμφωνα με το στοιχείο που τα συνέβαλε, αγνοώντας τυχόν αργότερα διπλότυπα και με τιμές από τα γνωρίσματα id να έρχονται πριν από τις τιμές από τα γνωρίσματα name όταν το ίδιο στοιχείο συνεισφέρει και τα δύο:
- Η τιμή του γνωρίσματος περιεχομένου name για όλα τα εκτεθειμένα στοιχεία embed, form, iframe, img και εκτεθειμένα στοιχεία object που έχουν ένα μη κενό γνώρισμα περιεχομένου name και είναι σε ένα δέντρο εγγράφου με το έγγραφο ως ρίζα; - Η τιμή του γνωρίσματος περιεχομένου id για όλα τα εκτεθειμένα στοιχεία object που έχουν ένα μη κενό γνώρισμα περιεχομένου id και είναι σε ένα δέντρο εγγράφου με το έγγραφο ως ρίζα; - Η τιμή του γνωρίσματος περιεχομένου id για όλα τα στοιχεία img που έχουν τόσο ένα μη κενό γνώρισμα περιεχομένου id όσο και ένα μη κενό γνώρισμα περιεχομένου name και είναι σε ένα δέντρο εγγράφου με το έγγραφο ως ρίζα.
Χρησιμοποιώντας αυτήν την τεχνική, μπορείτε να αντικαταστήσετε συχνά χρησιμοποιούμενες τιμές όπως document.cookie
, document.body
, document.children
, και ακόμα και μεθόδους στη διεπαφή Document όπως document.querySelector
.
Γράψιμο μετά την αντικατάσταση του στοιχείου
Τα αποτελέσματα των κλήσεων στις document.getElementById()
και document.querySelector()
μπορούν να τροποποιηθούν εισάγοντας ένα ετικέτα <html>
ή <body>
με ένα ίδιο χαρακτηριστικό id. Ακολουθεί ο τρόπος με τον οποίο μπορεί να γίνει αυτό:
Επιπλέον, με τη χρήση στυλ για να κρύψετε αυτές τις εισαγμένες ετικέτες HTML/body, μπορεί να αποτραπεί η παρεμβολή από άλλο κείμενο στο innerText
, βελτιώνοντας έτσι την αποτελεσματικότητα της επίθεσης:
Οι έρευνες για το SVG αποκάλυψαν ότι μια ετικέτα <body>
μπορεί επίσης να χρησιμοποιηθεί αποτελεσματικά:
Για να λειτουργήσει η ετικέτα HTML μέσα σε SVG σε προγράμματα περιήγησης όπως το Chrome και το Firefox, απαιτείται η χρήση της ετικέτας <foreignobject>
:
Καταστροφή Φορμών
Είναι δυνατόν να προστεθούν νέες καταχωρήσεις μέσα σε μια φόρμα απλά καθορίζοντας το χαρακτηριστικό form
μέσα σε ορισμένες ετικέτες. Μπορείτε να χρησιμοποιήσετε αυτό για να προσθέσετε νέες τιμές μέσα σε μια φόρμα και ακόμα να προσθέσετε ένα νέο κουμπί για να την αποστείλετε (clickjacking ή κατάχρηση κάποιου κώδικα JS .click()
):
Για περισσότερα χαρακτηριστικά φόρμας στο button check this.
Αναφορές
Heyes, Gareth. JavaScript για χάκερς: Μάθετε να σκέφτεστε σαν έναν χάκερ.
Last updated