Источник: 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-кода.

image

Что такое 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?

image

DOM XSS работает на стороне клиента и проявляется, когда небезопасный клиентский код принимает данные из ненадежного источника и напрямую вставляет их в структуру документа без должной фильтрации.

Ключевые этапы атаки DOM XSS:

  1. Пользователь получает ссылку с вредоносным кодом, встроенным в параметры URL или хэш.

  2. Браузер пользователя загружает страницу и выполняет клиентский JavaScript-код.

  3. Скрипт на странице извлекает данные из источников (например, location.hash, location.search).

  4. Данные напрямую вставляются в HTML-код через небезопасные методы (например, innerHTML).

  5. Вредоносный код выполняется на стороне клиента, получая доступ к данным сессии и выполняя произвольные действия.

Почему 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).