# Dom Clobbering
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)! * Werk jy in 'n **cybersecurity-maatskappy**? Wil jy jou **maatskappy adverteer in HackTricks**? Of wil jy toegang hê tot die **nuutste weergawe van die PEASS of laai HackTricks in PDF af**? Kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! * Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family) * Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com) * **Sluit aan by die** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** my op **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Deel jou hacktruuks deur PR's in te dien by die** [**hacktricks-repo**](https://github.com/carlospolop/hacktricks) **en** [**hacktricks-cloud-repo**](https://github.com/carlospolop/hacktricks-cloud).
## **Basics** Dit is moontlik om **globale veranderlikes binne die JS-konteks** te genereer met die eienskappe **`id`** en **`name`** in HTML-etikette. ```html
``` **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: ```html ``` ### Rye & Eienskappe Dit is ook moontlik om 'n rye en eienskappe van 'n voorwerp te **oorheers**: ```html ``` Om **'n derde eienskap** (bv. x.y.z) te oorskryf, moet jy 'n **`form`** gebruik: ```html
``` Die oorskryf van meer eienskappe is **meer ingewikkeld maar steeds moontlik**, deur iframes te gebruik: ```html ``` {% hint style="warning" %} 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. {% endhint %} Om dieper eienskappe te oorskryf, kan jy iframes met HTML-kodering gebruik op die volgende manier: ```html ``` ### **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**. ```html
``` ## **Clobbering `window.someObject`** In JavaScript is dit algemeen om te vind: ```javascript var someObject = window.someObject || {}; ``` 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: ```html
``` In 'n kwesbare kode soos: ```html ``` 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 **``** 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**](iframes-in-xss-and-csp.md#iframes-in-sop-2). ## 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](https://html.spec.whatwg.org/multipage/dom.html#document) koppelvlak [ondersteun genoemde eienskappe](https://webidl.spec.whatwg.org/#dfn-support-named-properties). Die [ondersteunde eienskapsname](https://webidl.spec.whatwg.org/#dfn-supported-property-names) van 'n [Document](https://html.spec.whatwg.org/multipage/dom.html#document)-objektdokument op enige oomblik bestaan uit die volgende, in [boomvolgorde](https://dom.spec.whatwg.org/#concept-tree-order) volgens die element wat dit bydra, waarby latere duplikate geïgnoreer word, en met waardes van [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute)-eienskappe wat voor waardes van naam-eienskappe kom wanneer dieselfde element beide bydra: > > \- Die waarde van die naam-inhoudseienskap vir alle [blootgestelde](https://html.spec.whatwg.org/multipage/dom.html#exposed) [embed](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-embed-element), [form](https://html.spec.whatwg.org/multipage/forms.html#the-form-element), [iframe](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element), [img](https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element), en [blootgestelde](https://html.spec.whatwg.org/multipage/dom.html#exposed) [object](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element)-elemente wat 'n nie-leë naam-inhoudseienskap het en [in 'n dokumentboom](https://dom.spec.whatwg.org/#in-a-document-tree) met die dokument as hul [wortel](https://dom.spec.whatwg.org/#concept-tree-root) is;\ > \ > \- Die waarde van die [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute)-inhoudseienskap vir alle [blootgestelde](https://html.spec.whatwg.org/multipage/dom.html#exposed) [object](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element)-elemente wat 'n nie-leë [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute)-inhoudseienskap het en [in 'n dokumentboom](https://dom.spec.whatwg.org/#in-a-document-tree) met die dokument as hul [wortel](https://dom.spec.whatwg.org/#concept-tree-root) is;\ > \ > \- Die waarde van die [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute)-inhoudseienskap vir alle [img](https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element)-elemente wat beide 'n nie-leë [id](https://html.spec.whatwg.org/multipage/dom.html#the-id-attribute)-inhoudseienskap en 'n nie-leë naam-inhoudseienskap het, en [in 'n dokumentboom](https://dom.spec.whatwg.org/#in-a-document-tree) met die dokument as hul [wortel](https://dom.spec.whatwg.org/#concept-tree-root) 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. ```javascript document.write("") document.cookie typeof(document.cookie) 'object' //Something more sanitize friendly than a img tag document.write("
") document.cookie HTMLCollection(2) [img, form, cookie: img] typeof(document.cookie) 'object ``` ## Skryf nadat die element oorskryf is Die resultate van oproepe na **`document.getElementById()`** en **`document.querySelector()`** kan verander word deur 'n `` of `` tag in te spuit met 'n identiese id-eienskap. Hier is hoe dit gedoen kan word: ```html

clobbered ``` 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: ```html

existing text

clobbered ``` Ondersoeke na SVG het aan die lig gebring dat 'n ``-etiket ook doeltreffend gebruik kan word: ```html clobbered ``` Vir die HTML-etiket om binne SVG te funksioneer in webblaaier soos Chrome en Firefox, is 'n ``-etiket nodig: ```html clobbered ``` ## 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): {% code overflow="wrap" %} ```html ``` {% endcode %} * Vir meer vormatribute in [**knoppie kyk hierdie**](https://www.w3schools.com/tags/tag\_button.asp)**.** ## Verwysings * [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering) * [https://portswigger.net/web-security/dom-based/dom-clobbering](https://portswigger.net/web-security/dom-based/dom-clobbering) * Heyes, Gareth. JavaScript vir hackers: Leer om soos 'n hacker te dink.
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)! * Werk jy in 'n **cybersecurity-maatskappy**? Wil jy jou **maatskappy adverteer in HackTricks**? of wil jy toegang hê tot die **nuutste weergawe van die PEASS of laai HackTricks in PDF af**? Kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! * Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family) * Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com) * **Sluit aan by die** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** my op **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Deel jou hacktruuks deur PR's in te dien by die** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **en** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).