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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
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:
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 Redirect | Javascript Injection | DOM-data manipulation | 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 | ``Local file-path manipulation | 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() |
``Ajax request manipulation | FileReader.readAsFile() | someDOMElement.backgroundImage | constructor() |
XMLHttpRequest.setRequestHeader() | FileReader.root.getFile() | someDOMElement.cssText | init() |
XMLHttpRequest.open() | FileReader.root.getFile() | someDOMElement.codebase | index() |
XMLHttpRequest.send() | Link manipulation | someDOMElement.innerHTML | jQuery.parseHTML() |
jQuery.globalEval() | someDOMElement.href | someDOMElement.outerHTML | $.parseHTML() |
$.globalEval() | someDOMElement.src | someDOMElement.insertAdjacentHTML | Client-side JSON injection |
``HTML5-storage manipulation | someDOMElement.action | someDOMElement.onevent | JSON.parse() |
sessionStorage.setItem() | XPath injection | document.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 manipulation | document.implementation.createHTMLDocument() | document.cookie |
RegExp() | document.domain | history.pushState() | WebSocket-URL poisoning |
Client-Side SQl injection | Web-message manipulation | history.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
- https://github.com/mozilla/eslint-plugin-no-unsanitized
- Rozszerzenie przeglądarki do sprawdzania wszystkich danych, które docierają do potencjalnego zbiornika: https://github.com/kevin-mizu/domloggerpp
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:
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:
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:
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:
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.
Link manipulation
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:
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:
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:
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:
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:
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:
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 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:
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
{{#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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.