# Dom Clobbering {{#include ../../banners/hacktricks-training.md}} ## **Βασικά** Είναι δυνατόν να δημιουργηθούν **παγκόσμιες μεταβλητές μέσα στο JS context** με τα χαρακτηριστικά **`id`** και **`name`** σε HTML tags. ```html
``` **Μόνο** ορισμένα στοιχεία μπορούν να χρησιμοποιήσουν το **name attribute** για να κλωνοποιήσουν παγκόσμιες μεταβλητές, αυτά είναι: `embed`, `form`, `iframe`, `image`, `img` και `object`. Ενδιαφέρον είναι ότι όταν χρησιμοποιείτε ένα **form element** για να **κλωνοποιήσετε** μια μεταβλητή, θα λάβετε την **`toString`** τιμή του στοιχείου αυτού: `[object HTMLFormElement]`, αλλά με **anchor** η **`toString`** θα είναι το **`href`** του anchor. Επομένως, αν κλωνοποιήσετε χρησιμοποιώντας την **`a`** ετικέτα, μπορείτε να **ελέγξετε** την **τιμή** όταν αυτή **θεωρείται ως συμβολοσειρά**: ```html ``` ### Arrays & Attributes Είναι επίσης δυνατό να **καταστραφεί ένας πίνακας** και **τα χαρακτηριστικά ενός αντικειμένου**: ```html ``` Για να καταστρέψετε **ένα 3ο χαρακτηριστικό** (π.χ. x.y.z), πρέπει να χρησιμοποιήσετε μια **`form`**: ```html ``` Η κλοπή περισσότερων χαρακτηριστικών είναι **πιο περίπλοκη αλλά ακόμα δυνατή**, χρησιμοποιώντας iframes: ```html ``` > [!WARNING] > Το tag style χρησιμοποιείται για να **δώσει αρκετό χρόνο στο iframe να αποδοθεί**. Χωρίς αυτό, θα βρείτε μια ειδοποίηση **undefined**. Για να κτυπήσετε βαθύτερα χαρακτηριστικά, μπορείτε να χρησιμοποιήσετε **iframes με html encoding** με αυτόν τον τρόπο: ```html ``` ### **Παράκαμψη Φίλτρου** Αν ένα φίλτρο **περνάει** μέσα από τις **ιδιότητες** ενός κόμβου χρησιμοποιώντας κάτι όπως `document.getElementByID('x').attributes`, θα μπορούσες να **καταστρέψεις** την ιδιότητα **`.attributes`** και να **σπάσεις το φίλτρο**. Άλλες ιδιότητες DOM όπως **`tagName`**, **`nodeName`** ή **`parentNode`** και άλλες είναι επίσης **καταστρέψιμες**. ```html ``` ## **Clobbering `window.someObject`** Στην JavaScript είναι συνηθισμένο να βρίσκεις: ```javascript var someObject = window.someObject || {} ``` Η χειραγώγηση του HTML στη σελίδα επιτρέπει την αντικατάσταση του `someObject` με έναν κόμβο DOM, ενδεχομένως εισάγοντας ευπάθειες ασφαλείας. Για παράδειγμα, μπορείτε να αντικαταστήσετε το `someObject` με ένα στοιχείο άγκυρας που δείχνει σε ένα κακόβουλο σενάριο: ```html ``` Σε έναν ευάλωτο κώδικα όπως: ```html ``` Αυτή η μέθοδος εκμεταλλεύεται την πηγή του script για να εκτελέσει ανεπιθύμητο κώδικα. **Trick**: **`DOMPurify`** σας επιτρέπει να χρησιμοποιείτε το **`cid:`** πρωτόκολλο, το οποίο **δεν κωδικοποιεί URL διπλά εισαγωγικά**. Αυτό σημαίνει ότι μπορείτε να **εισάγετε ένα κωδικοποιημένο διπλό εισαγωγικό που θα αποκωδικοποιηθεί κατά την εκτέλεση**. Επομένως, η εισαγωγή κάτι όπως **``** θα κάνει το HTML κωδικοποιημένο `"` να **αποκωδικοποιηθεί κατά την εκτέλεση** και να **ξεφύγει** από την τιμή του χαρακτηριστικού για να **δημιουργήσει** το **`onerror`** γεγονός. Μια άλλη τεχνική χρησιμοποιεί ένα **`form`** στοιχείο. Ορισμένες βιβλιοθήκες πελάτη ελέγχουν τα χαρακτηριστικά ενός νεοδημιουργημένου στοιχείου φόρμας για να τα καθαρίσουν. Ωστόσο, προσθέτοντας ένα `input` με `id=attributes` μέσα στη φόρμα, ουσιαστικά αντικαθιστάτε την ιδιότητα attributes, αποτρέποντας τον καθαριστή από το να έχει πρόσβαση στα πραγματικά χαρακτηριστικά. Μπορείτε να [**βρείτε ένα παράδειγμα αυτού του τύπου clobbering σε αυτή τη CTF αναφορά**](iframes-in-xss-and-csp.md#iframes-in-sop-2). ## Clobbering αντικειμένου εγγράφου Σύμφωνα με την τεκμηρίωση, είναι δυνατόν να αντικαταστήσετε τα χαρακτηριστικά του αντικειμένου εγγράφου χρησιμοποιώντας DOM Clobbering: > Η [Document](https://html.spec.whatwg.org/multipage/dom.html#document) διεπαφή [υποστηρίζει ονομαστικές ιδιότητες](https://webidl.spec.whatwg.org/#dfn-support-named-properties). Οι [υποστηριζόμενες ονομασίες ιδιοτήτων](https://webidl.spec.whatwg.org/#dfn-supported-property-names) ενός [Document](https://html.spec.whatwg.org/multipage/dom.html#document) αντικειμένου εγγράφου σε οποιαδήποτε στιγμή αποτελούνται από τα εξής, σε [δενδροειδή διάταξη](https://dom.spec.whatwg.org/#concept-tree-order) σύμφωνα με το στοιχείο που τα συνέβαλε, αγνοώντας αργότερα διπλότυπα, και με τιμές από [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) χαρακτηριστικά να έρχονται πριν από τις τιμές από χαρακτηριστικά name όταν το ίδιο στοιχείο συμβάλλει και στα δύο: > > \- Η τιμή του χαρακτηριστικού περιεχομένου name για όλα τα [exposed](https://html.spec.whatwg.org/multipage/dom.html#exposed) [embed](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-embed-element), [form](https://html.spec.whatwg.org/multipage/forms.html#the-form-element), [iframe](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element), [img](https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element), και [exposed](https://html.spec.whatwg.org/multipage/dom.html#exposed) [object](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element) στοιχεία που έχουν μη κενό χαρακτηριστικό περιεχομένου name και είναι [σε ένα δέντρο εγγράφου](https://dom.spec.whatwg.org/#in-a-document-tree) με το έγγραφο ως [ρίζα](https://dom.spec.whatwg.org/#concept-tree-root);\ > \ > \- Η τιμή του χαρακτηριστικού περιεχομένου [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) για όλα τα [exposed](https://html.spec.whatwg.org/multipage/dom.html#exposed) [object](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element) στοιχεία που έχουν μη κενό χαρακτηριστικό περιεχομένου [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) και είναι [σε ένα δέντρο εγγράφου](https://dom.spec.whatwg.org/#in-a-document-tree) με το έγγραφο ως [ρίζα](https://dom.spec.whatwg.org/#concept-tree-root);\ > \ > \- Η τιμή του χαρακτηριστικού περιεχομένου [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) για όλα τα [img](https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element) στοιχεία που έχουν τόσο μη κενό χαρακτηριστικό περιεχομένου [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) όσο και μη κενό χαρακτηριστικό περιεχομένου name, και είναι [σε ένα δέντρο εγγράφου](https://dom.spec.whatwg.org/#in-a-document-tree) με το έγγραφο ως [ρίζα](https://dom.spec.whatwg.org/#concept-tree-root). Χρησιμοποιώντας αυτή την τεχνική μπορείτε να αντικαταστήσετε κοινώς χρησιμοποιούμενες **τιμές όπως `document.cookie`, `document.body`, `document.children`**, και ακόμη και μεθόδους στη διεπαφή Document όπως `document.querySelector`. ```javascript document.write("clobbered
``` Επιπλέον, με την εφαρμογή στυλ για την απόκρυψη αυτών των εισαγόμενων HTML/body ετικετών, μπορεί να αποτραπεί η παρεμβολή από άλλο κείμενο στο `innerText`, ενισχύοντας έτσι την αποτελεσματικότητα της επίθεσης: ```htmlexisting text
clobbered ``` Οι έρευνες σχετικά με το SVG αποκάλυψαν ότι μια ετικέτα `` μπορεί επίσης να χρησιμοποιηθεί αποτελεσματικά: ```html ``` Για να λειτουργήσει η ετικέτα HTML μέσα σε SVG σε προγράμματα περιήγησης όπως το Chrome και το Firefox, είναι απαραίτητη μια ετικέτα `