Dom Clobbering
Principi di base
È 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 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:
Array e Attributi
È anche possibile sovrascrivere un array e gli attributi di un oggetto:
Per sovrascrivere un terzo attributo (ad esempio x.y.z), è necessario utilizzare un form
:
Sovrascrivere più attributi è più complicato ma ancora possibile, utilizzando gli iframe:
Il tag style viene utilizzato per dare abbastanza tempo all'iframe per essere renderizzato. Senza di esso, si otterrà un avviso di non definito.
Per sovrascrivere attributi più profondi, è possibile utilizzare iframe con codifica HTML in questo modo:
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.
Sovrascrittura di window.someObject
window.someObject
In JavaScript è comune trovare:
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:
In un codice vulnerabile come:
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 <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
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.
Sovrascrittura dell'oggetto documento
Secondo la documentazione è possibile sovrascrivere gli attributi dell'oggetto documento utilizzando la sovrascrittura del DOM:
L'interfaccia Document supporta proprietà denominate. I nomi delle proprietà supportate di un oggetto Document in un determinato momento consistono dei seguenti, in ordine gerarchico secondo l'elemento che li ha contribuiti, ignorando i duplicati successivi e con i valori degli attributi id 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 embed, form, iframe, img e esposti object che hanno un attributo content name non vuoto e sono in un albero di documenti con il documento come loro radice; - Il valore dell'attributo content id per tutti gli elementi esposti object che hanno un attributo content id non vuoto e sono in un albero di documenti con il documento come loro radice; - Il valore dell'attributo content id per tutti gli elementi img che hanno sia un attributo content id non vuoto che un attributo content name non vuoto e sono in un albero di documenti con il documento come loro radice.
Utilizzando questa tecnica puoi sovrascrivere valori comunemente utilizzati come document.cookie
, document.body
, document.children
e persino metodi nell'interfaccia Document come document.querySelector
.
Scrittura dopo l'elemento clobbered
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, è possibile evitare interferenze da altri testi presenti in innerText
, migliorando così l'efficacia dell'attacco:
Le indagini su SVG hanno rivelato che anche un tag <body>
può essere utilizzato in modo efficace:
Per far funzionare il tag HTML all'interno di SVG nei browser come Chrome e Firefox, è necessario utilizzare il tag <foreignobject>
:
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()
):
Per ulteriori attributi di form in button check this.
Riferimenti
Heyes, Gareth. JavaScript per hacker: Impara a pensare come un hacker.
Last updated