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

Использование заголовков безопасности является важным звеном в защите сайта и его посетителей от хакерских атак. В прошлой статье про HTTP-авторизацию из рубрики по защите и безопасности я обещал регулярно публиковать записи на эту тему. Сегодня я расскажу про защиту от XSS атаки.

XSS

Что такое XSS-атака

Межсайтовый скриптинг (Cross Site Scripting) — это уязвимость, которая позволяет злоумышленнику внедрить вредоносный код (обычно HTML или JavaScript) в содержимое сайта. Вредоносный код выполняется в браузере пользователя, который просматривает зараженную страницу сайта.

Это позволяет злоумышленнику получить конфиденциальную информацию.

Злоумышленники могут эксплуатировать различные уязвимости. Наибольшее распространение получили два типа атаки:

  • Отражённая (Reflected XSS) — самый распространенный непостоянный тип атаки, требующий выполнения определённого действия со стороны пользователя.
  • Хранимая (Persistent XSS) — постоянный тип атаки с внедрением вредоносного кода на сервер, не требует вмешательства пользователя.

Отражённая XSS-атака

Срабатывает при переходе пользователя по специально подготовленной ссылке, которая отправляет запрос на сайт с уязвимостью. Данная уязвимость обычно является результатом недостаточной фильтрации входящих запросов, что позволяет манипулировать функциями и активировать вредоносные скрипты.

Reflected XSS
  1. Злоумышленник внедряет в гиперссылку вредоносный скрипт, позволяющий просматривать cookies пользовательской сессии, и отправляет жертве по электронной почте или другим средствам коммуникации.
  2. При переходе по ссылке пользователь становится захваченным.
  3. Скрипт выполняется в браузере пользователя.
  4. Браузер отправляет cookies злоумышленнику, обеспечивая доступ к личным данным пользователя.

Для распространения вредоносной ссылки могут использоваться различные каналы связи: электронная почта, комментарии на сайте, сообщения в социальных сетях. Анкорные ссылки чаще провоцируют пользователей на клик.

Хранимая XSS-атака

Для успешного выполнения хранимой атаки злоумышленнику достаточно найти уязвимость на сайте и разместить на своём сервере вредоносный скрипт. Затем на сайте размещается тег <script>, который загружает скрипт с вредоносным кодом с внешнего сайта, например, в комментариях. При загрузке заражённой страницы вредоносный скрипт каждый раз передаётся в браузер пользователя.

  1. Злоумышленник обнаруживает сайт с XSS уязвимостью и выполняет инъекцию вредоносного скрипта, который крадет cookies пользователя.
  2. При каждом посещении сайта вредоносный скрипт активируется без выполнения каких либо действий.
  3. Сессионные куки из браузера посетителя отправляются злоумышленнику.
Stored XSS

Включение заголовка X-XSS-Protection

Заголовок X-XSS-Protection предназначен для включения фильтра межсайтового скриптинга, встроенного во всех современных браузерах. Он позволит, например, предотвратить выполнение тега <script> в URL страницы.

ЗначениеОписание
0Фильтрация XSS отключена
1Фильтрация XSS включена, браузер очистит страницу от опасного содержимого при обнаружении атаки
1; mode=blockФильтрация XSS включена, браузер предотвратит загрузку страницы при обнаружении атаки
1; report=URLФильтрация XSS включена, браузер очистит страницу от опасного содержимого при обнаружении атаки и отправит отчёт

Директива report для отправки отчётов действует аналогично директиве report-uri (или report-to) Content Security Policy (CSP), указывая браузеру пользователя сообщать о попытках нарушения политики безопасности контента. Об этом я расскажу в отдельной статье.

Отчёт о нарушениях формируется в формате JSON и отправляется POST-запросами по указанному адресу URL.

Возвращаясь к основной теме, рекомендую настроить сервер таким образом, чтобы HTTP заголовок включал фильтрацию и при XSS-атаке блокировал загрузку страницы с небезопасным содержимым. В файле дополнительной конфигурации .htaccess (или httpd.conf, если у вас есть полный доступ к серверу) веб-сервера Apache необходимо добавить следующую запись:

<ifModule mod_headers.c>
Header set X-XSS-Protection "1; mode=block"
</IfModule>

Для сервера Nginx дополните файл nginx.conf в разделе HTTP записью:

add_header X-XSS-Protection "1; mode=block";

В том случае, если доступ к конфигурационным файлам сервера отсутствует, но есть поддержка PHP, тогда используйте функцию:

<?php header("X-XSS-Protection: 1; mode=block"); ?>

Cross Site Scripting, также известный как XSS, — это один из способов внедрения вредоносного кода, который исполняется на стороне клиента. Пользователь может заметить что-то неладное, например, необычное поведение страницы, иногда атака совершается абсолютно не заметно в фоновом режиме.

Безопасность сайта

Надеюсь, теперь вы стали немного больше понимать в HTTP-заголовках сервера и X-XSS поможет предотвратить межсайтовый скриптинг. Я использую заголовки безопасности на всех своих сайтах и настоятельно рекомендую вам сделать тоже самое. Вместе мы можем сделать интернет более безопасным! 😉

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
(6 голосов, в среднем: 4.3 из 5)
  1. Александр

    Надо и свой сайт защитить 🙂

    Ответить

  2. Марго

    Добрый день! А антивирусы не помогут?

    Ответить

  3. Webliberty

    Марго, антивирусы даже со встроенным межсетевым экраном в данном случае зачастую бесполезны. Они выявляют и блокируют другие угрозы, если только проактивная защита сможет выявить подозрительную активность.

    Ответить

  4. Руслан

    Защита своего сайта не маловажный фактор. Надо вашими рекомендациями воспользоваться, спасибо!

    Ответить

  5. Мария Крупнова

    Ну вот! А я так надеялась на антивирус! Думала, что это спасение от всех бед!

    Ответить

  6. Инженер

    Очень интересная и познавательная публикация! Кибербезопасность — это действительно важно.

    Ответить

  7. Александр

    Антивирусы до одного пикантного места, от них толку вообще ноль. У нас на всех рабочих ПК стояли лицензионки, базы ежедневно обновлялись, и всё равно вся база утекла. Пришлось пентест делать и дырки залатывать. Вызвали спецов из TomHunter, они всю сеть проанализировали, и даже удивлялись потом — удивительно мол, что за всё время только одна атака была на систему. Но после того как они поколдовали над нашей сетью, больше никаких вирусов не было, тьфу х3…

    Ответить

:) ;) :D :( :cry: :| :o :P 8-) :oops: :roll: :idea:

Отправляя комментарий, вы соглашаетесь с политикой конфиденциальности.