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

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

XSS (англ. Сross Site Sсriрting — «межсайтовый скриптинг») — тип атаки на уязвимые интерактивные информационные системы в вебе; внедрение выполняемых на клиентском компьютере вредоносных скриптов в выдаваемую системой страницу. Специфика подобных атак заключается в том, что для атаки на сервер в качестве средства атаки используется авторизованный на этом сервере клиент.

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

Из статистических данных на 2012 год XSS составляют 26 % и занимают первое место среди остальных уязвимостей[1]. Долгое время программисты не уделяли им должного внимания, считая их неопасными. Однако это мнение ошибочно: на странице или в HTTP-Cookie могут быть весьма уязвимые данные (например, идентификатор сессии администратора или номера платёжных документов). На популярном сайте скрипт может устроить DoS-атакy.

Содержание

Классификация [править]

По вектору [править]

Отражённые (пассивные) [править]

Отражённый XSS срабатывает, когда пользователь щёлкает на специально сфабрикованную ссылку. Например:

http://example.com/search.php?q=<script>DoSomething();</script>

Если сайт не экранирует угловые скобки, преобразуя их в "&lt;" и "&gt;", получим скрипт на странице результатов поиска.

Устойчивые (хранимые) [править]

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

По каналам внедрения скрипта [править]

Ошибки в браузере [править]

Когда из-за ошибки в браузере исправляют сайт

Bugzilla, 2004 год.[2] В некоторых браузерах (по крайней мере, Internet Explorer) при задании URL’а

http://bugzilla.mozilla.org/enter_bug.cgi?
  <script>alert('foo');</script>

не происходит URL-кодирования, и код

document.write(
   "<p>URL: " + document.location + "</p>");

внедрит в страницу скрипт.

Из-за ошибок браузер может выполнять скрипты в SVG, нарушать правило Same Domain Policy… Это серьёзные ошибки; после обнаружения их быстро закрывают, однако в переходный период опасными становятся практически все сайты Веб 2.0: форумы, вики, имиджборды… Если такая ошибка обнаружилась, рекомендуется, пока не вышло обновление, пользоваться другим браузером.

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

Отсутствие экранирования спецсимволов HTML [править]

Экранировать нужно все пользовательские тексты

phpBB, 2002 год.[3][4] Хотя URL картинок проверяется на протокол (разрешён только http:), сам URL никак не экранируется, и строкой наподобие

[img]http://a.a/a"onerror="
   javascript:alert(document.cookie)[/img]

можно протащить в документ пользовательский скрипт.

Намного чаще встречаются ошибки на сайтах. Чтобы браузер гарантированно не принял строку за тэг HTML, требуется заэкранировать пять символов: '"&<>. Сервер может экранировать не все символы (известный недостаток PHP[5]), либо веб-программист просто забывает заэкранировать строку.

Обычно в базах данных текст хранится неэкранированным, и экранировать требуется все пользовательские строки каждый раз, когда они встраиваются в HTML: например, если не заэкранирован URL картинки, пользователь может ввести что-то наподобие http://example.com/img.png" onmouseover="javascript:DoSomething();.

Многие сайты позволяют форматирование текста с помощью какого-либо языка разметки (HTML, BBCode, вики-разметка). Часто не проводится полный лексический анализ языка разметки, а лишь преобразование в «безопасный» HTML с помощью регулярных выражений[6]. Это упрощает программирование, однако требует досконального понимания, какими путями скрипт может проникнуть в результирующий HTML-код.

Отсутствие фильтрации атрибутов и их значений в разрешённых тегах [править]

Типичным примером будет ссылка <a href="javascript:DoSomething()">. Даже если форум позволяет внешние ссылки, не стоит пускать протоколы javascript: и data:.

Не являются XSS, но не менее вредны и другие атаки: хакер может указать в качестве адреса сервер, имеющий узкий интернет-канал, парализуя его работу большим количеством запросов, или устроить с его помощью XSRF-атаку.

Подмена кодировки в заголовке страницы [править]

Современные браузеры пытаются определить кодировку страницы на ходу и интерпретируют html в соответствии с этой кодировкой. В случае, если тег <title> расположен до тега <meta> и заполняется пользовательскими данными, хакер может вставить злонамеренный html-код в кодировке UTF-7, обойдя таким образом фильтрацию таких символов, как < и ".[7][8]

Для защиты от данной уязвимости следует явно указывать кодировку страницы до каких-либо пользовательских полей. HTML 5 прямо запрещает поддержку браузерами кодировки UTF-7 как потенциально опасной.[9]

Прочие [править]

Возможно использование XSS атаки совместно с внедрением SQL-кода, которая называется SiXSS-атака.

См. также [править]

Ссылки [править]

Примечания [править]

  1. По данным securitylab.ru график, страница
  2. 272620 – XSS vulnerability in internal error messages. Проверено 2 января 2013.
  3. National Vulnerability Database (NVD) National Vulnerability Database (CVE-2002-0902)  (англ.)
  4. Bugtraq: Cross Site Scripting Vulnerability in phpBB2’s [IMG] tag and remote avatar  (англ.)
  5. Стандартная функция PHP htmlspecialchars по умолчанию не экранирует апострофа, и в сочетании с кодом "<a href='$htUrl'>" получается уязвимость.
  6. Пример разбора BBCode регулярными выражениями
  7. http://old.antichat.ru/txt/utf7/ (недоступная ссылка с 11-07-11 (673 дня))
  8. UTF-7 XSS Cheat Sheet  (англ.)
  9. http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#charset