# Cross Site Scripting ![](https://hackmd.io/_uploads/S14a_VEih.png) ## Описание уязвимости Уязвимость, которая может быть использована для захвата данных, которые используются для актентификации пользователя. К этим данным, обычно относятся сессионные идентификаторы. Главной особенностью уязвимости является задача поиска условий, прикоторых алгоритмы работы с разметкой страницы позволяют добавлять новый контент, который пользователь предоставляет приложению. Этот контент может быть: - в атрибуте тега - среди тегов - в javascript сценарии Позиция в коде страницы называется контекст. ## Разновидности Существует несколько разновидностей этой уязвимости: - Reflected XSS - Stored XSS - DOM-based XSS ### Reflected XXS Reflected или отраженная XSS - появляется в том случае, если приложение для построения страницы может использовать данные из параметров запроса. В этом случае чтобы атака с этой уязвимостью заработала, нужно чтобы злоумышленник передал жертве специально собранный URL, после его срабатывание атаки больше не будет воспроизводиться при посещении той же страницы, но не через ссылку злоумышленника. ### Stored XSS Хранимая XSS, воспроизводится для всех пользователей, которые посещают уязвимую страницу. Данные, которые нужны для работы атаки просто отправляются на backend, и после их обработки появляются в интерфейсе приложения в первозданном виде, в котором браузер может их добавить в опасный контекст. ### DOM-based XSS Уязвимости, DOM дерева это достаточно сложный вопрос, учитывая, что обработка этого дерева происходит большим количеством алгоритмов со стороны браузера. JavaScript, который используется для работы страницы приложения, может использовать дополнительные параметры, которые могут быть изменены пользователем. Например - URL или данные из cookie. Уязвимость возникает в тот момент, когда данные от пользователя не валидируются и используются для дальнейшей работы страницы. В этой типе уявзимости принято отслеживать путь попадания данных от пользователя на страницу. Чтобы было проще анализировать такие проблемы вводят понятие sink и source. **Sink** - это место в исходном коде страницы, которое помогает данным от атакующего попасть на страницу в контекст, который позволяет выполнять JS **Source** - это место в DOM дереве, которое поставляет данные для алгоритма работы страницы и на него может повлиять пользователь. ## Последствия эксплуатации Последствия могут быть следующими: - использование злоумышленником атаки CSRF - кража доступа к приложению - кража конфиденциальных данных пользователя - `угон` всего приложения ## Способы обнаружения Все типы уязвимостей, за исключением DOM-based можно искать путем непрерывного теста на качество фильтрации данных, которые будут добавляться на страницу. Тоесть тест проводится на основных символах разметки страницы - `<,/,',",>` DOM-based XSS проще всего искать с использованием Developer tools. Здесь можно использовать подход исследования исходного кода. Сначала найти Sink в исходнике, а затем попытаться изменить данные, которые используются для заполнения sink. ## Практическое задание https://portswigger.net/web-security/all-labs ## Защита от возникновения - использование инструментов фреймворков для фильтрации данных - использование многоуровневой защиты ## Механизм Content Security Policy Механизм, который позволяет контроллировать какие данные будут использоваться для работы страницы. С его помощью можно настроить практически всё: - шрифты - javascript - iframe - worker - embded objects Единственным по-настоящему проблемным местом механима может быть сам браузер. Если не поддерживается хотя бы одна директива, то поведение браузера не может соответствовать тому, что было задумано с точки зрения контроля контента. Механизм иногда позиционируют как единственный способ борьбы со всеми типами XSS. Лучше всего использовать механизм через соответствующий заголовок. Проверить на безопасность набор директив можно [тут](https://csp-evaluator.withgoogle.com). Механизм позволяет создавать логи для сбора данных, которые могли быть использованы для атак. ::: warning Для каждого приложения нужно, чтобы набор директив был подобран так, чтобы функционал не страдал от настроек. :::