DOM XSS

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Podatności DOM

Podatności 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 ujść. Ujścia to funkcje lub obiekty (np. eval(), document.body.innerHTML), które mogą wykonywać lub renderować szkodliwe treści, jeśli otrzymają złośliwe dane.

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

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

Ryzyko pojawia się, gdy dane przepływają z źródła do ujścia bez odpowiedniej walidacji lub oczyszczania, umożliwiając ataki typu XSS.

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

Wspólne źródła:

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

Wspólne źródła:

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

**[**`Odmowa usługi`**](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()

``

``

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

Ten rodzaj XSS jest prawdopodobnie najtrudniejszy do znalezienia, ponieważ musisz przejrzeć kod JS, sprawdzić, czy używa jakiegoś obiektu, którego wartość kontrolujesz, a w takim przypadku sprawdzić, czy istnieje jakiś sposób na wykorzystanie go do wykonania dowolnego kodu JS.

Narzędzia do ich znalezienia

Przykłady

Przekierowanie otwarte

Źródło: https://portswigger.net/web-security/dom-based/open-redirection

Podatności na otwarte przekierowanie w DOM występują, gdy skrypt zapisuje dane, które atakujący może kontrolować, do zlewu zdolnego do inicjowania nawigacji między domenami.

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

Zlewy:

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

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

Podatności związane z manipulacją plików cookie w oparciu o DOM występują, gdy skrypt włącza dane, które mogą być kontrolowane przez atakującego, do wartości pliku cookie. Ta podatność może prowadzić do nieoczekiwanego zachowania strony internetowej, jeśli plik cookie jest wykorzystywany w obrębie witryny. Ponadto, może być wykorzystana do przeprowadzenia ataku na ustalanie sesji, jeśli plik cookie jest wykorzystywany do śledzenia sesji użytkownika. Głównym miejscem, związanym z tą podatnością, jest:

Miejsca podatne (Sinks):

document.cookie

Wstrzykiwanie JavaScriptu

Źródło: https://portswigger.net/web-security/dom-based/javascript-injection

Podatności na wstrzykiwanie JavaScriptu oparte na DOM (ang. DOM-based JavaScript injection) powstają, gdy skrypt uruchamia 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 document-domain

Źródło: https://portswigger.net/web-security/dom-based/document-domain-manipulation

Podatności związane z manipulacją document.domain występują, gdy skrypt ustawia właściwość document.domain przy użyciu danych, które atakujący może kontrolować.

Właściwość document.domain odgrywa kluczową rolę w egzekwowaniu polityki same-origin przez przeglądarki. Gdy dwie strony pochodzące z różnych źródeł ustawiają swoje document.domain na taką samą wartość, mogą one współdziałać bez ograniczeń. Chociaż przeglądarki narzucają pewne ograniczenia na wartości przypisywane do document.domain, uniemożliwiając przypisanie całkowicie niepowiązanych wartości do rzeczywistego pochodzenia strony, istnieją wyjątki. Zazwyczaj przeglądarki pozwalają na użycie dziecięcych lub nadrzędnych domen.

Sinks:

document.domain

Zatrucie adresu URL WebSocket

Źródło: https://portswigger.net/web-security/dom-based/websocket-url-poisoning

Zatrucie adresu URL WebSocket występuje, gdy skrypt wykorzystuje dane kontrolowalne jako docelowy adres URL dla połączenia WebSocket.

Sinks:

Konstruktor WebSocket może prowadzić do podatności na zatrucie adresu URL WebSocket.

Manipulacja linkiem

Źródło: https://portswigger.net/web-security/dom-based/link-manipulation

Podatności na manipulację linkiem w oparciu o DOM pojawiają się, gdy skrypt zapisuje dane kontrolowane przez atakującego jako cel nawigacji w bieżącej stronie, takie jak klikalny link lub adres URL przesyłania formularza.

Sinks:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Manipulacja żądaniem Ajax

Źródło: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation

Podatności na manipulację żądaniem Ajax pojawiają się, gdy skrypt zapisuje dane kontrolowane przez atakującego do żądania Ajax, które jest wysyłane za pomocą obiektu XmlHttpRequest.

Sinks:

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

Manipulacja lokalną ścieżką pliku

Źródło: https://portswigger.net/web-security/dom-based/local-file-path-manipulation

Podatności na manipulację lokalną ścieżką pliku pojawiają się, gdy skrypt przekazuje dane kontrolowane przez atakującego do interfejsu API obsługującego pliki jako parametr filename. Ta podatność może zostać wykorzystana przez atakującego do skonstruowania adresu URL, który, jeśli odwiedzi go inny użytkownik, może spowodować, że przeglądarka użytkownika otworzy lub zapisze dowolny lokalny plik.

Sinks:

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

Wstrzykiwanie SQL po stronie klienta

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

Wstrzykiwanie SQL po stronie klienta występuje, gdy skrypt w niebezpieczny sposób włącza dane kontrolowane przez atakującego do zapytania SQL po stronie klienta.

Sinks:

executeSql()

Manipulacja HTML5-storage

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

Podatności związane z manipulacją HTML5-storage pojawiają się, gdy skrypt przechowuje dane kontrolowane przez atakującego w pamięci HTML5 przeglądarki (localStorage lub sessionStorage). Choć samo przechowywanie danych nie jest bezpośrednio podatnością bezpieczeństwa, staje się problematyczne, jeśli aplikacja następnie odczytuje przechowywane dane i przetwarza je w sposób niebezpieczny. Może to umożliwić atakującemu wykorzystanie mechanizmu przechowywania do przeprowadzenia innych ataków opartych na DOM, takich jak cross-site scripting i wstrzykiwanie JavaScriptu.

Ujścia:

sessionStorage.setItem()
localStorage.setItem()

Wstrzyknięcie XPath

Źródło: https://portswigger.net/web-security/dom-based/client-side-xpath-injection

Podatności na wstrzyknięcie XPath w oparciu o DOM występują, gdy skrypt zawiera dane kontrolowane przez atakującego w zapytaniu XPath.

Sinks:

document.evaluate()
someDOMElement.evaluate()

Wstrzykiwanie JSON po stronie klienta

Źródło: https://portswigger.net/web-security/dom-based/client-side-json-injection

Podatności na wstrzykiwanie JSON po stronie DOM występują, gdy skrypt zawiera dane kontrolowane przez atakującego w ciągu znaków, które są parsowane jako struktura danych JSON, a następnie przetwarzane przez aplikację.

Sinks:

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

Manipulacja wiadomościami internetowymi

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

Podatności związane z wiadomościami internetowymi pojawiają się, gdy skrypt wysyła dane kontrolowane przez atakującego jako wiadomość internetową do innego dokumentu w przeglądarce. Przykład podatności związanej z manipulacją wiadomościami internetowymi można znaleźć w Akademii Bezpieczeństwa Sieciowego PortSwigger.

Miejsca podatne:

Metoda postMessage() do wysyłania wiadomości internetowych może prowadzić do podatności, jeśli nasłuchiwacz zdarzeń do odbierania wiadomości obsługuje przychodzące dane w sposób niebezpieczny.

Manipulacja danymi DOM

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

Podatności związane z manipulacją danymi DOM pojawiają się, gdy skrypt zapisuje dane kontrolowane przez atakującego w polu wewnątrz DOM, które jest wykorzystywane w widocznym interfejsie użytkownika lub logice po stronie klienta. Atakujący może wykorzystać tę podatność, aby skonstruować adres URL, który, jeśli odwiedzony przez innego użytkownika, może zmienić wygląd lub zachowanie interfejsu po stronie klienta.

Miejsca podatne:

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

Usługa niedostępna

Źródło: https://portswigger.net/web-security/dom-based/denial-of-service

Podatności na usługę niedostępną oparte na DOM występują, gdy skrypt przekazuje dane kontrolowane przez atakującego w sposób niebezpieczny do problematycznego interfejsu API. Dotyczy to interfejsów API, które, gdy są wywoływane, mogą spowodować, że komputer użytkownika zużyje nadmierną ilość zasobów procesora lub miejsca na dysku. Takie podatności mogą mieć poważne skutki uboczne, takie jak ograniczenie funkcjonalności strony internetowej przez przeglądarkę poprzez odrzucanie prób przechowywania danych w localStorage lub zatrzymywanie zajętych skryptów.

Odbiorniki:

requestFileSystem()
RegExp()

Dom Clobbering

pageDom Clobbering
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Last updated