DOM XSS

Reading time: 10 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks

DOM Ranljivosti

DOM ranljivosti se javljaju kada se podaci iz izvora pod kontrolom napadača (kao što su location.search, document.referrer ili document.cookie) nesigurno prenose u sinks. Sinks su funkcije ili objekti (npr., eval(), document.body.innerHTML) koji mogu izvršiti ili prikazati štetan sadržaj ako dobiju zlonamerne podatke.

  • Izvori su ulazi koje napadači mogu manipulisati, uključujući URL-ove, kolačiće i web poruke.
  • Sinks su potencijalno opasne tačke gde zlonamerni podaci mogu dovesti do negativnih efekata, kao što je izvršavanje skripti.

Rizik nastaje kada podaci teku od izvora do sinka bez pravilne validacije ili sanitizacije, omogućavajući napade poput XSS-a.

note

Možete pronaći ažuriraniju listu izvora i sinks na https://github.com/wisec/domxsswiki/wiki

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 Sinks:

Otvoreni preusmeravanjeJavascript injekcijaDOM-manipulacija podacimajQuery
locationeval()scriptElement.srcadd()
location.hostFunction() konstruktorscriptElement.textafter()
location.hostnamesetTimeout()scriptElement.textContentappend()
location.hrefsetInterval()scriptElement.innerTextanimate()
location.pathnamesetImmediate()someDOMElement.setAttribute()insertAfter()
location.searchexecCommand()someDOMElement.searchinsertBefore()
location.protocolexecScript()someDOMElement.textbefore()
location.assign()msSetImmediate()someDOMElement.textContenthtml()
location.replace()range.createContextualFragment()someDOMElement.innerTextprepend()
open()crypto.generateCRMFRequest()someDOMElement.outerTextreplaceAll()
domElem.srcdoc``Manipulacija lokalnim putanjamasomeDOMElement.valuereplaceWith()
XMLHttpRequest.open()FileReader.readAsArrayBuffer()someDOMElement.namewrap()
XMLHttpRequest.send()FileReader.readAsBinaryString()someDOMElement.targetwrapInner()
jQuery.ajax()FileReader.readAsDataURL()someDOMElement.methodwrapAll()
$.ajax()FileReader.readAsText()someDOMElement.typehas()
``Manipulacija Ajax zahtevimaFileReader.readAsFile()someDOMElement.backgroundImageconstructor()
XMLHttpRequest.setRequestHeader()FileReader.root.getFile()someDOMElement.cssTextinit()
XMLHttpRequest.open()FileReader.root.getFile()someDOMElement.codebaseindex()
XMLHttpRequest.send()Manipulacija linkovimasomeDOMElement.innerHTMLjQuery.parseHTML()
jQuery.globalEval()someDOMElement.hrefsomeDOMElement.outerHTML$.parseHTML()
$.globalEval()someDOMElement.srcsomeDOMElement.insertAdjacentHTMLInjekcija JSON na klijentskoj strani
``Manipulacija HTML5 skladištemsomeDOMElement.actionsomeDOMElement.oneventJSON.parse()
sessionStorage.setItem()Injekcija XPathdocument.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
requestFileSystem()``Manipulacija domenom dokumentadocument.implementation.createHTMLDocument()document.cookie
RegExp()document.domainhistory.pushState()Trovanje WebSocket-URL-a
Injekcija SQl na klijentskoj straniManipulacija web-porukamahistory.replaceState()WebSocket
executeSql()postMessage()````

innerHTML sink ne prihvata script elemente u bilo kojem modernom pretraživaču, niti će svg onload događaji biti aktivirani. To znači da ćete morati koristiti alternativne elemente kao što su img ili iframe.

Ova vrsta XSS-a je verovatno najteža za pronalaženje, 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 da ga zloupotrebite za izvršavanje proizvoljnog JS-a.

Alati za pronalaženje

Primeri

Otvoreni preusmeravanje

Sa: https://portswigger.net/web-security/dom-based/open-redirection

Ranljivosti otvorenog preusmeravanja u DOM-u se javljaju kada skripta piše podatke, koje napadač može kontrolisati, u sinku sposobnom da inicira navigaciju između domena.

Ključno je razumeti da je izvršavanje proizvoljnog koda, kao što je javascript:alert(1), moguće ako imate kontrolu nad početkom URL-a gde se preusmeravanje dešava.

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()

Manipulacija kolačićima

From: https://portswigger.net/web-security/dom-based/cookie-manipulation

DOM-bazirane ranjivosti 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. Pored toga, može se iskoristiti za izvođenje napada fiksacije sesije ako je kolačić uključen u praćenje korisničkih sesija. Primarni odvod povezan sa ovom ranjivošću je:

Sinks:

javascript
document.cookie

JavaScript Injection

From: https://portswigger.net/web-security/dom-based/javascript-injection

DOM-bazirane ranjivosti za JavaScript injekciju nastaju kada skripta izvršava podatke, koje može kontrolisati napadač, kao JavaScript kod.

Sinks:

javascript
eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()

Manipulacija dokument-domenom

From: https://portswigger.net/web-security/dom-based/document-domain-manipulation

Ranljivosti manipulacije dokument-domenom se javljaju kada skripta postavlja document.domain svojstvo koristeći podatke koje napadač može kontrolisati.

Svojstvo document.domain igra ključnu ulogu u sprovodjenju politike iste porekla od strane pregledača. Kada dve stranice iz različitih porekla postave svoj document.domain na istu vrednost, mogu da komuniciraju bez ograničenja. Iako pregledači nameću određene ograničenja na vrednosti koje se mogu dodeliti document.domain, sprečavajući dodeljivanje potpuno nepovezanih vrednosti stvarnom poreklu stranice, postoje izuzeci. Obično, pregledači dozvoljavaju korišćenje dečijih ili roditeljskih domena.

Sinks:

javascript
document.domain

WebSocket-URL poisoning

From: https://portswigger.net/web-security/dom-based/websocket-url-poisoning

WebSocket-URL poisoning se dešava kada skripta koristi kontrolisane podatke kao ciljni URL za WebSocket vezu.

Sinks:

WebSocket konstruktor može dovesti do ranjivosti WebSocket-URL poisoning.

From: https://portswigger.net/web-security/dom-based/link-manipulation

DOM-based link-manipulation vulnerabilities nastaju kada skripta piše podatke koje kontroliše napadač na navigacioni cilj unutar trenutne stranice, kao što je klikabilna veza ili URL za slanje forme.

Sinks:

javascript
someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulacija Ajax zahtevima

From: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation

Ranljivosti manipulacije Ajax zahtevima nastaju kada skripta upisuje podatke koje kontroliše napadač u Ajax zahtev koji se izdaje koristeći XmlHttpRequest objekat.

Sinks:

javascript
XMLHttpRequest.setRequestHeader()
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.globalEval()
$.globalEval()

Manipulacija lokalnim putanjama datoteka

From: https://portswigger.net/web-security/dom-based/local-file-path-manipulation

Ranljivosti manipulacije lokalnim putanjama datoteka nastaju kada skripta prosledi podatke koje kontroliše napadač API-ju za rukovanje datotekama kao filename parametar. Ovu ranljivost može iskoristiti napadač da konstruira URL koji, ako ga poseti drugi korisnik, može dovesti do otvaranja ili pisanja proizvoljne lokalne datoteke u korisnikovom pretraživaču.

Sinks:

javascript
FileReader.readAsArrayBuffer()
FileReader.readAsBinaryString()
FileReader.readAsDataURL()
FileReader.readAsText()
FileReader.readAsFile()
FileReader.root.getFile()
FileReader.root.getFile()

SQL injekcija na klijentskoj strani

From: https://portswigger.net/web-security/dom-based/client-side-sql-injection

Ranljivosti SQL injekcije na klijentskoj strani se javljaju kada skripta uključuje podatke koje napadač može kontrolisati u SQL upitu na klijentskoj strani na nesiguran način.

Sinks:

javascript
executeSql()

HTML5-storage manipulacija

From: https://portswigger.net/web-security/dom-based/html5-storage-manipulation

HTML5-storage manipulacija ranjivosti se javljaju kada skripta čuva podatke koje kontroliše napadač u HTML5 skladištu web pretraživača (localStorage ili sessionStorage). Iako ova akcija nije inherentno sigurnosna ranjivost, postaje problematična ako aplikacija kasnije čita sačuvane podatke i obrađuje ih nesigurno. Ovo bi moglo omogućiti napadaču da iskoristi mehanizam skladištenja za izvođenje drugih DOM-baziranih napada, kao što su cross-site scripting i JavaScript injekcija.

Sinks:

javascript
sessionStorage.setItem()
localStorage.setItem()

XPath injekcija

From: https://portswigger.net/web-security/dom-based/client-side-xpath-injection

DOM-bazirane XPath-injekcione ranjivosti se javljaju kada skripta uključuje podatke koje napadač može kontrolisati u XPath upit.

Sinks:

javascript
document.evaluate()
someDOMElement.evaluate()

Klijentska JSON injekcija

From: https://portswigger.net/web-security/dom-based/client-side-json-injection

DOM-bazirane JSON-injekcione ranjivosti se javljaju kada skripta uključuje podatke koje kontroliše napadač u string koji se parsira kao JSON struktura podataka i zatim obrađuje od strane aplikacije.

Sinks:

javascript
JSON.parse()
jQuery.parseJSON()
$.parseJSON()

Manipulacija web-porukama

From: https://portswigger.net/web-security/dom-based/web-message-manipulation

Ranljivosti web-poruka nastaju kada skripta šalje podatke koje kontroliše napadač kao web-poruku drugom dokumentu unutar pregledača. Primer ranjive manipulacije web-porukama može se naći na PortSwigger's Web Security Academy.

Sinks:

Metoda postMessage() za slanje web-poruka može dovesti do ranjivosti ako slušalac događaja za primanje poruka obrađuje dolazne podatke na nesiguran način.

Manipulacija DOM-podacima

From: https://portswigger.net/web-security/dom-based/dom-data-manipulation

Ranljivosti manipulacije DOM-podacima nastaju kada skripta piše podatke koje kontroliše napadač u polje unutar DOM-a koje se koristi unutar vidljivog UI-a ili klijentske logike. Ovu ranjivost može iskoristiti napadač da konstruira URL koji, ako ga poseti drugi korisnik, može promeniti izgled ili ponašanje klijentskog UI-a.

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()

Odbijanje usluge

From: https://portswigger.net/web-security/dom-based/denial-of-service

DOM-bazirane ranjivosti za odbijanje usluge se javljaju kada skripta prenosi podatke koje kontroliše napadač na nesiguran način do problematičnog platformskog API-ja. Ovo uključuje API-je koji, kada se pozovu, mogu dovesti do toga da korisnički računar troši prekomerne količine CPU-a ili prostora na disku. Takve ranjivosti mogu imati značajne nuspojave, kao što je ograničavanje funkcionalnosti veb sajta od strane pregledača odbijanjem pokušaja čuvanja podataka u localStorage ili prekidanje zauzetih skripti.

Sinks:

javascript
requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks