Dom Clobbering
Basics
Dit is moontlik om globale veranderlikes binne die JS-konteks te genereer met die eienskappe id
en name
in HTML-etikette.
Slegs sekere elemente kan die name attribuut gebruik om globale waardes te oorskryf, dit is: embed
, form
, iframe
, image
, img
en object
.
Interessant genoeg, wanneer jy 'n form element gebruik om 'n veranderlike te oorskryf, sal jy die toString
waarde van die element self kry: [object HTMLFormElement]
maar met 'n anchor sal die toString
die anchor se href
wees. Daarom, as jy oorskryf met die a
tag, kan jy die waarde beheer wanneer dit as 'n string behandel word:
Rye & Eienskappe
Dit is ook moontlik om 'n rye en eienskappe van 'n voorwerp te oorheers:
Om 'n derde eienskap (bv. x.y.z) te oorskryf, moet jy 'n form
gebruik:
Die oorskryf van meer eienskappe is meer ingewikkeld maar steeds moontlik, deur iframes te gebruik:
Die style-etiket word gebruik om genoeg tyd te gee vir die iframe om te render. Sonder dit sal jy 'n waarskuwing van 'undefined' kry.
Om dieper eienskappe te oorskryf, kan jy iframes met HTML-kodering gebruik op die volgende manier:
Filter Bypassing
As 'n filter deur die eienskappe van 'n nodus loop deur iets soos document.getElementByID('x').attributes
, kan jy die eienskap .attributes
oorheers en die filter breek. Ander DOM-eienskappe soos tagName
, nodeName
of parentNode
en meer is ook oorheersbaar.
Clobbering window.someObject
window.someObject
In JavaScript is dit algemeen om te vind:
Die manipulasie van HTML op die bladsy maak dit moontlik om someObject
te oorskryf met 'n DOM-node, wat potensiële sekuriteitskwessies kan veroorsaak. Byvoorbeeld, jy kan someObject
vervang met 'n anker-element wat na 'n skadelike skrips verwys:
In 'n kwesbare kode soos:
Hierdie metode maak gebruik van die skripsbron om ongewenste kode uit te voer.
Truuk: DOMPurify
stel jou in staat om die cid:
protokol te gebruik, wat dubbele aanhalingstekens nie URL-kodeer nie. Dit beteken dat jy 'n gekodeerde dubbele aanhalingsteken kan inspuit wat tydens uitvoering gedekodeer sal word. Daarom sal die inspuiting van iets soos <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
die HTML-gekodeerde "
tydens uitvoering gedekodeer en ontsnap uit die attribuutwaarde om die onerror
gebeurtenis te skep.
'n Ander tegniek maak gebruik van 'n form
element. Sekere kliëntkant-biblioteke ondersoek die eienskappe van 'n nuut geskepte vormelement om dit skoon te maak. Deur egter 'n input
met id=attributes
binne die vorm by te voeg, oorskryf jy effektief die eienskappe-eienskap en voorkom dat die sanitiseerder toegang tot die werklike eienskappe verkry.
Jy kan 'n voorbeeld van hierdie tipe oorskrywing in hierdie CTF-verslag vind.
Oorskryf van die dokumentobjek
Volgens die dokumentasie is dit moontlik om eienskappe van die dokumentobjek te oorskryf deur gebruik te maak van DOM-oorskrywing:
Die Document koppelvlak ondersteun genoemde eienskappe. Die ondersteunde eienskapsname van 'n Document-objektdokument op enige oomblik bestaan uit die volgende, in boomvolgorde volgens die element wat dit bydra, waarby latere duplikate geïgnoreer word, en met waardes van id-eienskappe wat voor waardes van naam-eienskappe kom wanneer dieselfde element beide bydra:
- Die waarde van die naam-inhoudseienskap vir alle blootgestelde embed, form, iframe, img, en blootgestelde object-elemente wat 'n nie-leë naam-inhoudseienskap het en in 'n dokumentboom met die dokument as hul wortel is; - Die waarde van die id-inhoudseienskap vir alle blootgestelde object-elemente wat 'n nie-leë id-inhoudseienskap het en in 'n dokumentboom met die dokument as hul wortel is; - Die waarde van die id-inhoudseienskap vir alle img-elemente wat beide 'n nie-leë id-inhoudseienskap en 'n nie-leë naam-inhoudseienskap het, en in 'n dokumentboom met die dokument as hul wortel is.
Met behulp van hierdie tegniek kan jy algemeen gebruikte waardes soos document.cookie
, document.body
, document.children
en selfs metodes in die Document-koppelvlak soos document.querySelector
oorskryf.
Skryf nadat die element oorskryf is
Die resultate van oproepe na document.getElementById()
en document.querySelector()
kan verander word deur 'n <html>
of <body>
tag in te spuit met 'n identiese id-eienskap. Hier is hoe dit gedoen kan word:
Verder kan de doeltreffendheid van de aanval worden verbeterd door stijlen te gebruiken om deze ingevoegde HTML/body-tags te verbergen en interferentie van andere tekst in de innerText
te voorkomen:
Ondersoeke na SVG het aan die lig gebring dat 'n <body>
-etiket ook doeltreffend gebruik kan word:
Vir die HTML-etiket om binne SVG te funksioneer in webblaaier soos Chrome en Firefox, is 'n <foreignobject>
-etiket nodig:
Oorweldiging van Vorms
Dit is moontlik om nuwe inskrywings binne 'n vorm by te voeg deur eenvoudig die form
attribuut te spesifiseer binne sekere etikette. Jy kan dit gebruik om nuwe waardes binne 'n vorm by te voeg en selfs 'n nuwe knoppie om dit te stuur (clickjacking of misbruik van sommige .click()
JS-kode):
Vir meer vormatribute in knoppie kyk hierdie.
Verwysings
Heyes, Gareth. JavaScript vir hackers: Leer om soos 'n hacker te dink.
Last updated