XSS: Межсайтовый скриптинг - Основые уязвимости веб-приложений

XSS (Cross-Site Scripting) — «межсайтовый скриптинг» - группа уязвимостей, позволяющих выполнить, на открымой пользователем веб-странице код/действие, не предусмотренной разработчиками.

Используют сокращение «XSS», чтобы не было путаницы с каскадными таблицами стилей, использующими сокращение «CSS».

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

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

Основной сценарий

Основной сценарий - сохранение (через веб-форму) на сервер, такого текста/контента, который будет выполнен браузером (напр. внедрение Javascript)
схема атаки xss межсайтового скриптинга

Принцип атаки - на примере формы

  1. На сайте есть форма для публикации сообщения.
  2. Через эту форму хакер вместо простого текста отправляет JS-код.
  3. Сообщение публикуется на странице, которая доступна всем посетителям.
  4. Вредоносный код выполняется для каждого посетителя этой страницы.
  5. Вредоносный скрипт вредит пользователям сайта. Например, крадёт их куки.

Но XSS при этом может быть и просто в скинутой ссылке:
http://example.com/?search=<script>alert('xss')</script>>

Как защититься

Как и в случае с SQL иъекциями - экранировать пользовательский ввод, заменяя спец-последовательности, которые воспринимаются браузером как HTML тэги

Вариант решения проблемы

Надо обезопасить страницу, отфильтровав информацию из формы с помощью HTML-мнемоник (кодовое представление символа в HTML, который начинается со знака амперсанда & и завершается точкой с запятой ;).

Теги  <script>  состоят из треугольных скобок, а значит, если их заменить на мнемоники, то такой текст больше не будет трактоваться браузером как HTML-тег. Мнемоники часто используются, когда надо показать пользователю фрагмент с HTML-кодом на странице.

PHP - Применение функции фильтрации htmlspecialchars()

В PHP функция htmlspecialchars для переданной строки выполнит фильтрацию и заменит все опасные символы в ней на подходящие HTML-мнемоники. Пример:

$text = "<script><script>"; // от пользователя
$safe_str = htmlspecialchars($text); // фильтруем
print($safe_str); // узнаём, что получилось

Результат работы этого сценария: &lt;script&gt;&lt;/script&gt;

Видео-материалы

  • XSS: Межсайтовый скриптинг:
    • тг: https://t.me/prgblg/69
    • вк: https://vkvideo.ru/video-58271214_456239523
    • ютуб: https://youtu.be/QF71S7EjPKI

Используемая литература (что еще почитать)

  • learn.snyk.io - Cross-site scripting (XSS): https://learn.snyk.io/lesson/xss/?ecosystem=javascript
  • Prevent XSS injection by setting HttpOnly to true: https://docs.datadoghq.com/security/code_security/static_analysis/static_analysis_rules/go-security/cookie-http-only/

Key Words for FKN + antitotal forum (CS VSU):