FlawOpen

flawopen.com/Межсайтовый скриптинг

Межсайтовый скриптинг

Высокий CWE-79
Язык: English Português (Brasil) Español Français Deutsch Русский 简体中文 日本語 हिन्दी 한국어 Bahasa Indonesia

Межсайтовый скриптинг возникает, когда страница включает текст одного пользователя так, что браузер разбирает его как HTML или JavaScript, и он выполняется у других пользователей с полномочиями самого сайта. Исправление везде одинаково: кодировать каждое значение под точное место, куда оно пишется, очищать те редкие поля, где нужен HTML, и подкреплять и то и другое политикой Content Security Policy. Выберите язык ниже, чтобы увидеть точные API, уязвимый и исправленный код и правила CI, которые это ловят.

Простыми словами (ELI5)

Газета печатает письма читателей на своих страницах. Один читатель присылает письмо, свёрстанное в точности как объявление редакции: «Подписчики, позвоните по этому номеру и продиктуйте данные карты для продления». Напечатанному фирменным шрифтом газеты, ему верят так, будто его написала редакция. XSS — это сайт, который вставляет текст посетителя в собственную страницу, где браузер считает его кодом самого сайта, с доступом сайта к вашему аккаунту. Экранирование — это печать каждого письма в явно обозначенной рамке для цитат, чтобы ни одно не выдало себя за объявление редакции.

Ключевые понятия и термины

Cross-site scripting (CWE-79)
Веб-страница включает недоверенные данные, не нейтрализовав их для браузера, поэтому разметка или скрипт в этих данных разбирается и выполняется в источнике страницы, с доступом к её DOM, cookie и API.
Reflected, stored and DOM-based XSS
Отражённый XSS возвращает данные запроса прямо в ответе, обычно через подготовленную ссылку. Хранимый XSS сохраняет значение и отдаёт его каждому, кто смотрит страницу. DOM-based XSS вообще не касается сервера: клиентский JavaScript копирует данные из URL или хранилища в приёмник вроде innerHTML.
Contextual output encoding
Каждому контексту вывода нужно своё кодирование: HTML-сущности для текста элемента и атрибутов в кавычках, экранирование строк JavaScript внутри скриптов, процентное кодирование в параметрах URL и проверка схемы для href и src. HTML-кодирования значения внутри скрипта недостаточно.
Sanitizing vs encoding
Кодирование показывает разметку как текст. Если пользователи должны отправлять форматирование, пропускайте HTML через санитайзер с белым списком (DOMPurify, nh3 — преемник bleach, OWASP Java HTML Sanitizer, HtmlSanitizer, ammonia), который сохраняет разрешённые теги и удаляет скрипты, обработчики событий и URL javascript:.
Content Security Policy (CSP)
Заголовок ответа, сообщающий браузеру, какие скрипты можно выполнять. script-src на основе nonce без 'unsafe-inline' блокирует большинство внедрённых скриптов, даже если ошибка кодирования проскочила, а require-trusted-types-for 'script' закрывает приёмники DOM.

Пошаговый сценарий атаки

Шаг 1

Недоверенный текст попадает на страницу

Поисковый запрос, поле профиля, комментарий, фрагмент URL или ответ API включается при сборке страницы на сервере или при её обновлении в браузере.

Шаг 2

Он записывается без нужного кодирования

Экранирование шаблона отключено, значение попадает в контекст скрипта или URL, который HTML-экранирование не покрывает, или клиентский код присваивает его innerHTML. Безобидное тестовое значение <img src=x onerror=alert(1)> проходит без изменений.

Шаг 3

Браузер разбирает его как код

Браузер жертвы строит настоящий элемент <img> и вызывает onerror или выполняет ссылку javascript: при клике.

Шаг 4

Скрипт действует от имени сайта

Он работает с источником сайта: читает страницу, вызывает API сайта с cookie или токенами жертвы, меняет то, что видит пользователь, и отправляет формы от его имени.

Руководства по XSS для каждого языка

Python JavaScript Go Java PHP C# Ruby C/C++ Rust Kotlin Swift

Чек-лист по защите системы для инженеров

Читайте также

Отражённый, хранимый и DOM XSS Достаточно ли экранирования? CSP или экранирование? Достаточно ли DOMPurify? XSS через отрисовку Markdown