DOM-XSS
Что такое DOM-XSS?
DOM-XSSРазновидность XSS, при которой внедрение и выполнение целиком происходят в браузере: клиентский JavaScript записывает недоверенные данные в приёмник без санитизации.
DOM-XSS (Type-0) — это уязвимость межсайтового скриптинга, коренная причина которой целиком находится в клиентском коде. Термин ввёл Амит Кляйн (Amit Klein) в 2005 году в статье «DOM Based Cross Site Scripting or XSS of the Third Kind». Доверенный источник — location.hash, location.search, document.referrer, window.name, postMessage или localStorage — без санитизации попадает в опасный приёмник, такой как innerHTML, document.write, eval, setTimeout или jQuery.html(). Поскольку вредоносная полезная нагрузка часто едет во фрагменте URL (после #), она никогда не отправляется на сервер, что делает уязвимость невидимой для WAF, серверных журналов и большинства сканеров отражённого XSS.
Реальное воздействие велико: DOM-XSS многократно всплывал в рекламных и аналитических тегах, в обработчиках postMessage, доверяющих кросс-доменным данным, и в устаревших селекторах jQuery ($(location.hash), исправлено в CVE-2011-4969 для версий до 1.6.3). Собственный анализ Google показал, что большинство XSS в его продуктах были DOM-based, что послужило мотивом для создания Trusted Types. Меры защиты: предпочитайте инертные приёмники вроде textContent и setAttribute; санитизируйте с помощью DOMPurify или встроенного API Sanitizer; применяйте Trusted Types плюс строгую Content Security Policy; и запускайте инструменты taint-tracking, отслеживающие потоки от источника к приёмнику во время код-ревью.
flowchart LR
A["Источник<br/>location.hash / postMessage"] --> B[Клиентский JS<br/>читает значение]
B --> C{Санитизировано?}
C -->|"textContent / DOMPurify"| D[Отрендерено безопасно]
C -->|"сырая строка в innerHTML,<br/>eval, document.write"| E[Приёмник выполняет нагрузку]
E --> F[Скрипт атакующего работает<br/>в сессии жертвы]
F --> G[Кража cookie, захват<br/>аккаунта, кейлоггинг]
E -.->|Trusted Types блокирует| H[TypeError, нет выполнения]● Примеры
- 01
document.getElementById('out').innerHTML = location.hash.substring(1);
- 02
Маршрутизатор SPA использует window.location для вставки несанитизированного HTML в слот шаблона.
● Частые вопросы
Что такое DOM-XSS?
Разновидность XSS, при которой внедрение и выполнение целиком происходят в браузере: клиентский JavaScript записывает недоверенные данные в приёмник без санитизации. Относится к категории Атаки и угрозы в кибербезопасности.
Что означает DOM-XSS?
Разновидность XSS, при которой внедрение и выполнение целиком происходят в браузере: клиентский JavaScript записывает недоверенные данные в приёмник без санитизации.
Как защититься от DOM-XSS?
Защита от DOM-XSS обычно сочетает технические меры и операционные практики, как описано в определении выше.
Какие есть другие названия DOM-XSS?
Распространённые альтернативные названия: XSS типа 0, Клиентский XSS.