Dom Clobbering
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
È possibile generare variabili globali all'interno del contesto JS con gli attributi id
e name
nei tag HTML.
Solo alcuni elementi possono utilizzare l'attributo name per clobber i globali, essi sono: embed
, form
, iframe
, image
, img
e object
.
È interessante notare che, quando si utilizza un elemento form per clobber una variabile, si otterrà il valore toString
dell'elemento stesso: [object HTMLFormElement]
, ma con anchor il toString
sarà l'href dell'anchor. Pertanto, se si clobber utilizzando il tag a
, si può controllare il valore quando è trattato come una stringa:
È anche possibile sovrascrivere un array e attributi di oggetti:
Per sovrascrivere un 3° attributo (ad es. x.y.z), è necessario utilizzare un form
:
Clobbering più attributi è più complicato ma ancora possibile, usando iframe:
Il tag style è usato per dare abbastanza tempo all'iframe per renderizzare. Senza di esso troverai un avviso di undefined.
Per sovrascrivere attributi più profondi, puoi usare iframes con codifica html in questo modo:
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 sono anch'esse sovrascrivibili.
window.someObject
In JavaScript è comune trovare:
Manipolare l'HTML sulla pagina consente di sovrascrivere someObject
con un nodo DOM, potenzialmente introducendo vulnerabilità di sicurezza. Ad esempio, puoi sostituire someObject
con un elemento di ancoraggio che punta a uno script malevolo:
In un codice vulnerabile come:
Questo metodo sfrutta la sorgente dello script per eseguire codice indesiderato.
Trucco: DOMPurify
consente di utilizzare il protocollo cid:
, che non codifica in URL le virgolette doppie. Ciò significa che puoi iniettare una virgoletta doppia codificata che verrà decodificata durante l'esecuzione. Pertanto, iniettare qualcosa come <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
farà sì che l'HTML codificato "
venga decodificato durante l'esecuzione e escapato dal valore dell'attributo per creare l'evento onerror
.
Un'altra tecnica utilizza un elemento form
. Alcune librerie client-side ispezionano gli attributi di un nuovo elemento form creato per pulirli. Tuttavia, aggiungendo un input
con id=attributes
all'interno del modulo, sovrascrivi effettivamente la proprietà degli attributi, impedendo al sanitizzatore di accedere agli attributi reali.
Puoi trovare un esempio di questo tipo di clobbering in questo CTF writeup.
Secondo la documentazione, è possibile sovrascrivere gli attributi dell'oggetto documento utilizzando il DOM Clobbering:
L'interfaccia Document supporta proprietà nominate. I nomi delle proprietà supportate di un oggetto Document in qualsiasi momento consistono nei seguenti, in ordine ad albero secondo l'elemento che le ha contribuite, ignorando i duplicati successivi, e con i valori degli attributi id che vengono prima dei valori degli attributi name quando lo stesso elemento contribuisce a entrambi:
- Il valore dell'attributo di contenuto name per tutti gli elementi exposed embed, form, iframe, img e exposed object che hanno un attributo di contenuto name non vuoto e sono in un albero di documenti con il documento come loro radice; - Il valore dell'attributo di contenuto id per tutti gli elementi exposed object che hanno un attributo di contenuto id non vuoto e sono in un albero di documenti con il documento come loro radice; - Il valore dell'attributo di contenuto id per tutti gli elementi img che hanno sia un attributo di contenuto id non vuoto che un attributo di contenuto name non vuoto, e sono in un albero di documenti con il documento come loro radice.
Utilizzando questa tecnica, puoi sovrascrivere valori comunemente usati come document.cookie
, document.body
, document.children
, e persino metodi nell'interfaccia Document come document.querySelector
.
I risultati delle chiamate a document.getElementById()
e document.querySelector()
possono essere alterati iniettando un tag <html>
o <body>
con un attributo id identico. Ecco come può essere fatto:
Inoltre, utilizzando stili per nascondere questi tag HTML/body iniettati, si può prevenire l'interferenza di altro testo in innerText
, migliorando così l'efficacia dell'attacco:
Le indagini su SVG hanno rivelato che un tag <body>
può essere utilizzato efficacemente:
Per il tag HTML per funzionare all'interno di SVG in browser come Chrome e Firefox, è necessario un tag <foreignobject>
:
È possibile aggiungere nuove voci all'interno di un modulo semplicemente specificando l'attributo form
all'interno di alcuni tag. Puoi usare questo per aggiungere nuovi valori all'interno di un modulo e persino aggiungere un pulsante per inviarlo (clickjacking o abusando di qualche codice JS .click()
):
Per ulteriori attributi del modulo in pulsante controlla questo.
Heyes, Gareth. JavaScript per hacker: Impara a pensare come un hacker.
Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)