DOM XSS

Reading time: 10 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

Luki DOM

Luki 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.

note

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

Typowe źródła:

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

Common Sinks:

Open RedirectJavascript InjectionDOM-data manipulationjQuery
locationeval()scriptElement.srcadd()
location.hostFunction() constructorscriptElement.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``Local file-path manipulationsomeDOMElement.valuereplaceWith()
XMLHttpRequest.open()FileReader.readAsArrayBuffer()someDOMElement.namewrap()
XMLHttpRequest.send()FileReader.readAsBinaryString()someDOMElement.targetwrapInner()
jQuery.ajax()FileReader.readAsDataURL()someDOMElement.methodwrapAll()
$.ajax()FileReader.readAsText()someDOMElement.typehas()
``Ajax request manipulationFileReader.readAsFile()someDOMElement.backgroundImageconstructor()
XMLHttpRequest.setRequestHeader()FileReader.root.getFile()someDOMElement.cssTextinit()
XMLHttpRequest.open()FileReader.root.getFile()someDOMElement.codebaseindex()
XMLHttpRequest.send()Link manipulationsomeDOMElement.innerHTMLjQuery.parseHTML()
jQuery.globalEval()someDOMElement.hrefsomeDOMElement.outerHTML$.parseHTML()
$.globalEval()someDOMElement.srcsomeDOMElement.insertAdjacentHTMLClient-side JSON injection
``HTML5-storage manipulationsomeDOMElement.actionsomeDOMElement.oneventJSON.parse()
sessionStorage.setItem()XPath injectiondocument.write()jQuery.parseJSON()
localStorage.setItem()document.evaluate()document.writeln()$.parseJSON()
**[**`Denial of Service`**](dom-xss.md#denial-of-service)**someDOMElement.evaluate()document.title``Cookie manipulation
requestFileSystem()``Document-domain manipulationdocument.implementation.createHTMLDocument()document.cookie
RegExp()document.domainhistory.pushState()WebSocket-URL poisoning
Client-Side SQl injectionWeb-message manipulationhistory.replaceState()WebSocket
executeSql()postMessage()````

Zbiornik innerHTML nie akceptuje elementów script w żadnej nowoczesnej przeglądarce, ani zdarzenia svg onload nie będą się uruchamiać. Oznacza to, że będziesz musiał użyć alternatywnych elementów, takich jak img lub iframe.

Tego rodzaju XSS jest prawdopodobnie najtrudniejszy do znalezienia, ponieważ musisz zajrzeć do kodu JS, sprawdzić, czy używa jakiegoś obiektu, którego wartość kontrolujesz, a w takim przypadku sprawdzić, czy istnieje jakikolwiek sposób na nadużycie go w celu wykonania dowolnego JS.

Tools to find them

Examples

Open Redirect

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

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

Kluczowe jest zrozumienie, że wykonanie dowolnego kodu, takiego jak javascript:alert(1), jest możliwe, jeśli masz kontrolę nad początkiem URL, w którym następuje przekierowanie.

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

Manipulacja ciasteczkami

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

Miejsca docelowe:

javascript
document.cookie

Wstrzykiwanie JavaScript

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

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

Sinks:

javascript
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

Luki w manipulacji 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ą swoje 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 podrzędnych lub domen nadrzędnych.

Sinks:

javascript
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 oparte na 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:

javascript
someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulacja żądaniami Ajax

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

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

Manipulacja lokalnymi ścieżkami plików

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

Luki w manipulacji lokalnymi ścieżkami plików 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:

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

Wstrzykiwanie SQL po stronie klienta

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

Luki w wstrzykiwaniu SQL 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:

javascript
executeSql()

Manipulacja pamięcią HTML5

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

Luki w manipulacji pamięcią HTML5 powstają, 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ą bezpieczeństwa, 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:

javascript
sessionStorage.setItem()
localStorage.setItem()

XPath injection

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

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

Sinks:

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

javascript
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 pojawiają się, 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 Web Security Academy 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 pojawiają się, 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:

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

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:

javascript
requestFileSystem()
RegExp()

Dom Clobbering

{{#ref}} dom-clobbering.md {{#endref}}

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks