DOM XSS

Support HackTricks

DOM Vulnerabilities

Vulnerabilities DOM występują, gdy dane z kontrolowanych przez atakującego źródeł (takich jak location.search, document.referrer lub document.cookie) są niebezpiecznie przekazywane do sinków. Sinki to funkcje lub obiekty (np. eval(), document.body.innerHTML), które mogą wykonywać lub renderować szkodliwą treść, jeśli otrzymają złośliwe dane.

  • Źródła to dane wejściowe, które mogą być manipulowane przez atakujących, w tym URL-e, ciasteczka i wiadomości internetowe.

  • Sinki to potencjalnie niebezpieczne punkty końcowe, w których złośliwe dane mogą prowadzić do negatywnych skutków, takich jak wykonanie skryptu.

Ryzyko pojawia się, gdy dane przepływają z źródła do sinka bez odpowiedniej walidacji lub sanitacji, co umożliwia ataki takie jak XSS.

Możesz znaleźć bardziej aktualną listę źródeł i sinków w https://github.com/wisec/domxsswiki/wiki

Common sources:

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

Common Sinks:

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

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

FileReader.readAsFile()

someDOMElement.backgroundImage

constructor()

XMLHttpRequest.setRequestHeader()

FileReader.root.getFile()

someDOMElement.cssText

init()

XMLHttpRequest.open()

FileReader.root.getFile()

someDOMElement.codebase

index()

XMLHttpRequest.send()

someDOMElement.innerHTML

jQuery.parseHTML()

jQuery.globalEval()

someDOMElement.href

someDOMElement.outerHTML

$.parseHTML()

$.globalEval()

someDOMElement.src

someDOMElement.insertAdjacentHTML

someDOMElement.action

someDOMElement.onevent

JSON.parse()

sessionStorage.setItem()

document.write()

jQuery.parseJSON()

localStorage.setItem()

document.evaluate()

document.writeln()

$.parseJSON()

**[**`Denial of Service`**](dom-xss.md#denial-of-service)**

someDOMElement.evaluate()

document.title

requestFileSystem()

document.implementation.createHTMLDocument()

document.cookie

RegExp()

document.domain

history.pushState()

history.replaceState()

WebSocket

executeSql()

postMessage()

``

``

The innerHTML sink doesn't accept script elements on any modern browser, nor will svg onload events fire. This means you will need to use alternative elements like img or iframe.

This kind of XSS is probably the hardest to find, as you need to look inside the JS code, see if it's using any object whose value you control, and in that case, see if there is any way to abuse it to execute arbitrary JS.

Tools to find them

Examples

Open Redirect

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

Luki na otwarty przekierowanie w DOM występują, gdy skrypt zapisuje dane, którymi może sterować atakujący, do zlewu zdolnego do inicjowania nawigacji między domenami.

Ważne jest, aby zrozumieć, że wykonanie dowolnego kodu, takiego jak javascript:alert(1), jest możliwe, jeśli masz kontrolę nad początkiem URL, w którym występuje przekierowanie.

Sinks:

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

Manipulacja ciasteczkami

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

Luki w manipulacji ciasteczkami oparte na DOM występują, gdy skrypt włącza dane, które mogą być kontrolowane przez atakującego, do wartości ciasteczka. Ta luka może prowadzić do nieoczekiwanego zachowania strony internetowej, jeśli ciasteczko jest wykorzystywane w obrębie witryny. Dodatkowo, może być wykorzystana do przeprowadzenia ataku na utrzymanie sesji, jeśli ciasteczko jest zaangażowane w śledzenie sesji użytkownika. Głównym miejscem docelowym związanym z tą luką jest:

Sinks:

document.cookie

Wstrzykiwanie JavaScript

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

Luki w zabezpieczeniach związane z wstrzykiwaniem JavaScript w oparciu o DOM powstają, gdy skrypt wykonuje dane, które mogą być kontrolowane przez atakującego, jako kod JavaScript.

Sinks:

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

Manipulacja dokumentem-domeną

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

Wrażliwości na manipulację dokumentem-domeną występują, gdy skrypt ustawia właściwość document.domain przy użyciu danych, którymi może kontrolować atakujący.

Właściwość document.domain odgrywa kluczową rolę w egzekwowaniu polityki tego samego pochodzenia przez przeglądarki. Gdy dwie strony z różnych pochodzeń ustawiają swoją document.domain na tę samą wartość, mogą wchodzić w interakcje bez ograniczeń. Chociaż przeglądarki nakładają pewne ograniczenia na wartości przypisywane do document.domain, zapobiegając przypisaniu całkowicie niepowiązanych wartości do rzeczywistego pochodzenia strony, istnieją wyjątki. Zazwyczaj przeglądarki zezwalają na użycie domen dzieci lub rodziców.

Sinks:

document.domain

WebSocket-URL poisoning

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

WebSocket-URL poisoning występuje, gdy skrypt wykorzystuje kontrolowane dane jako docelowy URL dla połączenia WebSocket.

Sinks:

Konstruktor WebSocket może prowadzić do podatności na WebSocket-URL poisoning.

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

Podatności na manipulację linkami w DOM powstają, gdy skrypt zapisuje dane kontrolowane przez atakującego do celu nawigacji w bieżącej stronie, takie jak klikalny link lub URL przesyłania formularza.

Sinks:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulacja żądaniami Ajax

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

Luki w manipulacji żądaniami Ajax powstają, gdy skrypt zapisuje dane kontrolowane przez atakującego w żądaniu Ajax, które jest wydawane za pomocą obiektu XmlHttpRequest.

Sinks:

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

Manipulacja lokalną ścieżką pliku

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

Luki w manipulacji lokalną ścieżką pliku powstają, gdy skrypt przekazuje dane kontrolowane przez atakującego do API obsługi plików jako parametr filename. Ta luka może być wykorzystana przez atakującego do skonstruowania URL, który, jeśli zostanie odwiedzony przez innego użytkownika, może prowadzić do otwarcia lub zapisania dowolnego lokalnego pliku w przeglądarce użytkownika.

Sinks:

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

Client-Side SQl injection

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

Wrażliwości na SQL-injection po stronie klienta występują, gdy skrypt włącza dane kontrolowane przez atakującego do zapytania SQL po stronie klienta w niebezpieczny sposób.

Sinks:

executeSql()

Manipulacja pamięcią HTML5

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

Wrażliwości na manipulację pamięcią HTML5 pojawiają się, gdy skrypt przechowuje dane kontrolowane przez atakującego w pamięci HTML5 przeglądarki internetowej (localStorage lub sessionStorage). Chociaż ta akcja nie jest z natury luką w zabezpieczeniach, staje się problematyczna, jeśli aplikacja następnie odczytuje przechowywane dane i przetwarza je w sposób niebezpieczny. Może to pozwolić atakującemu na wykorzystanie mechanizmu pamięci do przeprowadzenia innych ataków opartych na DOM, takich jak cross-site scripting i wstrzykiwanie JavaScript.

Sinks:

sessionStorage.setItem()
localStorage.setItem()

XPath injection

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

Wrażliwości na wstrzykiwanie XPath oparte na DOM występują, gdy skrypt włącza dane kontrolowane przez atakującego do zapytania XPath.

Sinks:

document.evaluate()
someDOMElement.evaluate()

Wstrzykiwanie JSON po stronie klienta

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

Luki w wstrzykiwaniu JSON opartym na DOM występują, gdy skrypt włącza dane kontrolowane przez atakującego do ciągu, który jest analizowany jako struktura danych JSON, a następnie przetwarzany przez aplikację.

Sinks:

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

Manipulacja wiadomościami w sieci

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

Luki w wiadomościach sieciowych powstają, gdy skrypt wysyła dane kontrolowane przez atakującego jako wiadomość sieciową do innego dokumentu w przeglądarce. Przykład podatnej manipulacji wiadomościami sieciowymi można znaleźć w Akademii Bezpieczeństwa Sieci PortSwigger.

Sinks:

Metoda postMessage() do wysyłania wiadomości sieciowych może prowadzić do luk, jeśli nasłuchujący zdarzenia do odbierania wiadomości obsługuje przychodzące dane w niebezpieczny sposób.

Manipulacja danymi DOM

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

Luki w manipulacji danymi DOM powstają, gdy skrypt zapisuje dane kontrolowane przez atakującego do pola w DOM wykorzystywanego w widocznym interfejsie użytkownika lub logice po stronie klienta. Ta luka może być wykorzystana przez atakującego do skonstruowania URL, który, jeśli zostanie odwiedzony przez innego użytkownika, może zmienić wygląd lub zachowanie interfejsu użytkownika po stronie klienta.

Sinks:

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

Denial of Service

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

Luki typu denial-of-service oparte na DOM występują, gdy skrypt przekazuje dane kontrolowane przez atakującego w sposób niebezpieczny do problematycznego API platformy. Obejmuje to API, które, gdy są wywoływane, mogą spowodować, że komputer użytkownika zużyje nadmierne ilości CPU lub miejsca na dysku. Takie luki mogą mieć znaczące skutki uboczne, takie jak ograniczenie funkcjonalności strony przez przeglądarkę poprzez odrzucenie prób przechowywania danych w localStorage lub zakończenie zajętych skryptów.

Sinks:

requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering
Wsparcie dla HackTricks

Last updated