DOM XSS

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

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

Вразливості DOM виникають, коли дані з джерел, під контролем атакувальника (наприклад, location.search, document.referrer або document.cookie), небезпечно передаються до стоків. Стоки - це функції або об'єкти (наприклад, eval(), document.body.innerHTML), які можуть виконувати або відображати шкідливий вміст, якщо їм надають зловмисні дані.

  • Джерела - це вхідні дані, які можуть бути маніпульовані зловмисниками, включаючи URL-адреси, cookies та веб-повідомлення.

  • Стоки - це потенційно небезпечні кінцеві точки, де зловмисні дані можуть призвести до негативних наслідків, таких як виконання скриптів.

Ризик виникає, коли дані переходять від джерела до стоку без належної перевірки або санітарії, що дозволяє атаки, такі як XSS.

Ви можете знайти більш оновлений список джерел та стоків за посиланням 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()

Маніпулювання кукі

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

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

document.cookie

Впровадження JavaScript

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

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

Sinks:

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

Маніпулювання документ-доменом

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

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

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

Витоки:

document.domain

Отруєння URL WebSocket

З: https://portswigger.net/web-security/dom-based/websocket-url-poisoning

Отруєння URL WebSocket відбувається, коли скрипт використовує керовані дані як цільовий URL для підключення WebSocket.

Витоки:

Конструктор WebSocket може призвести до вразливостей отруєння URL WebSocket.

Маніпулювання посиланнями

З: https://portswigger.net/web-security/dom-based/link-manipulation

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

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

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

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

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

Витоки:

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

Клієнтський SQL-ін'єкція

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

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

Sinks:

executeSql()

Маніпулювання зберіганням HTML5

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

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

Витоки:

sessionStorage.setItem()
localStorage.setItem()

Внедрення XPath

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

Уразливості DOM-based XPath-injection виникають, коли скрипт включає дані, які може керувати зловмисник, у запит XPath.

Споживачі:

document.evaluate()
someDOMElement.evaluate()

Вразливості внедрення JSON на клієнтському боці

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

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

Sinks:

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

Маніпулювання веб-повідомленнями

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

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

Витоки:

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

Маніпулювання даними DOM

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

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

Витоки:

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

Відмова в обслуговуванні

З: https://portswigger.net/web-security/dom-based/denial-of-service

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

Витоки:

requestFileSystem()
RegExp()

Dom Clobbering

pageDom Clobbering
Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Last updated