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)
DOM вразливості виникають, коли дані з джерел, контрольованих зловмисником (як-от location.search
, document.referrer
або document.cookie
), небезпечно передаються до синків. Синки — це функції або об'єкти (наприклад, eval()
, document.body.innerHTML
), які можуть виконувати або відображати шкідливий контент, якщо отримують зловмисні дані.
Джерела — це вхідні дані, які можуть бути маніпульовані зловмисниками, включаючи URL-адреси, куки та веб-повідомлення.
Синки — це потенційно небезпечні кінцеві точки, де зловмисні дані можуть призвести до негативних наслідків, таких як виконання скриптів.
Ризик виникає, коли дані передаються з джерела до синка без належної валідації або очищення, що дозволяє атакам, таким як XSS.
You can find a more updated list of sources and sinks in https://github.com/wisec/domxsswiki/wiki
Звичайні джерела:
Загальні місця витоку:
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()
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()
XMLHttpRequest.setRequestHeader()
FileReader.root.getFile()
someDOMElement.cssText
init()
XMLHttpRequest.open()
FileReader.root.getFile()
someDOMElement.codebase
index()
jQuery.globalEval()
someDOMElement.href
someDOMElement.outerHTML
$.parseHTML()
$.globalEval()
someDOMElement.src
someDOMElement.insertAdjacentHTML
localStorage.setItem()
document.evaluate()
document.writeln()
$.parseJSON()
**[**`Відмова в обслуговуванні`**](dom-xss.md#denial-of-service)**
someDOMElement.evaluate()
document.title
requestFileSystem()
document.implementation.createHTMLDocument()
document.cookie
executeSql()
postMessage()
``
``
Місце витоку innerHTML
не приймає script
елементи в жодному сучасному браузері, і події svg onload
не спрацюють. Це означає, що вам потрібно використовувати альтернативні елементи, такі як img
або iframe
.
Цей вид XSS, ймовірно, є найскладнішим для виявлення, оскільки вам потрібно заглянути в код JS, перевірити, чи використовується будь-який об'єкт, значення якого ви контролюєте, і в такому випадку перевірити, чи є будь-який спосіб зловживання ним для виконання довільного JS.
Розширення браузера для перевірки всіх даних, які досягають потенційного місця витоку: https://github.com/kevin-mizu/domloggerpp
З: https://portswigger.net/web-security/dom-based/open-redirection
Вразливості відкритого редиректу в DOM виникають, коли скрипт записує дані, які може контролювати зловмисник, у місце витоку, здатне ініціювати навігацію між доменами.
Важливо розуміти, що виконання довільного коду, такого як javascript:alert(1)
, можливе, якщо ви контролюєте початок URL, де відбувається редирект.
Місця витоку:
З: https://portswigger.net/web-security/dom-based/cookie-manipulation
Вразливості, пов'язані з маніпуляцією з куками на основі DOM, виникають, коли скрипт включає дані, які можуть контролюватися зловмисником, у значення куки. Ця вразливість може призвести до несподіваної поведінки веб-сторінки, якщо кука використовується на сайті. Крім того, її можна експлуатувати для проведення атаки фіксації сесії, якщо кука залучена до відстеження сесій користувачів. Основний "синк", пов'язаний з цією вразливістю, це:
Синки:
From: https://portswigger.net/web-security/dom-based/javascript-injection
Вразливості DOM-ін'єкції JavaScript виникають, коли скрипт виконує дані, які можуть контролюватися зловмисником, як код JavaScript.
Sinks:
From: https://portswigger.net/web-security/dom-based/document-domain-manipulation
Вразливості маніпуляції з документом-доменом виникають, коли скрипт встановлює властивість document.domain
, використовуючи дані, якими може керувати зловмисник.
Властивість document.domain
відіграє ключову роль у забезпеченні політики однакового походження браузерами. Коли дві сторінки з різних походжень встановлюють свій document.domain
на однакове значення, вони можуть взаємодіяти без обмежень. Хоча браузери накладають певні обмеження на значення, які можна призначити document.domain
, заважаючи призначенню абсолютно несумісних значень фактичному походженню сторінки, існують винятки. Зазвичай браузери дозволяють використання дочірніх або батьківських доменів.
Sinks:
From: https://portswigger.net/web-security/dom-based/websocket-url-poisoning
WebSocket-URL poisoning відбувається, коли скрипт використовує керовані дані як цільовий URL для з'єднання WebSocket.
Sinks:
Конструктор WebSocket
може призвести до вразливостей WebSocket-URL poisoning.
From: https://portswigger.net/web-security/dom-based/link-manipulation
Вразливості маніпуляції посиланнями на основі DOM виникають, коли скрипт записує дані, що контролюються атакуючим, до цільового навігаційного елемента на поточній сторінці, такого як клікабельне посилання або URL для відправки форми.
Sinks:
З: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation
Вразливості маніпуляції запитом Ajax виникають, коли скрипт записує дані, контрольовані зловмисником, у запит Ajax, який надсилається за допомогою об'єкта XmlHttpRequest
.
Синьки:
From: https://portswigger.net/web-security/dom-based/local-file-path-manipulation
Вразливості локальної маніпуляції з шляхами до файлів виникають, коли скрипт передає дані, контрольовані атакуючим, до API обробки файлів як параметр filename
. Цю вразливість може використати атакуючий для створення URL, який, якщо його відвідає інший користувач, може призвести до відкриття або запису довільного локального файлу в браузері користувача.
Sinks:
From: https://portswigger.net/web-security/dom-based/client-side-sql-injection
Вразливості SQL-ін'єкцій на стороні клієнта виникають, коли скрипт включає дані, контрольовані зловмисником, у SQL-запит на стороні клієнта ненадійним способом.
Sinks:
From: https://portswigger.net/web-security/dom-based/html5-storage-manipulation
Вразливості маніпуляції з HTML5-сховищем виникають, коли скрипт зберігає дані, контрольовані атакуючим, у HTML5-сховищі веб-браузера (localStorage
або sessionStorage
). Хоча ця дія не є вродженою вразливістю безпеки, вона стає проблематичною, якщо програма потім читає збережені дані та обробляє їх ненадійно. Це може дозволити атакуючому використовувати механізм зберігання для проведення інших атак на основі DOM, таких як міжсайтове скриптування та ін'єкція JavaScript.
Sinks:
From: https://portswigger.net/web-security/dom-based/client-side-xpath-injection
Вразливості DOM-орієнтованої XPath-ін'єкції виникають, коли скрипт включає дані, контрольовані атакуючим, у запит XPath.
Sinks:
З: https://portswigger.net/web-security/dom-based/client-side-json-injection
Вразливості, пов'язані з впровадженням JSON на основі DOM, виникають, коли скрипт включає дані, контрольовані зловмисником, у рядок, який розбирається як структура даних JSON, а потім обробляється додатком.
Sinks:
From: https://portswigger.net/web-security/dom-based/web-message-manipulation
Вразливості веб-повідомлень виникають, коли скрипт надсилає дані, контрольовані зловмисником, як веб-повідомлення до іншого документа в браузері. Приклад вразливої веб-маніпуляції повідомленнями можна знайти в Web Security Academy PortSwigger.
Sinks:
Метод postMessage()
для надсилання веб-повідомлень може призвести до вразливостей, якщо обробник подій для отримання повідомлень обробляє вхідні дані ненадійним способом.
From: https://portswigger.net/web-security/dom-based/dom-data-manipulation
Вразливості маніпуляції даними DOM виникають, коли скрипт записує дані, контрольовані зловмисником, у поле в DOM, яке використовується в видимому інтерфейсі або логіці на стороні клієнта. Цю вразливість може експлуатувати зловмисник, щоб створити URL, який, якщо його відвідає інший користувач, може змінити вигляд або поведінку інтерфейсу на стороні клієнта.
Sinks:
From: https://portswigger.net/web-security/dom-based/denial-of-service
Уразливості відмови в обслуговуванні на основі DOM виникають, коли скрипт передає дані, контрольовані зловмисником, небезпечно до проблемного API платформи. Це включає API, які, коли їх викликають, можуть призвести до того, що комп'ютер користувача споживає надмірну кількість процесорного часу або дискового простору. Такі уразливості можуть мати значні побічні ефекти, такі як обмеження функціональності веб-сайту браузером шляхом відхилення спроб зберегти дані в localStorage
або завершення зайнятих скриптів.
Sinks:
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)