# DOM XSS
Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)! * Werk jy by 'n **cybersekuriteitsmaatskappy**? Wil jy jou **maatskappy geadverteer sien in HackTricks**? of wil jy toegang hê tot die **nuutste weergawe van die PEASS of HackTricks aflaai in PDF-formaat**? Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)! * Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family) * Kry die [**amptelike PEASS & HackTricks-klere**](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 haktruuks deur PR's in te dien by die** [**hacktricks-opslag**](https://github.com/carlospolop/hacktricks) **en** [**hacktricks-cloud-opslag**](https://github.com/carlospolop/hacktricks-cloud).
## DOM Kwesbaarhede DOM-kwesbaarhede kom voor wanneer data vanaf aanvaller-beheerde **bronne** (soos `location.search`, `document.referrer`, of `document.cookie`) onveilig oorgedra word na **sinks**. Sinks is funksies of voorwerpe (bv., `eval()`, `document.body.innerHTML`) wat skadelike inhoud kan uitvoer of vertoon as dit kwaadwillige data ontvang. * **Bronne** is insette wat deur aanvallers gemanipuleer kan word, insluitend URL's, koekies, en webboodskappe. * **Sinks** is potensieel gevaarlike eindpunte waar kwaadwillige data kan lei tot nadelige gevolge, soos skripsie-uitvoering. Die risiko ontstaan wanneer data vloei vanaf 'n bron na 'n sink sonder behoorlike validering of sanitisering, wat aanvalle soos XSS moontlik maak. {% hint style="info" %} **Jy kan 'n meer opgedateerde lys van bronne en sinks vind op** [**https://github.com/wisec/domxsswiki/wiki**](https://github.com/wisec/domxsswiki/wiki) {% endhint %} **Gewone bronne:** ```javascript document.URL document.documentURI document.URLUnencoded document.baseURI location document.cookie document.referrer window.name history.pushState history.replaceState localStorage sessionStorage IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB) Database ``` **Gewone Sinks:** | [**Oopverwysing**](dom-xss.md#open-redirect) | [**Javascript-inspuiting**](dom-xss.md#javascript-injection) | [**DOM-data manipulasie**](dom-xss.md#dom-data-manipulation) | **jQuery** | | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------- | | `location` | `eval()` | `scriptElement.src` | `add()` | | `location.host` | `Function() konstrukteur` | `scriptElement.text` | `after()` | | `location.hostname` | `setTimeout()` | `scriptElement.textContent` | `append()` | | `location.href` | `setInterval()` | `scriptElement.innerText` | `animate()` | | `location.pathname` | `setImmediate()` | `someDOMElement.setAttribute()` | `insertAfter()` | | `location.search` | `execCommand()` | `someDOMElement.search` | `insertBefore()` | | `location.protocol` | `execScript()` | `someDOMElement.text` | `before()` | | `location.assign()` | `msSetImmediate()` | `someDOMElement.textContent` | `html()` | | `location.replace()` | `range.createContextualFragment()` | `someDOMElement.innerText` | `prepend()` | | `open()` | `crypto.generateCRMFRequest()` | `someDOMElement.outerText` | `replaceAll()` | | `domElem.srcdoc` | **\`\`**[**Plaaslike lêerpad-manipulasie**](dom-xss.md#local-file-path-manipulation) | `someDOMElement.value` | `replaceWith()` | | `XMLHttpRequest.open()` | `FileReader.readAsArrayBuffer()` | `someDOMElement.name` | `wrap()` | | `XMLHttpRequest.send()` | `FileReader.readAsBinaryString()` | `someDOMElement.target` | `wrapInner()` | | `jQuery.ajax()` | `FileReader.readAsDataURL()` | `someDOMElement.method` | `wrapAll()` | | `$.ajax()` | `FileReader.readAsText()` | `someDOMElement.type` | `has()` | | **\`\`**[**Ajax versoek-manipulasie**](dom-xss.md#ajax-request-manipulation) | `FileReader.readAsFile()` | `someDOMElement.backgroundImage` | `constructor()` | | `XMLHttpRequest.setRequestHeader()` | `FileReader.root.getFile()` | `someDOMElement.cssText` | `init()` | | `XMLHttpRequest.open()` | `FileReader.root.getFile()` | `someDOMElement.codebase` | `index()` | | `XMLHttpRequest.send()` | [**Skakel-manipulasie**](dom-xss.md#link-manipulation) | `someDOMElement.innerHTML` | `jQuery.parseHTML()` | | `jQuery.globalEval()` | `someDOMElement.href` | `someDOMElement.outerHTML` | `$.parseHTML()` | | `$.globalEval()` | `someDOMElement.src` | `someDOMElement.insertAdjacentHTML` | [**Kliëntkant JSON-inspuiting**](dom-xss.md#client-side-sql-injection) | | **\`\`**[**HTML5-opberging-manipulasie**](dom-xss.md#html-5-storage-manipulation) | `someDOMElement.action` | `someDOMElement.onevent` | `JSON.parse()` | | `sessionStorage.setItem()` | [**XPath-inspuiting**](dom-xss.md#xpath-injection) | `document.write()` | `jQuery.parseJSON()` | | `localStorage.setItem()` | `document.evaluate()` | `document.writeln()` | `$.parseJSON()` | | **``**[**`Ontkenning van Diens`**](dom-xss.md#denial-of-service)**``** | `someDOMElement.evaluate()` | `document.title` | **\`\`**[**Koekie-manipulasie**](dom-xss.md#cookie-manipulation) | | `requestFileSystem()` | **\`\`**[**Dokument-domein-manipulasie**](dom-xss.md#document-domain-manipulation) | `document.implementation.createHTMLDocument()` | `document.cookie` | | `RegExp()` | `document.domain` | `history.pushState()` | [**WebSocket-URL-vergiftiging**](dom-xss.md#websocket-url-poisoning) | | [**Kliëntkant SQL-inspuiting**](dom-xss.md#client-side-sql-injection) | [**Web-boodskap-manipulasie**](dom-xss.md#web-message-manipulation) | `history.replaceState()` | `WebSocket` | | `executeSql()` | `postMessage()` | \`\` | \`\` | Die **`innerHTML`** sink aanvaar nie `script` elemente op enige moderne webblaaier nie, en ook nie sal `svg onload` gebeure plaasvind nie. Dit beteken dat jy alternatiewe elemente soos `img` of `iframe` sal moet gebruik. Hierdie tipe XSS is waarskynlik die **moeilikste om te vind**, aangesien jy binne-in die JS-kode moet kyk, sien of dit enige objek gebruik waarvan jy die **waarde beheer**, en in daardie geval sien of daar **enige manier is om** dit te misbruik om arbitêre JS uit te voer. ## Gereedskap om hulle te vind * [https://github.com/mozilla/eslint-plugin-no-unsanitized](https://github.com/mozilla/eslint-plugin-no-unsanitized) * Webblaaier-uitbreiding om elke data te kontroleer wat 'n potensiële sink bereik: [https://github.com/kevin-mizu/domloggerpp](https://github.com/kevin-mizu/domloggerpp) ## Voorbeelde ### Oopverwysing Van: [https://portswigger.net/web-security/dom-based/open-redirection](https://portswigger.net/web-security/dom-based/open-redirection) **Oopverwysbaarhede in die DOM** kom voor wanneer 'n skrips data skryf, wat 'n aanvaller kan beheer, na 'n sink wat in staat is om navigasie oor domeine te inisieer. Dit is noodsaaklik om te verstaan dat die uitvoer van arbitêre kode, soos **`javascript:alert(1)`**, moontlik is as jy beheer het oor die begin van die URL waar die oorverwysing plaasvind. Sinks: ```javascript location location.host location.hostname location.href location.pathname location.search location.protocol location.assign() location.replace() open() domElem.srcdoc XMLHttpRequest.open() XMLHttpRequest.send() jQuery.ajax() $.ajax() ``` ### Koekie manipulasie Van: [https://portswigger.net/web-security/dom-based/cookie-manipulation](https://portswigger.net/web-security/dom-based/cookie-manipulation) DOM-gebaseerde koekie-manipulasie kwesbaarhede kom voor wanneer 'n skriffie data insluit, wat deur 'n aanvaller beheer kan word, in die waarde van 'n koekie. Hierdie kwesbaarheid kan lei tot onverwagte gedrag van die webbladsy as die koekie binne die webwerf gebruik word. Daarbenewens kan dit uitgebuit word om 'n sessie-fixasie aanval uit te voer as die koekie betrokke is by die opsporing van gebruikersessies. Die primêre sink wat met hierdie kwesbaarheid geassosieer word, is: Sinks: ```javascript document.cookie ``` ### JavaScript Injeksie Van: [https://portswigger.net/web-security/dom-based/javascript-injection](https://portswigger.net/web-security/dom-based/javascript-injection) DOM-gebaseerde JavaScript-injeksie kwetsbaarhede word geskep wanneer 'n skrip data uitvoer wat deur 'n aanvaller beheer kan word as JavaScript-kode. Sinks: ```javascript eval() Function() constructor setTimeout() setInterval() setImmediate() execCommand() execScript() msSetImmediate() range.createContextualFragment() crypto.generateCRMFRequest() ``` ### Dokument-domein manipulasie Van: [https://portswigger.net/web-security/dom-based/document-domain-manipulation](https://portswigger.net/web-security/dom-based/document-domain-manipulation) **Dokument-domein manipulasie kwesbaarhede** kom voor wanneer 'n skriffie die `document.domain` eienskap instel met behulp van data wat 'n aanvaller kan beheer. Die `document.domain` eienskap speel 'n **sleutelrol** in die **afdwinging** van die **selfde-oorsprong beleid** deur webblaaier. Wanneer twee bladsye van verskillende oorsprong hul `document.domain` na dieselfde waarde instel, kan hulle sonder beperkings interaksie hê. Alhoewel webblaaier sekere **grense** afdwing op die waardes wat toewysbaar is aan `document.domain`, wat die toewysing van heeltemal onverwante waardes aan die werklike bladsy-oorsprong voorkom, bestaan daar uitsonderings. Tipies laat webblaaier die gebruik van **kind** of **ouer domeine** toe. Sinks: ```javascript document.domain ``` ### WebSocket-URL vergiftiging Van: [https://portswigger.net/web-security/dom-based/websocket-url-poisoning](https://portswigger.net/web-security/dom-based/websocket-url-poisoning) **WebSocket-URL vergiftiging** gebeur wanneer 'n skriffie **beheerbare data as die teiken-URL** vir 'n WebSocket-verbinding gebruik. Sinks: Die `WebSocket` konstrukteur kan lei tot WebSocket-URL vergiftiging kwesbaarhede. ### Skakel manipulasie Van: [https://portswigger.net/web-security/dom-based/link-manipulation](https://portswigger.net/web-security/dom-based/link-manipulation) **DOM-gebaseerde skakel-manipulasie kwesbaarhede** ontstaan wanneer 'n skriffie **aanvaller-beheerbare data na 'n navigasie teiken** binne die huidige bladsy skryf, soos 'n kliekbare skakel of die indienings-URL van 'n vorm. Sinks: ```javascript someDOMElement.href someDOMElement.src someDOMElement.action ``` ### Ajax versoek manipulasie Van: [https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation](https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation) **Ajax versoek manipulasie kwesbaarhede** ontstaan wanneer 'n skriffie **aanvaller-beheerbare data in 'n Ajax versoek skryf** wat uitgereik word met behulp van 'n `XmlHttpRequest` objek. Sinks: ```javascript XMLHttpRequest.setRequestHeader() XMLHttpRequest.open() XMLHttpRequest.send() jQuery.globalEval() $.globalEval() ``` ### Plaaslike lêerpaadjie manipulasie Van: [https://portswigger.net/web-security/dom-based/local-file-path-manipulation](https://portswigger.net/web-security/dom-based/local-file-path-manipulation) **Plaaslike lêerpaadjie manipulasie kwesbaarhede** ontstaan wanneer 'n skriffie **aanvaller-beheerbare data deurgee na 'n lêerhanterings-API** as die `filename` parameter. Hierdie kwesbaarheid kan deur 'n aanvaller uitgebuit word om 'n URL te konstrueer wat, indien besoek deur 'n ander gebruiker, kan lei tot die **gebruiker se blaaier wat 'n willekeurige plaaslike lêer oopmaak of skryf**. Sinks: ```javascript FileReader.readAsArrayBuffer() FileReader.readAsBinaryString() FileReader.readAsDataURL() FileReader.readAsText() FileReader.readAsFile() FileReader.root.getFile() FileReader.root.getFile() ``` ### Kliëntkant SQL-inspuiting Van: [https://portswigger.net/web-security/dom-based/client-side-sql-injection](https://portswigger.net/web-security/dom-based/client-side-sql-injection) **Kliëntkant SQL-inspuitingskwetsbaarhede** kom voor wanneer 'n skriffie **aanvaller-beheerbare data op 'n onveilige manier in 'n kliëntkant SQL-navraag inkorporeer**. Sinks: ```javascript executeSql() ``` ### HTML5-opberging manipulasie Van: [https://portswigger.net/web-security/dom-based/html5-storage-manipulation](https://portswigger.net/web-security/dom-based/html5-storage-manipulation) **HTML5-opberging manipulasie kwesbaarhede** ontstaan wanneer 'n skrip **aanvaller-beheerbare data in die webblaaier se HTML5-opberging** (`localStorage` of `sessionStorage`) stoor. Terwyl hierdie aksie nie inherent 'n sekuriteitskwesbaarheid is nie, word dit problematies as die aansoek daarna **die gestoorde data lees en dit onveilig verwerk**. Dit kan 'n aanvaller in staat stel om die opbergingsmeganisme te benut om ander DOM-gebaseerde aanvalle uit te voer, soos kruissite-skripsing en JavaScript-inspuiting. Sinks: ```javascript sessionStorage.setItem() localStorage.setItem() ``` ### XPath inspuiting Van: [https://portswigger.net/web-security/dom-based/client-side-xpath-injection](https://portswigger.net/web-security/dom-based/client-side-xpath-injection) **DOM-gebaseerde XPath-inspuitingskwetsbaarhede** kom voor wanneer 'n skriffie **aanvaller-beheerbare data in 'n XPath-soektog** inkorporeer. Sinks: ```javascript document.evaluate() someDOMElement.evaluate() ``` ### Kliëntkant JSON-inspuiting Van: [https://portswigger.net/web-security/dom-based/client-side-json-injection](https://portswigger.net/web-security/dom-based/client-side-json-injection) **DOM-gebaseerde JSON-inspuitingskwetsbaarhede** kom voor wanneer 'n skriffie **aanvaller-beheerbare data inkorporeer in 'n string wat as 'n JSON-datastruktuur geïnterpreteer word en dan deur die aansoek verwerk word**. Sinks: ```javascript JSON.parse() jQuery.parseJSON() $.parseJSON() ``` ### Web-boodskap manipulasie Van: [https://portswigger.net/web-security/dom-based/web-message-manipulation](https://portswigger.net/web-security/dom-based/web-message-manipulation) **Web-boodskap kwesbaarhede** ontstaan wanneer 'n skrip **aanvaller-beheerbare data as 'n web-boodskap na 'n ander dokument** binne die blaaier stuur. 'n **Voorbeeld** van 'n kwesbare Web-boodskap manipulasie kan gevind word by [PortSwigger se Web Security Academy](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source). Sinks: Die `postMessage()` metode vir die stuur van web-boodskappe kan lei tot kwesbaarhede as die gebeurtenisluister vir die ontvangs van boodskappe die inkomende data op 'n onveilige manier hanteer. ### DOM-data manipulasie Van: [https://portswigger.net/web-security/dom-based/dom-data-manipulation](https://portswigger.net/web-security/dom-based/dom-data-manipulation) **DOM-data manipulasie kwesbaarhede** ontstaan wanneer 'n skrip **aanvaller-beheerbare data na 'n veld binne die DOM skryf** wat gebruik word binne die sigbare UI of kliëntkant-logika. Hierdie kwesbaarheid kan deur 'n aanvaller uitgebuit word om 'n URL te konstrueer wat, indien deur 'n ander gebruiker besoek, die voorkoms of gedrag van die kliëntkant UI kan verander. Sinks: ```javascript scriptElement.src scriptElement.text scriptElement.textContent scriptElement.innerText someDOMElement.setAttribute() someDOMElement.search someDOMElement.text someDOMElement.textContent someDOMElement.innerText someDOMElement.outerText someDOMElement.value someDOMElement.name someDOMElement.target someDOMElement.method someDOMElement.type someDOMElement.backgroundImage someDOMElement.cssText someDOMElement.codebase document.title document.implementation.createHTMLDocument() history.pushState() history.replaceState() ``` ### Ontkenning van Diens Van: [https://portswigger.net/web-security/dom-based/denial-of-service](https://portswigger.net/web-security/dom-based/denial-of-service) **DOM-gebaseerde ontkenning-van-diens kwesbaarhede** gebeur wanneer 'n skriffie **aanvaller-beheerbare data onveilig deurgee na 'n problematiese platform API**. Dit sluit API's in wat, wanneer geaktiveer, kan lei tot die gebruiker se rekenaar wat **oormatige hoeveelhede CPU of skyfspasie verbruik**. Sulke kwesbaarhede kan beduidende newe-effekte hê, soos die webblaaier wat die webwerf se funksionaliteit beperk deur pogings om data in `localStorage` te stoor te verwerp of besige skripte te beëindig. Sinks: ```javascript requestFileSystem() RegExp() ``` ## Dom Clobbering {% content-ref url="dom-clobbering.md" %} [dom-clobbering.md](dom-clobbering.md) {% endcontent-ref %}
Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)! * Werk jy by 'n **cybersekuriteitsmaatskappy**? Wil jy hê dat jou **maatskappy geadverteer word in HackTricks**? of wil jy toegang hê tot die **nuutste weergawe van die PEASS of laai HackTricks in PDF af**? Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)! * Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](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 haktruuks deur PR's in te dien by die** [**hacktricks-opslag**](https://github.com/carlospolop/hacktricks) **en** [**hacktricks-cloud-opslag**](https://github.com/carlospolop/hacktricks-cloud).