# DOM XSS
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)! * Da li radite u **cybersecurity kompaniji**? Želite li da vidite vašu **kompaniju reklamiranu na HackTricks-u**? Ili želite da imate pristup **najnovijoj verziji PEASS-a ili preuzmete HackTricks u PDF formatu**? Proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! * Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) * **Pridružite se** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili me **pratite** na **Twitter-u** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **i** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
## DOM Vulnerabilities DOM ranjivosti se javljaju kada podaci sa izvora pod kontrolom napadača (kao što su `location.search`, `document.referrer` ili `document.cookie`) nesigurno prenose na **sinks**. Sinks su funkcije ili objekti (npr. `eval()`, `document.body.innerHTML`) koji mogu izvršiti ili prikazati štetan sadržaj ako im se dostave zlonamerni podaci. - **Sources** su ulazi koji mogu biti manipulisani od strane napadača, uključujući URL-ove, kolačiće i web poruke. - **Sinks** su potencijalno opasni krajnji tačke gde zlonamerni podaci mogu dovesti do nepoželjnih efekata, kao što je izvršavanje skripti. Rizik se javlja kada podaci teku sa izvora do sinka bez odgovarajuće validacije ili sanitizacije, omogućavajući napade poput XSS-a. {% hint style="info" %} **Možete pronaći ažuriranu listu izvora i sinkova na** [**https://github.com/wisec/domxsswiki/wiki**](https://github.com/wisec/domxsswiki/wiki) {% endhint %} **Uobičajeni izvori:** ```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 ``` **Uobičajeni izvori:** | [**Otvoreno preusmeravanje**](dom-xss.md#open-redirect) | [**Ubacivanje JavaScript-a**](dom-xss.md#javascript-injection) | [**Manipulacija DOM podacima**](dom-xss.md#dom-data-manipulation) | **jQuery** | | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------- | | `location` | `eval()` | `scriptElement.src` | `add()` | | `location.host` | `Function() constructor` | `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` | **\`\`**[**Manipulacija lokalnom putanjom datoteke**](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()` | | **\`\`**[**Manipulacija Ajax zahtevom**](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()` | [**Manipulacija linkom**](dom-xss.md#link-manipulation) | `someDOMElement.innerHTML` | `jQuery.parseHTML()` | | `jQuery.globalEval()` | `someDOMElement.href` | `someDOMElement.outerHTML` | `$.parseHTML()` | | `$.globalEval()` | `someDOMElement.src` | `someDOMElement.insertAdjacentHTML` | [**Ubacivanje JSON-a na klijentskoj strani**](dom-xss.md#client-side-sql-injection) | | **\`\`**[**Manipulacija HTML5 skladištem**](dom-xss.md#html-5-storage-manipulation) | `someDOMElement.action` | `someDOMElement.onevent` | `JSON.parse()` | | `sessionStorage.setItem()` | [**Ubacivanje XPath-a**](dom-xss.md#xpath-injection) | `document.write()` | `jQuery.parseJSON()` | | `localStorage.setItem()` | `document.evaluate()` | `document.writeln()` | `$.parseJSON()` | | **``**[**`Odbijanje usluge`**](dom-xss.md#denial-of-service)**``** | `someDOMElement.evaluate()` | `document.title` | **\`\`**[**Manipulacija kolačićima**](dom-xss.md#cookie-manipulation) | | `requestFileSystem()` | **\`\`**[**Manipulacija domenskim imenom dokumenta**](dom-xss.md#document-domain-manipulation) | `document.implementation.createHTMLDocument()` | `document.cookie` | | `RegExp()` | `document.domain` | `history.pushState()` | [**Trovanje URL-om WebSocket-a**](dom-xss.md#websocket-url-poisoning) | | [**Ubacivanje SQL-a na klijentskoj strani**](dom-xss.md#client-side-sql-injection) | [**Manipulacija web porukama**](dom-xss.md#web-message-manipulation) | `history.replaceState()` | `WebSocket` | | `executeSql()` | `postMessage()` | \`\` | \`\` | **`innerHTML`** izvor ne prihvata `script` elemente na bilo kom modernom pregledaču, niti će se pokrenuti događaji `svg onload`. To znači da ćete morati koristiti alternativne elemente poput `img` ili `iframe`. Ovaj tip XSS-a je verovatno **najteže pronaći**, jer morate pogledati unutar JS koda, videti da li koristi bilo koji objekat čiju **vrednost kontrolišete**, i u tom slučaju videti da li postoji **bilo koji način za zloupotrebu** kako bi se izvršio proizvoljni JS. ## Alati za pronalaženje * [https://github.com/mozilla/eslint-plugin-no-unsanitized](https://github.com/mozilla/eslint-plugin-no-unsanitized) ## Primeri ### Otvoreno preusmeravanje Sa: [https://portswigger.net/web-security/dom-based/open-redirection](https://portswigger.net/web-security/dom-based/open-redirection) **Ranjivosti otvorenog preusmeravanja u DOM-u** se javljaju kada skripta upisuje podatke, koje napadač može kontrolisati, u izvor koji može pokrenuti navigaciju između domena. Važno je razumeti da je moguće izvršiti proizvoljni kod, poput **`javascript:alert(1)`**, ako imate kontrolu nad početkom URL-a gde se preusmeravanje dešava. Izvori: ```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() ``` ### Manipulacija kolačićima Izvor: [https://portswigger.net/web-security/dom-based/cookie-manipulation](https://portswigger.net/web-security/dom-based/cookie-manipulation) Ranjivosti DOM bazirane manipulacije kolačićima se javljaju kada skripta uključuje podatke, koje može kontrolisati napadač, u vrednost kolačića. Ova ranjivost može dovesti do neočekivanog ponašanja veb stranice ako se kolačić koristi unutar sajta. Takođe, može biti iskorišćena za izvođenje napada fiksacije sesije ako je kolačić uključen u praćenje korisničkih sesija. Primarni izvor povezan sa ovom ranjivošću je: Izvori: ```javascript document.cookie ``` ### JavaScript Injekcija Izvor: [https://portswigger.net/web-security/dom-based/javascript-injection](https://portswigger.net/web-security/dom-based/javascript-injection) DOM-bazirane ranjivosti JavaScript injekcije se stvaraju kada se skripta izvršava kao JavaScript kod podaci koji mogu biti kontrolisani od strane napadača. Sinks: ```javascript eval() Function() constructor setTimeout() setInterval() setImmediate() execCommand() execScript() msSetImmediate() range.createContextualFragment() crypto.generateCRMFRequest() ``` ### Manipulacija dokument domenom Sa: [https://portswigger.net/web-security/dom-based/document-domain-manipulation](https://portswigger.net/web-security/dom-based/document-domain-manipulation) **Ranjivosti manipulacije dokument domenom** se javljaju kada skripta postavlja svojstvo `document.domain` koristeći podatke koje napadač može kontrolisati. Svojstvo `document.domain` igra **ključnu ulogu** u **sprovođenju** politike **iste-origin** od strane pregledača. Kada dve stranice sa različitih izvora postave svoj `document.domain` na **istu vrednost**, mogu međusobno da komuniciraju bez ograničenja. Iako pregledači postavljaju određena **ograničenja** na vrednosti koje se mogu dodeliti `document.domain`, sprečavajući dodelu potpuno nepovezanih vrednosti stvarnom poreklu stranice, postoje izuzeci. Obično pregledači dozvoljavaju korišćenje **poddomena** ili **roditeljskih domena**. Izvori: ```javascript document.domain ``` ### Trovanje WebSocket-URL-a Izvor: [https://portswigger.net/web-security/dom-based/websocket-url-poisoning](https://portswigger.net/web-security/dom-based/websocket-url-poisoning) **Trovanje WebSocket-URL-a** se javlja kada skripta koristi **kontrolisane podatke kao ciljni URL** za WebSocket konekciju. Sinks: Konstruktor `WebSocket` može dovesti do ranjivosti trovanja WebSocket-URL-a. ### Manipulacija linkovima Izvor: [https://portswigger.net/web-security/dom-based/link-manipulation](https://portswigger.net/web-security/dom-based/link-manipulation) **Ranjivosti manipulacije linkovima bazirane na DOM-u** se javljaju kada skripta upisuje **podatke koje napadač može kontrolisati u ciljni navigacioni element** unutar trenutne stranice, kao što je klikabilni link ili URL za slanje forme. Sinks: ```javascript someDOMElement.href someDOMElement.src someDOMElement.action ``` ### Manipulacija Ajax zahtevom Izvor: [https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation](https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation) **Ranjivosti manipulacije Ajax zahtevom** se javljaju kada skripta upisuje **podatke koje kontrolira napadač u Ajax zahtev** koji se izdaje koristeći objekat `XmlHttpRequest`. Curenje: ```javascript XMLHttpRequest.setRequestHeader() XMLHttpRequest.open() XMLHttpRequest.send() jQuery.globalEval() $.globalEval() ``` ### Manipulacija lokalnim putanjama datoteka Izvor: [https://portswigger.net/web-security/dom-based/local-file-path-manipulation](https://portswigger.net/web-security/dom-based/local-file-path-manipulation) **Ranjivosti manipulacije lokalnim putanjama datoteka** nastaju kada skripta prosleđuje **podatke koje kontrolira napadač API-ju za rukovanje datotekama** kao parametar `filename`. Ova ranjivost može biti iskorišćena od strane napadača da konstruiše URL koji, ako ga poseti drugi korisnik, može dovesti do toga da **korisnikov pregledač otvori ili upiše proizvoljnu lokalnu datoteku**. Izvori: ```javascript FileReader.readAsArrayBuffer() FileReader.readAsBinaryString() FileReader.readAsDataURL() FileReader.readAsText() FileReader.readAsFile() FileReader.root.getFile() FileReader.root.getFile() ``` ### Klijentska SQL ubrizgavanja Izvor: [https://portswigger.net/web-security/dom-based/client-side-sql-injection](https://portswigger.net/web-security/dom-based/client-side-sql-injection) **Klijentske SQL ubrizgavanja ranjivosti** se javljaju kada skripta uključuje **podatke koje kontrolira napadač u klijentski SQL upit na nesiguran način**. Curenja: ```javascript executeSql() ``` ### Manipulacija HTML5 skladištem Izvor: [https://portswigger.net/web-security/dom-based/html5-storage-manipulation](https://portswigger.net/web-security/dom-based/html5-storage-manipulation) **Ranjivosti manipulacije HTML5 skladištem** nastaju kada skripta **smešta podatke koje kontrolira napadač u HTML5 skladište web pregledača** (`localStorage` ili `sessionStorage`). Iako ova radnja sama po sebi nije bezbednosna ranjivost, postaje problematična ako aplikacija kasnije **čita smeštene podatke i nebezbedno ih obrađuje**. Ovo bi omogućilo napadaču da iskoristi mehanizam skladištenja za izvođenje drugih napada zasnovanih na DOM-u, kao što su XSS (cross-site scripting) i ubacivanje JavaScript koda. Izvori: ```javascript sessionStorage.setItem() localStorage.setItem() ``` ### XPath ubrizgavanje Izvor: [https://portswigger.net/web-security/dom-based/client-side-xpath-injection](https://portswigger.net/web-security/dom-based/client-side-xpath-injection) **DOM-bazirane ranjivosti na XPath ubrizgavanje** se javljaju kada skripta uključuje **podatke koje kontrolira napadač u XPath upitu**. Curenje: ```javascript document.evaluate() someDOMElement.evaluate() ``` ### Ubacivanje JSON-a na klijentskoj strani Izvor: [https://portswigger.net/web-security/dom-based/client-side-json-injection](https://portswigger.net/web-security/dom-based/client-side-json-injection) **DOM bazirane ranjivosti ubacivanja JSON-a** se javljaju kada skripta uključuje **podatke koje kontrolira napadač u string koji se parsira kao JSON struktura podataka, a zatim se obrađuje od strane aplikacije**. Curenje: ```javascript JSON.parse() jQuery.parseJSON() $.parseJSON() ``` ### Manipulacija web porukama Sa: [https://portswigger.net/web-security/dom-based/web-message-manipulation](https://portswigger.net/web-security/dom-based/web-message-manipulation) **Ranjivosti web poruka** se javljaju kada skripta šalje podatke koje kontrolira napadač kao web poruku drugom dokumentu unutar pregledača. **Primer** ranjivosti manipulacije web porukama može se pronaći na [PortSwigger-ovoj Akademiji za web bezbednost](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source). Izvori: Metoda `postMessage()` za slanje web poruka može dovesti do ranjivosti ako slušalac događaja za prijem poruka obrađuje dolazne podatke na nesiguran način. ### Manipulacija DOM podacima Sa: [https://portswigger.net/web-security/dom-based/dom-data-manipulation](https://portswigger.net/web-security/dom-based/dom-data-manipulation) **Ranjivosti manipulacije DOM podacima** se javljaju kada skripta upisuje podatke koje kontrolira napadač u polje unutar DOM-a koje se koristi u vidljivom korisničkom interfejsu ili klijentskoj logici. Ova ranjivost može biti iskorišćena od strane napadača da konstruiše URL koji, ako ga poseti drugi korisnik, može promeniti izgled ili ponašanje klijentskog korisničkog interfejsa. Izvori: ```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() ``` ### Odbijanje usluge Izvor: [https://portswigger.net/web-security/dom-based/denial-of-service](https://portswigger.net/web-security/dom-based/denial-of-service) **DOM-based ranjivosti odbijanja usluge** se javljaju kada skripta nesigurno prosleđuje podatke koje kontrolira napadač do problematičnog API-ja platforme. To uključuje API-je koji, kada se pozovu, mogu dovesti do toga da računar korisnika troši prekomerne količine CPU-a ili prostora na disku. Takve ranjivosti mogu imati značajne sporedne efekte, kao što je ograničavanje funkcionalnosti veb pregledača odbijanjem pokušaja skladištenja podataka u `localStorage` ili prekid zauzetih skripti. Izvori: ```javascript requestFileSystem() RegExp() ``` ## Dom Clobbering {% content-ref url="dom-clobbering.md" %} [dom-clobbering.md](dom-clobbering.md) {% endcontent-ref %}
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)! * Da li radite u **cybersecurity kompaniji**? Želite li da vidite **vašu kompaniju reklamiranu na HackTricks-u**? Ili želite da imate pristup **najnovijoj verziji PEASS-a ili preuzmete HackTricks u PDF formatu**? Proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! * Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) * **Pridružite se** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili me **pratite** na **Twitter-u** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **i** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).