DOM Based XSS (или Type-0 XSS) — это разновидность XSS-атаки, при которой вредоносный payload выполняется в результате изменения DOM-окружения внутри браузера жертвы.
В отличие от классических Stored и Reflected XSS , HTTP-ответ сервера остаётся неизменным.
Уязвимость возникает на стороне клиента: JavaScript-код страницы начинает работать неожиданным образом из-за модификации DOM.
Ключевая особенность
Payload не внедряется сервером напрямую в HTML-ответ.
Вредоносные данные обрабатываются JavaScript-кодом уже внутри браузера пользователя.
Почему это опасно
DOM XSS сложно обнаружить, поскольку сервер может вообще не видеть вредоносный payload.
Многие атаки происходят полностью внутри браузера жертвы.
Пример DOM XSS
Допустим, сайт позволяет выбрать язык интерфейса через GET-параметр default .
<select>
<script>
document.write(
"<OPTION value=1>" +
decodeURIComponent(
document.location.href.substring(
document.location.href.indexOf("default=")+8
)
) +
"</OPTION>"
);
document.write(
"<OPTION value=2>English</OPTION>"
);
</script>
</select>
Что здесь происходит
JavaScript получает значение параметра default напрямую из URL.
Затем значение вставляется в страницу через опасный метод document.write() .
Если злоумышленник передаст JavaScript вместо обычного текста — браузер выполнит его как код.
Пример вредоносного URL
https://site.com/page.html?default=<script>alert(document.cookie)</script>
После открытия ссылки JavaScript будет выполнен непосредственно в браузере пользователя.
Опасные DOM API
- • innerHTML
- • outerHTML
- • document.write()
- • eval()
- • setTimeout(string)
- • setInterval(string)
Безопасные альтернативы
- • textContent
- • innerText
- • createElement()
- • setAttribute()
- • DOMPurify
- • CSP (Content Security Policy)
Итог
DOM Based XSS — одна из наиболее опасных разновидностей XSS, поскольку атака может происходить полностью на стороне клиента.
Даже если сервер защищён, небезопасная работа JavaScript с DOM способна привести к выполнению произвольного кода в браузере жертвы.