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)
Moguće je generisati globalne promenljive unutar JS konteksta sa atributima id
i name
u HTML tagovima.
Samo određeni elementi mogu koristiti name atribut za klobiranje globalnih promenljivih, to su: embed
, form
, iframe
, image
, img
i object
.
Zanimljivo je da kada koristite form element za klobiranje promenljive, dobićete toString
vrednost samog elementa: [object HTMLFormElement]
, ali sa anchor toString
će biti href
ankera. Stoga, ako klobirate koristeći a
tag, možete kontrolisati vrednost kada se tretira kao string:
Takođe je moguće uništiti niz i atribute objekta:
Da biste prepisali 3. atribut (npr. x.y.z), potrebno je da koristite form
:
Clobbering više atributa je složenije, ali i dalje moguće, koristeći iframes:
Tag stila se koristi da omogući dovoljno vremena za renderovanje iframe-a. Bez njega ćete dobiti upozorenje o neodređenom.
Da biste prepisali dublje atribute, možete koristiti iframe-ove sa html kodiranjem na sledeći način:
Ako filter prolazi kroz atribute čvora koristeći nešto poput document.getElementByID('x').attributes
, mogli biste prebrisati atribut .attributes
i pokvariti filter. Druga DOM svojstva kao što su tagName
, nodeName
ili parentNode
i još mnogo toga su takođe prebrisiva.
window.someObject
U JavaScript-u je uobičajeno pronaći:
Manipulacija HTML-om na stranici omogućava prepisivanje someObject
sa DOM čvorom, potencijalno uvodeći sigurnosne ranjivosti. Na primer, možete zameniti someObject
sa elementom ankera koji upućuje na zloćudni skript:
U ranjivom kodu kao što je:
Ova metoda koristi izvor skripte za izvršavanje neželjenog koda.
Trik: DOMPurify
omogućava korišćenje cid:
protokola, koji ne kodira URL dvostruke navodnike. To znači da možete ubaciti kodirani dvostruki navodnik koji će biti dekodiran u vreme izvršavanja. Stoga, ubacivanje nečega poput <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
će učiniti da HTML kodirani "
bude dekodiran u vreme izvršavanja i izbeći iz vrednosti atributa da kreira onerror
događaj.
Druga tehnika koristi form
element. Određene biblioteke na klijentskoj strani ispituju atribute novokreiranog form elementa kako bi ih očistile. Međutim, dodavanjem input
sa id=attributes
unutar forme, efektivno prepisujete svojstvo atributa, sprečavajući sanitizator da pristupi stvarnim atributima.
Možete pronaći primer ove vrste prepisivanja u ovom CTF izveštaju.
Prema dokumentaciji, moguće je prepisati atribute objekta dokumenta koristeći DOM Clobbering:
Document interfejs podržava imenovane atribute. Podržana imena svojstava objekta Document u bilo kom trenutku se sastoje od sledećih, u redosledu stabla prema elementu koji ih je doprineo, ignorišući kasnije duplikate, i sa vrednostima iz id atributa koji dolaze pre vrednosti iz imenskih atributa kada isti element doprinosi oboma:
- Vrednost atributa sadržaja imena za sve izložene embed, form, iframe, img, i izložene object elemente koji imaju ne-prazan atribut sadržaja imena i koji su u stablu dokumenata sa dokumentom kao njihovim korenom; - Vrednost id atributa sadržaja za sve izložene object elemente koji imaju ne-prazan id atribut sadržaja i koji su u stablu dokumenata sa dokumentom kao njihovim korenom; - Vrednost id atributa sadržaja za sve img elemente koji imaju i ne-prazan id atribut sadržaja i ne-prazan atribut sadržaja imena, i koji su u stablu dokumenata sa dokumentom kao njihovim korenom.
Korišćenjem ove tehnike možete prepisati često korišćene vrednosti kao što su document.cookie
, document.body
, document.children
, pa čak i metode u Document interfejsu kao što je document.querySelector
.
Rezultati poziva document.getElementById()
i document.querySelector()
mogu se izmeniti injektovanjem <html>
ili <body>
taga sa identičnim id atributom. Evo kako to može da se uradi:
Pored toga, korišćenjem stilova za skrivanje ovih ubačenih HTML/body tagova, može se sprečiti ometanje od strane drugog teksta u innerText
, čime se povećava efikasnost napada:
Istraživanja o SVG su otkrila da se <body>
tag takođe može efikasno koristiti:
Da bi HTML tag funkcionisao unutar SVG u pretraživačima kao što su Chrome i Firefox, potreban je <foreignobject>
tag:
Moguće je dodati nove unose unutar forme jednostavno tako što ćete navesti form
atribut unutar nekih oznaka. Možete to koristiti da dodate nove vrednosti unutar forme i čak dodate novi dugme za slanje (clickjacking ili zloupotreba nekog .click()
JS koda):
Za više atributa forme u dugmetu proverite ovo.
Heyes, Gareth. JavaScript za hakere: Naučite da razmišljate kao haker.
Naučite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Naučite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)