DOM XSS

Support HackTricks

DOM Вразливості

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

Звичайні джерела:

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

Загальні місця витоку:

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

**[**`Відмова в обслуговуванні`**](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()

``

``

Синк innerHTML не приймає script елементи в жодному сучасному браузері, і події svg onload не спрацюють. Це означає, що вам потрібно використовувати альтернативні елементи, такі як img або iframe.

Цей вид XSS, ймовірно, є найскладнішим для виявлення, оскільки вам потрібно заглянути в код JS, перевірити, чи використовується будь-який об'єкт, значення якого ви контролюєте, і в такому випадку перевірити, чи є будь-який спосіб зловживання ним для виконання довільного JS.

Інструменти для їх виявлення

Приклади

Відкритий редирект

З: https://portswigger.net/web-security/dom-based/open-redirection

Вразливості відкритого редиректу в DOM виникають, коли скрипт записує дані, які може контролювати зловмисник, у місце витоку, здатне ініціювати навігацію між доменами.

Важливо розуміти, що виконання довільного коду, такого як javascript:alert(1), можливе, якщо ви контролюєте початок URL, де відбувається редирект.

Місця витоку:

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

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

Уразливості, пов'язані з маніпуляцією cookie на основі DOM, виникають, коли скрипт включає дані, які можуть контролюватися зловмисником, у значення cookie. Ця уразливість може призвести до несподіваної поведінки веб-сторінки, якщо cookie використовується на сайті. Крім того, її можна експлуатувати для здійснення атаки фіксації сесії, якщо cookie залучено до відстеження сесій користувачів. Основний sink, пов'язаний з цією уразливістю, це:

Sinks:

document.cookie

JavaScript Injection

From: https://portswigger.net/web-security/dom-based/javascript-injection

Вразливості DOM-орієнтованої ін'єкції JavaScript виникають, коли скрипт виконує дані, які можуть контролюватися зловмисником, як код JavaScript.

Sinks:

eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()

Document-domain manipulation

From: https://portswigger.net/web-security/dom-based/document-domain-manipulation

Вразливості маніпуляції з документом-доменом виникають, коли скрипт встановлює властивість document.domain, використовуючи дані, якими може керувати зловмисник.

Властивість document.domain відіграє ключову роль у забезпеченні політики однакового походження браузерами. Коли дві сторінки з різних походжень встановлюють свій document.domain на однакове значення, вони можуть взаємодіяти без обмежень. Хоча браузери накладають певні обмеження на значення, які можна присвоювати document.domain, заважаючи присвоєнню абсолютно несумісних значень фактичному походженню сторінки, існують винятки. Зазвичай браузери дозволяють використання дочірніх або батьківських доменів.

Sinks:

document.domain

WebSocket-URL poisoning

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:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Маніпуляція запитами Ajax

З: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation

Вразливості маніпуляції запитами Ajax виникають, коли скрипт записує дані, контрольовані зловмисником, у запит Ajax, який надсилається за допомогою об'єкта XmlHttpRequest.

Синки:

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

Локальна маніпуляція шляхом до файлу

From: https://portswigger.net/web-security/dom-based/local-file-path-manipulation

Вразливості локальної маніпуляції шляхом до файлу виникають, коли скрипт передає дані, контрольовані атакуючим, до API обробки файлів як параметр filename. Цю вразливість може використати атакуючий для створення URL, який, якщо його відвідає інший користувач, може призвести до відкриття або запису довільного локального файлу в браузері користувача.

Sinks:

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

Client-Side SQl injection

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

Вразливості SQL-ін'єкцій на стороні клієнта виникають, коли скрипт включає дані, контрольовані зловмисником, у SQL-запит на стороні клієнта ненадійним способом.

Sinks:

executeSql()

HTML5-storage manipulation

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

Вразливості маніпуляції з HTML5-сховищем виникають, коли скрипт зберігає дані, контрольовані атакуючим, у HTML5-сховищі веб-браузера (localStorage або sessionStorage). Хоча ця дія не є вразливістю безпеки сама по собі, вона стає проблематичною, якщо програма потім читає збережені дані та обробляє їх ненадійно. Це може дозволити атакуючому використовувати механізм зберігання для проведення інших атак на основі DOM, таких як міжсайтове скриптування та ін'єкція JavaScript.

Sinks:

sessionStorage.setItem()
localStorage.setItem()

XPath injection

From: https://portswigger.net/web-security/dom-based/client-side-xpath-injection

Вразливості DOM-орієнтованої XPath-ін'єкції виникають, коли скрипт включає дані, контрольовані зловмисником, у запит XPath.

Sinks:

document.evaluate()
someDOMElement.evaluate()

Client-side JSON injection

From: https://portswigger.net/web-security/dom-based/client-side-json-injection

Вразливості DOM-ін'єкції JSON виникають, коли скрипт включає дані, контрольовані зловмисником, у рядок, який розбирається як структура даних JSON, а потім обробляється додатком.

Sinks:

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

Web-message manipulation

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

Вразливості веб-повідомлень виникають, коли скрипт надсилає дані, контрольовані зловмисником, як веб-повідомлення до іншого документа в браузері. Приклад вразливої маніпуляції з веб-повідомленнями можна знайти в Web Security Academy PortSwigger.

Sinks:

Метод postMessage() для надсилання веб-повідомлень може призвести до вразливостей, якщо обробник подій для отримання повідомлень обробляє вхідні дані ненадійним способом.

DOM-data manipulation

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

Вразливості маніпуляції з даними DOM виникають, коли скрипт записує дані, контрольовані зловмисником, у поле в DOM, яке використовується в видимому інтерфейсі або логіці на стороні клієнта. Цю вразливість може експлуатувати зловмисник, щоб створити URL, який, якщо його відвідає інший користувач, може змінити вигляд або поведінку інтерфейсу на стороні клієнта.

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

Уразливості відмови в обслуговуванні на основі DOM виникають, коли скрипт передає дані, контрольовані зловмисником, небезпечно до проблемного API платформи. Це включає API, які, коли їх викликають, можуть призвести до споживання надмірної кількості процесорного часу або дискового простору комп'ютером користувача. Такі уразливості можуть мати значні побічні ефекти, такі як обмеження функціональності веб-сайту браузером шляхом відхилення спроб зберегти дані в localStorage або завершення зайнятих скриптів.

Sinks:

requestFileSystem()
RegExp()

Dom Clobbering

Dom Clobbering
Підтримайте HackTricks

Last updated