Межсайтовый скриптинг
XSS (англ. Сross Site Sсriрting — «межсайтовый скриптинг») — тип атаки на уязвимые интерактивные информационные системы в вебе; внедрение выполняемых на клиентском компьютере вредоносных скриптов в выдаваемую системой страницу. Специфика подобных атак заключается в том, что для атаки на сервер в качестве средства атаки используется авторизованный на этом сервере клиент.
Для термина используют сокращение «XSS», чтобы не было путаницы с каскадными таблицами стилей, использующих сокращение «CSS».
Из статистических данных на 2012 год XSS составляют 26 % и занимают первое место среди остальных уязвимостей[1]. Долгое время программисты не уделяли им должного внимания, считая их неопасными. Однако это мнение ошибочно: на странице или в HTTP-Cookie могут быть весьма уязвимые данные (например, идентификатор сессии администратора или номера платёжных документов). На популярном сайте скрипт может устроить DoS-атакy.
Содержание |
Классификация [править]
| В этом разделе не хватает ссылок на источники информации.
Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.
Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники. Эта отметка установлена 12 мая 2011. |
По вектору [править]
Отражённые (пассивные) [править]
Отражённый XSS срабатывает, когда пользователь щёлкает на специально сфабрикованную ссылку. Например:
http://example.com/search.php?q=<script>DoSomething();</script>
Если сайт не экранирует угловые скобки, преобразуя их в "<" и ">", получим скрипт на странице результатов поиска.
Устойчивые (хранимые) [править]
Специфичны для сайтов Веб 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-атака.
См. также [править]
Ссылки [править]
Примечания [править]
- ↑ По данным securitylab.ru график, страница
- ↑ 272620 – XSS vulnerability in internal error messages. Проверено 2 января 2013.
- ↑ National Vulnerability Database (NVD) National Vulnerability Database (CVE-2002-0902) (англ.)
- ↑ Bugtraq: Cross Site Scripting Vulnerability in phpBB2’s [IMG] tag and remote avatar (англ.)
- ↑ Стандартная функция PHP
htmlspecialcharsпо умолчанию не экранирует апострофа, и в сочетании с кодом"<a href='$htUrl'>"получается уязвимость. - ↑ Пример разбора BBCode регулярными выражениями
- ↑ http://old.antichat.ru/txt/utf7/ (недоступная ссылка с 11-07-11 (673 дня))
- ↑ UTF-7 XSS Cheat Sheet (англ.)
- ↑ http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#charset
| Это заготовка статьи о программном обеспечении. Вы можете помочь проекту, исправив и дополнив её. |

