24 KiB
DOM XSS
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
- Pracujesz w firmie zajmującej się cyberbezpieczeństwem? Chcesz zobaczyć swoją firmę reklamowaną w HackTricks? A może chcesz mieć dostęp do najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF? Sprawdź PLAN SUBSKRYPCJI!
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź mnie na Twitterze 🐦@carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR do repozytorium hacktricks i repozytorium hacktricks-cloud.
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.
{% hint style="info" %} Możesz znaleźć bardziej aktualną listę źródeł i ujść na stronie https://github.com/wisec/domxsswiki/wiki {% endhint %}
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:
Przekierowanie otwarte | Wstrzykiwanie JavaScript | Manipulacja danymi DOM | 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 |
``Manipulacja lokalną ścieżką pliku | 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() |
``Manipulacja żądaniem Ajax | FileReader.readAsFile() |
someDOMElement.backgroundImage |
constructor() |
XMLHttpRequest.setRequestHeader() |
FileReader.root.getFile() |
someDOMElement.cssText |
init() |
XMLHttpRequest.open() |
FileReader.root.getFile() |
someDOMElement.codebase |
index() |
XMLHttpRequest.send() |
Manipulacja linkiem | someDOMElement.innerHTML |
jQuery.parseHTML() |
jQuery.globalEval() |
someDOMElement.href |
someDOMElement.outerHTML |
$.parseHTML() |
$.globalEval() |
someDOMElement.src |
someDOMElement.insertAdjacentHTML |
Wstrzykiwanie JSON po stronie klienta |
``Manipulacja magazynem HTML5 | someDOMElement.action |
someDOMElement.onevent |
JSON.parse() |
sessionStorage.setItem() |
Wstrzykiwanie XPath | document.write() |
jQuery.parseJSON() |
localStorage.setItem() |
document.evaluate() |
document.writeln() |
$.parseJSON() |
**[**`Odmowa usługi`**](dom-xss.md#denial-of-service)** |
someDOMElement.evaluate() |
document.title |
``Manipulacja ciasteczkiem |
requestFileSystem() |
``Manipulacja domeną dokumentu | document.implementation.createHTMLDocument() |
document.cookie |
RegExp() |
document.domain |
history.pushState() |
Zatrucie adresu URL WebSocket |
Wstrzykiwanie SQL po stronie klienta | Manipulacja wiadomością sieciową | 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()
Manipulacja plikami cookie
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
{% content-ref url="dom-clobbering.md" %} dom-clobbering.md {% endcontent-ref %}
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
- Pracujesz w firmie zajmującej się cyberbezpieczeństwem? Chcesz zobaczyć, jak Twoja firma jest reklamowana w HackTricks? A może chcesz mieć dostęp do najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF? Sprawdź PLAN SUBSKRYPCYJNY!
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź mnie na Twitterze 🐦@carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do repozytorium hacktricks i hacktricks-cloud.