Dom Clobbering
Osnove
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 clobbering globalnih promenljivih, a to su: embed
, form
, iframe
, image
, img
i object
.
Interesantno je da kada koristite form element za clobbering promenljive, dobićete vrednost toString
samog elementa: [object HTMLFormElement]
, ali sa anchor-om, toString
će biti href
ankora. Stoga, ako koristite a
oznaku za clobbering, možete kontrolisati vrednost kada se tretira kao string:
Nizovi i atributi
Takođe je moguće zamijeniti niz i atribute objekta:
Da biste prebrisali treći atribut (npr. x.y.z), morate koristiti formu
:
Zamena više atributa je komplikovanija, ali i dalje moguća, korišćenjem iframa:
Stil tag se koristi da bi se dalo dovoljno vremena iframe-u da se prikaže. Bez toga ćete dobiti upozorenje nedefinisano.
Da biste zamijenili dublje atribute, možete koristiti iframes sa HTML enkodiranjem na sledeći način:
Bypassiranje filtera
Ako filter petlja kroz svojstva čvora koristeći nešto poput document.getElementByID('x').attributes
, možete prebrisati svojstvo .attributes
i pokvariti filter. Ostala DOM svojstva poput tagName
, nodeName
ili parentNode
i druga takođe su prebrisiva.
Clobbering window.someObject
window.someObject
U JavaScript-u je često moguće pronaći:
Manipulacija HTML-a na stranici omogućava zamenu someObject
sa DOM čvorom, potencijalno uvodeći sigurnosne ranjivosti. Na primer, možete zameniti someObject
sa elementom sidra koji pokazuje na zlonamerni skript:
U ranjivom kodu kao što je:
Ova metoda iskorišćava izvor skripte da izvrši neželjeni kod.
Triks: DOMPurify
vam omogućava da koristite protokol cid:
, koji ne enkodira dvostruke navodnike. To znači da možete ubaciti enkodirani dvostruki navodnik koji će biti dekodiran pri izvršavanju. Stoga, ubacivanje nečega poput <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
će učiniti da HTML enkodirani "
bude dekodiran pri izvršavanju i izbegne vrednost atributa da kreira događaj onerror
.
Druga tehnika koristi element form
. Određene klijentske biblioteke pregledaju atribute novostvorenog elementa forme da bi ih očistile. Međutim, dodavanjem input
sa id=attributes
unutar forme, efektivno prepišete svojstvo atributa, sprečavajući sanitizator da pristupi stvarnim atributima.
Možete pronaći primer ovog tipa clobberinga u ovom CTF writeup-u.
Prepisivanje objekta dokumenta
Prema dokumentaciji, moguće je prepisati atribute objekta dokumenta koristeći DOM Clobbering:
Interfejs Document podržava imenovana svojstva. Podržana imena svojstava Document objekta dokumenta u bilo kom trenutku sastoje se od sledećeg, u redosledu stabla prema elementu koji ih je doprineo, ignorišući kasnije duplikate, i sa vrednostima iz id atributa dolazeći pre vrednosti iz atributa name kada isti element doprinosi oba:
- Vrednost atributa name sadržaja za sve izložene embed, form, iframe, img i izložene object elemente koji imaju neprazan atribut name sadržaja i nalaze se u stablu dokumenta sa dokumentom kao njihovim korenom; - Vrednost atributa id sadržaja za sve izložene object elemente koji imaju neprazan atribut id sadržaja i nalaze se u stablu dokumenta sa dokumentom kao njihovim korenom; - Vrednost atributa id sadržaja za sve img elemente koji imaju i neprazan atribut id sadržaja i neprazan atribut name sadržaja, i nalaze se u stablu dokumenta 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 interfejsu Document kao što je document.querySelector
.
Pisanje nakon što je element prebrisao
Rezultati poziva document.getElementById()
i document.querySelector()
mogu biti promenjeni ubacivanjem <html>
ili <body>
oznake sa identičnim id atributom. Evo kako to može biti urađeno:
Osim toga, primenom stilova za sakrivanje ovih ubačenih HTML/body oznaka, može se sprečiti mešanje sa drugim tekstom u innerText
, čime se poboljšava efikasnost napada:
Istraživanja o SVG-u otkrila su da se oznaka <body>
takođe može efikasno koristiti:
Za HTML oznaku da funkcioniše unutar SVG u pregledačima poput Chrome-a i Firefox-a, potrebna je oznaka <foreignobject>
:
Clobbering formi
Moguće je dodati nove unose unutar formulara samo navođenjem atributa form
unutar određenih oznaka. Možete koristiti ovo da biste dodali nove vrednosti unutar formulara i čak dodali novi dugme za slanje (clickjacking ili zloupotreba nekog .click()
JS koda):
Za više atributa forme u button proverite ovo.
Reference
Heyes, Gareth. JavaScript za hakere: Naučite da razmišljate kao haker.
Last updated