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)
Dit is moontlik om globale veranderlikes binne die JS-konteks te genereer met die eienskappe id
en name
in HTML-tags.
Slegs sekere elemente kan die name attribuut gebruik om globals te clobber, hulle is: embed
, form
, iframe
, image
, img
en object
.
Interessant genoeg, wanneer jy 'n form element gebruik om 'n veranderlike te clobber, sal jy die toString
waarde van die element self kry: [object HTMLFormElement]
maar met anker sal die toString
die anker href
wees. Daarom, as jy clobber met die a
tag, kan jy die waarde beheer wanneer dit as 'n string behandel word:
Dit is ook moontlik om 'n array en objek eienskappe te clobber:
Om 'n 3de attribuut (bv. x.y.z) te oorskry, moet jy 'n form
gebruik:
Clobbering meer eienskappe is meer ingewikkeld maar steeds moontlik, met behulp van iframes:
Die style-tag word gebruik om genoeg tyd te gee vir die iframe om te render. Sonder dit sal jy 'n waarskuwing van undefined vind.
Om dieper eienskappe te klobber, kan jy iframes met html-kodering op hierdie manier gebruik:
As 'n filter deurloop deur die eienskappe van 'n node met iets soos document.getElementByID('x').attributes
, kan jy die eienskap .attributes
oorstroom en die filter breek. Ander DOM-eienskappe soos tagName
, nodeName
of parentNode
en meer is ook oorstroombaar.
window.someObject
In JavaScript is dit algemeen om te vind:
Manipulasie van HTML op die bladsy laat toe om someObject
met 'n DOM-knoop te oorskry, wat moontlik sekuriteitskwesies kan inbring. Byvoorbeeld, jy kan someObject
vervang met 'n anker-element wat na 'n kwaadwillige skrip wys:
In 'n kwesbare kode soos:
This method exploits the script source to execute unwanted code.
Trick: DOMPurify
laat jou toe om die cid:
protokol te gebruik, wat nie dubbele aanhalings URL-kodeer nie. Dit beteken jy kan 'n gekodeerde dubbele aanhaling invoeg wat tydens uitvoering gedekodeer sal word. Daarom sal die invoeging van iets soos <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
die HTML-gecodeerde "
tydens uitvoering gedekodeer en ontsnap uit die attribuutwaarde om die onerror
gebeurtenis te skep.
Another technique uses a form
element. Sekere kliënt-kant biblioteke ondersoek die attribuut van 'n nuut geskepte vormelement om dit skoon te maak. egter, deur 'n input
met id=attributes
binne die vorm by te voeg, oorskry jy effektief die attribuut eienskap, wat die sanitizer verhinder om toegang te verkry tot die werklike attribuut.
You can find an example of this type of clobbering in this CTF writeup.
According to the documentation it's possible to overwrite attributes of the document object using DOM Clobbering:
Die Document koppelvlak ondersteun naam eienskappe. Die ondersteunde eienskap name van 'n Document objek dokument op enige oomblik bestaan uit die volgende, in boom volgorde volgens die element wat dit bygedra het, terwyl latere duplikate geïgnoreer word, en met waardes van id attribuut wat voor waardes van naam attribuut kom wanneer dieselfde element albei bydra:
- Die waarde van die naam inhoud attribuut vir alle exposed embed, form, iframe, img, en exposed object elemente wat 'n nie-leë naam inhoud attribuut het en in 'n dokumentboom met dokument as hul wortel is; - Die waarde van die id inhoud attribuut vir alle exposed object elemente wat 'n nie-leë id inhoud attribuut het en in 'n dokumentboom met dokument as hul wortel is; - Die waarde van die id inhoud attribuut vir alle img elemente wat albei 'n nie-leë id inhoud attribuut en 'n nie-leë naam inhoud attribuut het, en in 'n dokumentboom met dokument as hul wortel.
Using this technique you can overwrite commonly used values such as document.cookie
, document.body
, document.children
, and even methods in the Document interface like document.querySelector
.
Die resultate van oproepe na document.getElementById()
en document.querySelector()
kan verander word deur 'n <html>
of <body>
etiket met 'n identiese id-attribuut in te spuit. Hier is hoe dit gedoen kan word:
Verder, deur style te gebruik om hierdie ingeslote HTML/body-tags te verberg, kan inmenging van ander teks in die innerText
voorkom word, wat die doeltreffendheid van die aanval verbeter:
Ondersoeke na SVG het onthul dat 'n <body>
etiket ook effektief gebruik kan word:
Om die HTML-tag binne SVG in blaaiers soos Chrome en Firefox te laat werk, is 'n <foreignobject>
-tag nodig:
Dit is moontlik om nuwe inskrywings binne 'n vorm by te voeg net deur die form
attribuut binne sommige etikette te spesifiseer. Jy kan dit gebruik om nuwe waardes binne 'n vorm by te voeg en selfs 'n nuwe knoppie by te voeg om dit te stuur (clickjacking of om sommige .click()
JS kode te misbruik):
Vir meer vormattribuut in knoppie kyk hierna.
Heyes, Gareth. JavaScript vir hackers: Leer om soos 'n hacker te dink.
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)