hacktricks/pentesting-web/xss-cross-site-scripting/dom-xss.md
2024-02-10 13:11:20 +00:00

23 KiB

DOM XSS

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

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 {% endhint %}

Uobičajeni izvori:

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 Ubacivanje JavaScript-a Manipulacija DOM podacima 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 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 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 someDOMElement.innerHTML jQuery.parseHTML()
jQuery.globalEval() someDOMElement.href someDOMElement.outerHTML $.parseHTML()
$.globalEval() someDOMElement.src someDOMElement.insertAdjacentHTML Ubacivanje JSON-a na klijentskoj strani
``Manipulacija HTML5 skladištem someDOMElement.action someDOMElement.onevent JSON.parse()
sessionStorage.setItem() Ubacivanje XPath-a 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
requestFileSystem() ``Manipulacija domenskim imenom dokumenta document.implementation.createHTMLDocument() document.cookie
RegExp() document.domain history.pushState() Trovanje URL-om WebSocket-a
Ubacivanje SQL-a na klijentskoj strani Manipulacija web porukama 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

Primeri

Otvoreno preusmeravanje

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

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

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:

document.cookie

JavaScript Injekcija

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

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

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:

document.domain

Trovanje WebSocket-URL-a

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

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:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulacija Ajax zahtevom

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

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

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:

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

Klijentske SQL ubrizgavanja ranjivosti se javljaju kada skripta uključuje podatke koje kontrolira napadač u klijentski SQL upit na nesiguran način.

Curenja:

executeSql()

Manipulacija HTML5 skladištem

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

sessionStorage.setItem()
localStorage.setItem()

XPath ubrizgavanje

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

document.evaluate()
someDOMElement.evaluate()

Ubacivanje JSON-a na klijentskoj strani

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

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

Manipulacija web porukama

Sa: 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.

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

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:

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

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:

requestFileSystem()
RegExp()

Dom Clobbering

{% content-ref url="dom-clobbering.md" %} dom-clobbering.md {% endcontent-ref %}

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!