Источник: https://github.com/AnaktaCTF/CTF/blob/main — WEB/DOM-based Cross-Site Scripting (DOM XSS).md
DOM-based Cross-Site Scripting (DOM XSS) — это разновидность XSS, при которой уязвимость полностью реализуется на стороне клиента. В отличие от классического XSS (Stored и Reflected), где вредоносный код передается через сервер, DOM XSS появляется из-за небезопасной обработки данных внутри клиентского JavaScript-кода.
Что такое DOM?
Document Object Model (DOM) — это интерфейс программирования для HTML и XML документов. Он представляет собой иерархическую модель документа, где каждый элемент HTML представлен в виде объекта, доступного через глобальную переменную document. Эта модель позволяет динамически изменять содержимое и структуру веб-страницы, что делает её мощным инструментом для создания интерактивных пользовательских интерфейсов
Особенности и риски использования DOM
DOM предоставляет объектно-ориентированное представление страницы, которое можно изменять с помощью языков программирования, таких как JavaScript. Основные возможности включают доступ к элементам HTML по их идентификаторам, классам, именам тегов и атрибутам. Разработчики могут изменять структуру страницы путём создания, изменения или удаления узлов, а также реализовывать интерактивное взаимодействие пользователя с веб-страницей с помощью событий.
Однако неправильное использование DOM-методов, таких как innerHTML, document.write или eval, без должной фильтрации и экранирования пользовательского ввода может привести к уязвимостям, включая DOM-based XSS. Это подчёркивает важность безопасной обработки данных при работе с DOM.
Таким образом, понимание структуры и принципов работы DOM, а также осознание потенциальных рисков при его использовании, является ключевым для обеспечения безопасности веб-приложений.
Каждый элемент HTML документа в DOM представлен объектом, который можно изменять, удалять или добавлять. Например, можно изменить текст элемента, его стиль, атрибуты или даже структуру документа.
Основные возможности DOM:
-Доступ к элементам HTML по их идентификаторам, классам, именам тегов и атрибутам.
-Изменение структуры страницы путём создания, изменения или удаления узлов.
-Реализация интерактивного взаимодействия пользователя с веб-страницей с помощью событий.
DOM является основой для создания динамических веб-приложений и активно используется во всех современных браузерах. Понимание структуры DOM и способов взаимодействия с ним критически важно для создания безопасных и интерактивных веб-приложений.
Ключевые особенности DOM XSS:
-Выполняется исключительно на стороне клиента, без участия сервера на этапе исполнения кода.
-Сервер не видит и не логирует вредоносный скрипт, так как данные не проходят через серверную часть приложения.
-Чаще всего проявляется при работе с динамическими данными, которые напрямую обрабатываются на стороне клиента (например, URL, cookies, localStorage).
-Трудно обнаружить с помощью стандартного логирования на сервере, поскольку атака происходит полностью на клиенте.
-Легко интегрируется в легитимные веб-приложения, если не проводится корректная проверка и фильтрация входных данных.
-Потенциально позволяет получить доступ к критически важной информации пользователя, такой как куки сессий и данные из локального хранилища.
Как работает DOM XSS?
DOM XSS работает на стороне клиента и проявляется, когда небезопасный клиентский код принимает данные из ненадежного источника и напрямую вставляет их в структуру документа без должной фильтрации.
Ключевые этапы атаки DOM XSS:
-
Пользователь получает ссылку с вредоносным кодом, встроенным в параметры URL или хэш.
-
Браузер пользователя загружает страницу и выполняет клиентский JavaScript-код.
-
Скрипт на странице извлекает данные из источников (например, location.hash, location.search).
-
Данные напрямую вставляются в HTML-код через небезопасные методы (например, innerHTML).
-
Вредоносный код выполняется на стороне клиента, получая доступ к данным сессии и выполняя произвольные действия.
Почему DOM XSS опасен?
DOM XSS представляет опасность из-за следующих факторов:
-Атака происходит исключительно на стороне клиента, поэтому серверные логи остаются чистыми.
-Может быть легко интегрирован в легитимные ссылки, что делает атаку незаметной.
-Возможность кражи сессионных данных, выполнения действий от имени пользователя или изменения содержимого страницы.
-Использование популярных методов, таких как innerHTML и eval, без проверки входных данных делает уязвимость особенно распространенной.
Защита от DOM XSS
Для предотвращения DOM XSS рекомендуется:
Избегать использования опасных приёмников, таких как innerHTML и document.write().
Использовать безопасные методы, например, textContent или setAttribute(), с предварительной валидацией и экранированием данных.
Применять Content Security Policy (CSP) для ограничения выполнения неподписанных скриптов.
Использовать библиотеки для очистки данных, такие как DOMPurify.
Источники уязвимостей
DOM XSS может возникать в результате неправильной обработки данных, получаемых из различных источников. Наиболее распространённые источники включают:
-URL-параметры (например, location.search)
-Хэш-фрагменты (например, location.hash)
-Cookies (например, document.cookie)
-Локальное и сессионное хранилище (например, localStorage, sessionStorage)
-Заголовки HTTP (например, document.referrer)
Опасные методы
Наиболее опасными методами являются те, которые напрямую модифицируют DOM с использованием непроверенных данных:
innerHTML и outerHTML — вставка HTML-кода в элементы.
document.write() — динамическое создание содержимого страницы.
eval() — выполнение строкового выражения как кода.
setTimeout() и setInterval() — выполнение кода с задержкой.
insertAdjacentHTML() — вставка HTML в структуру документа.
Методы предотвращения DOM XSS
Экранирование данных
Применение функции экранирования перед вставкой в DOM:
function sanitize(input) {
var div = document.createElement('div');
div.textContent = input;
return div.innerHTML;
}
Безопасные методы вставки данных
Вместо использования innerHTML, предпочтительнее применять:
-textContent — для безопасного отображения текста.
-createTextNode — создание текстового узла.
-appendChild — безопасное добавление элементов в DOM.
DOM XSS представляет серьёзную угрозу безопасности веб-приложений. Основные причины уязвимости — неправильная работа с пользовательскими данными на стороне клиента. Для предотвращения атак важно применять экранирование данных, использовать безопасные методы работы с DOM и настраивать политики безопасности контента (CSP).