# Dom Clobbering
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)! * Lavori in una **azienda di sicurezza informatica**? Vuoi vedere la tua **azienda pubblicizzata in HackTricks**? O vuoi avere accesso all'**ultima versione di PEASS o scaricare HackTricks in PDF**? Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)! * Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family) * Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com) * **Unisciti al** [**💬**](https://emojipedia.org/speech-balloon/) [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguimi** su **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Condividi i tuoi trucchi di hacking inviando PR al** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **e al** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
## **Principi di base** È possibile generare **variabili globali all'interno del contesto JS** con gli attributi **`id`** e **`name`** nei tag HTML. ```html
``` **Solo** alcuni elementi possono utilizzare l'**attributo name** per sovrascrivere le variabili globali, sono: `embed`, `form`, `iframe`, `image`, `img` e `object`. Curiosamente, quando si utilizza un **elemento form** per **sovrascrivere** una variabile, si otterrà il valore **`toString`** dell'elemento stesso: `[object HTMLFormElement]`, ma con l'**ancora** il **`toString`** sarà l'**`href`** dell'ancora. Pertanto, se si sovrascrive utilizzando il tag **`a`**, è possibile **controllare** il **valore** quando viene **trattato come una stringa**: ```html ``` ### Array e Attributi È anche possibile **sovrascrivere un array** e **gli attributi di un oggetto**: ```html ``` Per sovrascrivere **un terzo attributo** (ad esempio x.y.z), è necessario utilizzare un **`form`**: ```html
``` Sovrascrivere più attributi è **più complicato ma ancora possibile**, utilizzando gli iframe: ```html ``` {% hint style="warning" %} Il tag style viene utilizzato per **dare abbastanza tempo all'iframe per essere renderizzato**. Senza di esso, si otterrà un avviso di **non definito**. {% endhint %} Per sovrascrivere attributi più profondi, è possibile utilizzare **iframe con codifica HTML** in questo modo: ```html ``` ### **Bypass del filtro** Se un filtro sta **iterando** attraverso le **proprietà** di un nodo utilizzando qualcosa come `document.getElementByID('x').attributes`, potresti **sovrascrivere** l'attributo **`.attributes`** e **rompere il filtro**. Altre proprietà del DOM come **`tagName`**, **`nodeName`** o **`parentNode`** e altre ancora sono anche **sovrascrivibili**. ```html
``` ## **Sovrascrittura di `window.someObject`** In JavaScript è comune trovare: ```javascript var someObject = window.someObject || {}; ``` La manipolazione dell'HTML sulla pagina consente di sovrascrivere `someObject` con un nodo DOM, potenzialmente introducendo vulnerabilità di sicurezza. Ad esempio, è possibile sostituire `someObject` con un elemento anchor che punta a uno script maligno: ```html
``` In un codice vulnerabile come: ```html ``` Questo metodo sfrutta la sorgente dello script per eseguire codice indesiderato. **Trucco**: **`DOMPurify`** ti permette di utilizzare il protocollo **`cid:`**, che **non codifica gli apici doppi**. Ciò significa che puoi **iniettare un apice doppio codificato che verrà decodificato durante l'esecuzione**. Pertanto, iniettare qualcosa come **``** farà sì che l'apice codificato in HTML `"` venga **decodificato durante l'esecuzione** e **scappi** dal valore dell'attributo per **creare** l'evento **`onerror`**. Un'altra tecnica utilizza un elemento **`form`**. Alcune librerie lato client ispezionano gli attributi di un elemento form appena creato per pulirli. Tuttavia, aggiungendo un `input` con `id=attributes` all'interno del form, sovrascrivi effettivamente la proprietà degli attributi, impedendo al sanitizer di accedere agli attributi effettivi. Puoi [**trovare un esempio di questo tipo di sovrascrittura in questa descrizione di CTF**](iframes-in-xss-and-csp.md#iframes-in-sop-2). ## Sovrascrittura dell'oggetto documento Secondo la documentazione è possibile sovrascrivere gli attributi dell'oggetto documento utilizzando la sovrascrittura del DOM: > L'interfaccia [Document](https://html.spec.whatwg.org/multipage/dom.html#document) [supporta proprietà denominate](https://webidl.spec.whatwg.org/#dfn-support-named-properties). I nomi delle proprietà supportate di un oggetto [Document](https://html.spec.whatwg.org/multipage/dom.html#document) in un determinato momento consistono dei seguenti, in [ordine gerarchico](https://dom.spec.whatwg.org/#concept-tree-order) secondo l'elemento che li ha contribuiti, ignorando i duplicati successivi e con i valori degli attributi [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) che precedono i valori degli attributi name quando lo stesso elemento contribuisce ad entrambi: > > \- Il valore dell'attributo content name per tutti gli elementi [esposti](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) e [esposti](https://html.spec.whatwg.org/multipage/dom.html#exposed) [object](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element) che hanno un attributo content name non vuoto e sono [in un albero di documenti](https://dom.spec.whatwg.org/#in-a-document-tree) con il documento come loro [radice](https://dom.spec.whatwg.org/#concept-tree-root);\ > \ > \- Il valore dell'attributo content [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) per tutti gli elementi [esposti](https://html.spec.whatwg.org/multipage/dom.html#exposed) [object](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element) che hanno un attributo content [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) non vuoto e sono [in un albero di documenti](https://dom.spec.whatwg.org/#in-a-document-tree) con il documento come loro [radice](https://dom.spec.whatwg.org/#concept-tree-root);\ > \ > \- Il valore dell'attributo content [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) per tutti gli elementi [img](https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element) che hanno sia un attributo content [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute) non vuoto che un attributo content name non vuoto e sono [in un albero di documenti](https://dom.spec.whatwg.org/#in-a-document-tree) con il documento come loro [radice](https://dom.spec.whatwg.org/#concept-tree-root). Utilizzando questa tecnica puoi sovrascrivere valori comunemente utilizzati come `document.cookie`, `document.body`, `document.children` e persino metodi nell'interfaccia Document come `document.querySelector`. ```javascript document.write("") document.cookie typeof(document.cookie) 'object' //Something more sanitize friendly than a img tag document.write("
") document.cookie HTMLCollection(2) [img, form, cookie: img] typeof(document.cookie) 'object ``` ## Scrittura dopo l'elemento clobbered I risultati delle chiamate a **`document.getElementById()`** e **`document.querySelector()`** possono essere alterati iniettando un tag `` o `` con un attributo id identico. Ecco come può essere fatto: ```html

clobbered ``` Inoltre, utilizzando stili per nascondere questi tag HTML/body iniettati, è possibile evitare interferenze da altri testi presenti in `innerText`, migliorando così l'efficacia dell'attacco: ```html

existing text

clobbered ``` Le indagini su SVG hanno rivelato che anche un tag `` può essere utilizzato in modo efficace: ```html clobbered ``` Per far funzionare il tag HTML all'interno di SVG nei browser come Chrome e Firefox, è necessario utilizzare il tag ``: ```html clobbered ``` ## Sovrascrittura dei form È possibile aggiungere **nuove voci all'interno di un form** semplicemente specificando l'attributo `form` all'interno di alcuni tag. Puoi utilizzare questo metodo per **aggiungere nuovi valori all'interno di un form** e persino per aggiungere un nuovo **pulsante** per **inviarlo** (clickjacking o sfruttando del codice JS `.click()`): {% code overflow="wrap" %} ```html ``` {% endcode %} * Per ulteriori attributi di form in [**button check this**](https://www.w3schools.com/tags/tag\_button.asp)**.** ## Riferimenti * [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering) * [https://portswigger.net/web-security/dom-based/dom-clobbering](https://portswigger.net/web-security/dom-based/dom-clobbering) * Heyes, Gareth. JavaScript per hacker: Impara a pensare come un hacker.
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)! * Lavori in una **azienda di sicurezza informatica**? Vuoi vedere la tua **azienda pubblicizzata su HackTricks**? o vuoi avere accesso all'**ultima versione di PEASS o scaricare HackTricks in PDF**? Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)! * Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family) * Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com) * **Unisciti al** [**💬**](https://emojipedia.org/speech-balloon/) [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguimi** su **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Condividi i tuoi trucchi di hacking inviando PR al** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **e al** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).