DOM XSS
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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:
Common Sinks:
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.
Browser extension to check every data taht reaches a potential sink: https://github.com/kevin-mizu/domloggerpp
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.
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:
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:
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
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()
``
``