Xss атака
Содержание:
- Хеширование паролей и авторизация
- Response Middleware API
- Testing Hubot Scripts
- Эффективная защита
- Основные принципы скриптов
- XSS: Уязвимость для инъекции
- Использование языка JavaScript в контекстной рекламе
- Frequently asked questions
- Error Handling
- Справочная информация
- Общая классификация XSS
- Роль скриптов в продвижении
- Как защититься от XSS
- References
- Справочная информация
- Примечания
Хеширование паролей и авторизация
Для хеширования паролей в PHP существует функция password_hash():
Вторым параметром передаётся алгоритм хеширования. По-умолчанию это указанный нами bcrypt, но я рекомендую указывать его вручную, поскольку базовый алгоритм в будущем может поменяться. Будет грустно, если при очередном обновлении версии PHP на сайте отвалится авторизация.
Для проверки корректности введённого пользователем пароля используется функция password_verify():
Ещё раз. При регистрации пользователя нужно передать пароль в функцию password_hash(), а полученный хеш сохранить в базу данных.
При попытке авторизации получаем пользователя по его логину и проверяем функцией password_verify(), соответствует ли хеш пароля тому паролю, который ввёл пользователь.
Таким образом, хранить исходный пароль больше нет смысла.
Да, разные алгоритмы хеширования генерируют хеш разной длины, поэтому рекомендуется хранить хеш в поле с типом VARCHAR(255).
Response Middleware API
Response middleware callbacks receive three arguments, , , and
. See the for a description
of and . Receive middleware context includes these fields:
Testing Hubot Scripts
hubot-test-helper is a good
framework for unit testing Hubot scripts. (Note that, in order to use
hubot-test-helper, you’ll need a recent Node version with support for Promises.)
Install the package in your Hubot instance:
You’ll also need to install:
- a JavaScript testing framework such as Mocha
- an assertion library such as chai or expect.js
You may also want to install:
- coffee-script (if you’re writing your tests in CoffeeScript rather than JavaScript)
- a mocking library such as Sinon.js (if your script performs webservice calls or
other asynchronous actions)
Here is a sample script that tests the first couple of commands in the
Hubot sample script. This script uses Mocha, chai, coffee-script, and of course hubot-test-helper:
test/example-test.coffee
sample output
Эффективная защита
Избегать перезаписи документа на стороне клиента, переадресацию или другие подобные действия, использующие данные на стороне клиента. Большинство этих действий может быть выполнено с использованием динамических страниц (на стороне сервера).
Анализ и повышение защищенности кода (Javascript) на стороне клиента. Ссылки на объекты DOM, на которые может влиять пользователь (атакующий), должны быть тщательно проверены
Особое внимание нужно уделять следующим объектам (но не ограничиваться ими):
document.URL
document.URLUnencoded
document.location (и его свойства)
document.referrer
window.location (и его свойства)
Обратите внимание: на свойства объектов document и window можно сослаться несколькими способами: явно (пример — window.location), неявно (пример — location) или через получения дескриптора и использования его (пример — handle_to_some_window.location).
Особое внимание нужно уделить коду, где модифицируется DOM, явно или есть потенциальная возможность, а также через прямой доступ к HTML или через доступ непосредственно к DOM. Примеры (это ни в коем случае не исчерпывающий список):
Запись в HTML код страницы:
document.write(…)
document.writeln(…)
document.body.innerHtml=…
Изменение DOM напрямую (включая события DHTML):
document.forms.action=… (и другие вариации)
document.attachEvent(…)
document.create…(…)
document.execCommand(…)
document.body
… (доступ к DOM через объект body)
window.attachEvent(…)
Изменение URL документа:
document.location=… (а также присвоение значений href, host и hostname объекта location)
document.location.hostname=…
document.location.replace(…)
document.location.assign(…)
document.URL=…
window.navigate(…)
Открытие/модификация объекта window:
document.open(…)
window.open(…)
window.location.href=… (а также присвоение значения host и hostname объекта location)
Выполнение скрипта напрямую:
eval(…)
window.execScript(…)
window.setInterval(…)
window.setTimeout(…)
В продолжение вышеупомянутого примера, для эффективной защиты оригинальный скрипт может быть заменен следующим кодом, который проверяет строку, записываемую в HTML страницу на наличие только алфавитно-цифровых символов.
Такая функциональности может быть (и, наверное, должна быть) реализована через универсальную библиотеку контроля данных (т.е. через набор функций Javascript, осуществляющий проверку/модификацию входных данных). Минусом этого способа является то, что принцип работы защиты доступен атакующим, т.к. защита реализована в HTML коде. Это упрощает анализ и планирование атаки. В примере выше ситуация достаточно простая, тогда как проверки защиты в более сложных скриптах далеки от совершенства, что дает возможность поиска путей обхода защиты.
Использовать строгие правила IPS, в которых, к примеру, странице welcome.html разрешено получать один единственный параметр, имеющий имя “name”, значение которого проверяется, и любое несоответствие (включая избыточные параметры или отсутствие параметров) приводит к отказу в обслуживании оригинальной страницы, также как и любое другой нарушение (например, заголовки Authorization или Referer, содержащие проблематичные данные). Хотя в некоторых случаях даже такие меры не гарантируют полную защиту от атаки.
Основные принципы скриптов
Интерпретатор языка JavaScript встроен во все популярные браузеры. Именно поэтому любой браузер понимает, что такое скрипт на этом языке. Эти коды успешно выполняются в тот момент, когда пользователь обращается к страницам сайта. Но такие же скрипты могут успешно работать и на сервере, если на нем установлен интерпретатор JavaScript. Сценарии могут выполняться как на стороне клиента, в браузере, так и непосредственно на сервере.
Скрипты имеют следующие цели:
- SEO-скрипты (шаблоны) для продвижения сайтов. Обычно под их управлением работают специализированные программы автоматизации этого процесса. Наиболее известные – ZennoPoster, Human Emulator;
- системы для сбора статистики посещений (счетчики посещаемости). Эти скрипты чаще всего создаются с применением JavaScript;
- сценарии для обращения к базам данных. Здесь лидирует язык PHP;
- скрипты для работы гостевых книг и создания комментариев к записям. Чаще всего применяется комбинация PHP и JavaScript;
- скрипты для динамического отображения сайтов. В этом случае скриптовый язык определяется языком написания CMS;
- скрипты для изменения части страницы сайта без ее перезагрузки. При реализации используются технологии Ajax. В этом случае на первый план выходят асинхронный JavaScript и XML. Веб-приложения производят обмен данных с сервером в «фоне», изменения на страницах сайта происходят без их полной перезагрузки. Пользователи обычно не замечают таких изменений, и им не нужно понимать, что такое скриптовый язык программирования, чтобы отлично взаимодействовать с сайтом.
XSS: Уязвимость для инъекции
Любой веб-сайт или приложение имеет несколько мест ввода данных —полей формы до самого URL. Простейший пример вводимых данных — когда мы вписываем имя пользователя и пароль в форму:
Рисунок 1. Форма ввода данных
Наше имя будет храниться в базе данных сайта для последующего взаимодействия с нами. Наверняка, когда вы проходили авторизацию на каком-либо сайте, вы видели персональное приветствие в стиле «Добро пожаловать, Илья». Именно для таких целей имена пользователей хранятся в базе данных.
Инъекцией называется процедура, когда вместо имени или пароля вводится специальная последовательность символов, заставляющая сервер или браузер отреагировать определенным, нужным злоумышленнику образом.
Межсайтовым скриптингом называется инъекция, внедряющая код, который будет выполнять действия в браузере от имени веб-сайта. Это может происходить как с уведомлением пользователя, так и в фоновом режиме, без его ведома.
Рисунок 2. Наглядная схема межсайтового скриптинга
В качестве простейшего примера можно привести элементарный скрипт, показывающий окно с уведомлением. Выглядит он примерно так:
Таблица 1. Скрипт, вызывающий всплывающее окно
<script>alert(‘ЭТО XSS-УЯЗВИМОСТЬ!!!’)</script>
Данный скрипт вызывает окно с надписью «ЭТО XSS-УЯЗВИМОСТЬ!!!». Браузер пользователя воспринимает и выполняет этот скрипт как часть легитимного кода сайта.
Использование языка JavaScript в контекстной рекламе
Еще в 2012 году рекламная система Google AdWords внесла в свой интерфейс возможности использования скриптов для автоматизации управления рекламной кампанией. Такой способ управления работает значительно быстрее, чем использование API. К тому же он не требует применения сложных языков программирования. Задачи на основе скриптов запускаются по расписанию. Они обеспечивают регулярную проверку аккаунта, дают возможность анализировать статистику рекламы и вносить любые заданные изменения. При этом можно в автоматизированном режиме отслеживать качество рекламных объявлений, отключать неэффективные каналы рекламы и подключать эффективные.
Frequently asked questions
How does Cross-site Scripting work?
In a Cross-site Scripting attack (XSS), the attacker uses your vulnerable web page to deliver malicious JavaScript to your user. The user’s browser executes this malicious JavaScript on the user’s computer. Note that about one in three websites is vulnerable to Cross-site scripting.
Why is Cross-site Scripting dangerous?
Even though a Cross-site Scripting attack happens in the user’s browser, it may affect your website or web application. For example, an attacker may use it to steal user credentials and log in to your website as that user. If that user is an administrator, the attacker gains control over your website.
How to discover Cross-site Scripting?
To discover Cross-site Scripting, you may either perform manual penetration testing or first use a vulnerability scanner. If you use a vulnerability scanner, it will save you a lot of time and money because your penetration testers can then focus on more challenging vulnerabilities.
How to protect against Cross-site Scripting?
To protect against Cross-site Scripting, you must scan your website or web application regularly or at least after every chance in the code. Then, your developers must correct the code to eliminate the vulnerability. Contrary to popular opinions, web application firewalls do not protect against Cross-site Scripting, they just make the attack more difficult – the vulnerability is still there.
Error Handling
No code is perfect, and errors and exceptions are to be expected. Previously, an uncaught exceptions would crash your hubot instance. Hubot now includes an handler, which provides hooks for scripts to do something about exceptions.
You can do anything you want here, but you will want to take extra precaution of rescuing and logging errors, particularly with asynchronous code. Otherwise, you might find yourself with recursive errors and not know what is going on.
Under the hood, there is an ‘error’ event emitted, with the error handlers consuming that event. The uncaughtException handler . Therefore, you should rescue your own exceptions whenever possible, and emit them yourself. The first argument is the error emitted, and the second argument is an optional message that generated the error.
Using previous examples:
For the second example, it’s worth thinking about what messages the user would see. If you have an error handler that replies to the user, you may not need to add a custom message and could send back the error message provided to the request, but of course it depends on how public you want to be with your exception reporting.
Справочная информация
Безопасность в Интернете обеспечивается с помощью многих механизмов, в том числе важной концепцией, известной как правило ограничения домена. Это правило разрешает сценариям, находящимся на страницах одного сайта (https://mybank.example.com), доступ к методам и свойствам друг друга без ограничений, но предотвращает доступ к большинству методов и свойств для страниц другого сайта (https://othersite.example.com) (недоступная ссылка).. Межсайтовый скриптинг использует известные уязвимости в web-приложениях, серверах (или в системных плагинах, относящихся к ним)
Используя одну из них, злоумышленник встраивает вредоносный контент в содержание уже взломанного сайта. В результате пользователь получает объединенный контент в веб-браузере, который был доставлен из надежного источника, и, таким образом, действует в соответствии с разрешениями, предоставленными для этой системы. Сумев внедрить необходимый скрипт в веб-страницу, злоумышленник может получить повышенные привилегии в отношении работы с веб-страницами, cookies и другой информацией, хранящейся в браузере для данного пользователя.
Межсайтовый скриптинг использует известные уязвимости в web-приложениях, серверах (или в системных плагинах, относящихся к ним). Используя одну из них, злоумышленник встраивает вредоносный контент в содержание уже взломанного сайта. В результате пользователь получает объединенный контент в веб-браузере, который был доставлен из надежного источника, и, таким образом, действует в соответствии с разрешениями, предоставленными для этой системы. Сумев внедрить необходимый скрипт в веб-страницу, злоумышленник может получить повышенные привилегии в отношении работы с веб-страницами, cookies и другой информацией, хранящейся в браузере для данного пользователя.
Выражение «межсайтинговый скриптинг» первоначально означало взаимодействие уязвимого веб-приложения с сайтом злоумышленника таким образом, чтобы в контексте атакуемого домена был выполнен JavaScript-код, подготовленный злоумышленником (отражённая или хранимая XSS уязвимость). Постепенно определение стало включать в себя и другие способы внедрения кода, включая использование устойчивых и не относящихся к JavaScript языков (например, ActiveX, Java, VBScript, Flash и даже HTML), создавая путаницу среди новичков в сфере информационной безопасности.
XSS уязвимости зарегистрированы и используются с середины 1990-x годов. Известные сайты, пострадавшие в прошлом, включают такие сайты социальных сетей, как ,
,
MySpace,
YouTube,
и др.
Общая классификация XSS
Четкой классификации для межсайтового скриптинга не существует, но экспертами по всему миру выделено три основных типа.
Хранимые XSS (постоянные). Один из самых опасных типов уязвимостей, так как позволяет злоумышленнику получить доступ к серверу и уже с него управлять вредоносным кодом (удалять, модифицировать). Каждый раз при обращении к сайту выполняется заранее загруженный код, работающий в автоматическом режиме. В основном таким уязвимостям подвержены форумы, порталы, блоги, где присутствует возможность комментирования в HTML без ограничений. Вредоносные скрипты с легкостью могут быть встроены как в текст, так и в картинки, рисунки.
Отраженные XSS (непостоянные). В этом случае вредоносная строчка выступает в роли запроса жертвы к зараженному веб-сайту. Работает этот принцип по следующей схеме:
DOM-модели. В этом варианте возможно использование как хранимых XSS, так и отраженных. Суть заключается в следующем:
- Злоумышленник создает URL-адрес, который заранее содержит вредоносный код, и отправляет его по электронной почте или любым другим способом пользователю.
- Человек переходит по этой ссылке, зараженный сайт принимает запрос, исключая вредоносную строку.
- На странице у пользователя выполняется сценарий, в результате чего загружается вредоносный скрипт и злоумышленник получает cookies.
Роль скриптов в продвижении
Использование в процессе программирования страниц слайдеров, динамических навигационных меню, активных элементов анимации позволяет расширить юзабилити сайтов, увеличить их посещаемость. Удачные решения на этой основе значительно повышают продажи. В качестве примера можно рассмотреть специальные технологии создания видеопродающих страниц. Здесь используются приемы на основе JavaScript.
И таких решений множество.
Отдельно стоит отметить технологии создания скриптов, имитирующих с помощью специальных программ действия пользователей в различных направлениях. Такие скрипты и шаблоны формируются на основе программ ZennoPoster, Human Emulator и их аналогов.
Уникальность таких решений базируется на том, что в шаблонах ZennoPoster может быть запрограммирована любая последовательность действий реального пользователя. При этом программа может эмулировать одновременно практически неограниченное количество пользователей, применять как собственные, так и получаемые из Интернета информационные базы.
В качестве примера можно рассмотреть шаблоны, позволяющие в автоматизированном режиме выполнять множество действий по продвижению сайтов и товаров в социальной сети «ВКонтакте». Другие шаблоны обеспечивают размещение объявлений или иной информации в Сети. Третьи в автоматизированном режиме могут генерировать множество блогов и страниц, на которых размещаются ссылки или коммерческая информация. Пользователи, которые видят результаты таких действий, обычно не знают, что это заскриптованный алгоритм размещает информацию для них в соцмедиа.
Во многих случаях для продвижения сайтов необходимо множество аккаунтов почты. В качестве примера можно рассмотреть почтовый сервис mail.ru. Автоматизированный шаблон для программы ZennoPoster легко справляется с этой задачей. При этом скрипт не просто заходит на страницу регистрации, но также самостоятельно выполняет работу по разгадыванию капчи, определяет возможный бан IP-адреса и выполняет много других действий.
Как защититься от XSS
К нашему огромному счастью, есть простой универсальный инструмент — функция htmlspecialchars() или её иногда применяемый аналог htmlentities().
Как это работает. В HTML есть такая штука как сущности или мнемоники. Это когда я пишу прямо в HTML определённую последовательность символов, например ©, а браузер отображает соответствующий этой мнемонике символ, в данном случае значок копирайта .
Попробуй сам:
Так вот. Когда мы запускаем функцию htmlspecialchars(), она берёт нашу строку и заменяет некоторые символы в ней (кавычки, угловые скобки и т.д.) на мнемоники, чтобы браузер гарантированно вывел нашу строку на экран как строку, не пытаясь выполнять её как код.
Т.е. когда мы введём в нашу форму текст <script>alert(‘hello’)</script>, функция htmlspecialchars() превратит его в <script>alert(‘hello’)</script>. Разумеется, браузер уже не воспримет такой код как javascript и просто выведет на экран как есть.
Проверим:
Теперь какой бы javascript код мы не пытались подставить, он будет просто выводиться в браузер как строка.
References
- OWASP’s XSS (Cross Site Scripting) Prevention Cheat
Sheet - OWASP Guide to Building Secure Web Applications and Web Services,
Chapter 8: Data Validation - OWASP Testing Guide,
Testing_for_Reflected_Cross_site_scripting_(OWASP-DV-001) - OWASP Testing Guide,
Testing_for_Stored_Cross_site_scripting_(OWASP-DV-002) - OWASP Testing Guide,
Testing_for_DOM-based_Cross_site_scripting_(OWASP-DV-003) - OWASP’s How to Build an HTTP Request Validation Engine (J2EE
validation using OWASP’s
Stinger) - Google Code Best Practice Guide:
http://code.google.com/p/doctype/wiki/ArticlesXSS - The Cross Site Scripting FAQ:
http://www.cgisecurity.com/articles/xss-faq.shtml - OWASP XSS Filter Evasion Cheat
Sheet - CERT Advisory on Malicious HTML Tags:
http://www.cert.org/advisories/CA-2000-02.html - CERT “Understanding Malicious Content Mitigation”
http://www.cert.org/tech_tips/malicious_code_mitigation.html - Understanding the cause and effect of CSS Vulnerabilities:
http://www.technicalinfo.net/papers/CSS.html - XSSed — Cross-Site Scripting (XSS) Information and Mirror Archive of
Vulnerable Websites http://www.xssed.com
Справочная информация
Безопасность в Интернете обеспечивается с помощью многих механизмов, в том числе важной концепцией, известной как правило ограничения домена. Это правило разрешает сценариям, находящимся на страницах одного сайта (недоступная ссылка), доступ к методам и свойствам друг друга без ограничений, но предотвращает доступ к большинству методов и свойств для страниц другого сайта .. Межсайтовый скриптинг использует известные уязвимости в web-приложениях, серверах (или в системных плагинах, относящихся к ним)
Используя одну из них, злоумышленник встраивает вредоносный контент в содержание уже взломанного сайта. В результате пользователь получает объединенный контент в веб-браузере, который был доставлен из надежного источника, и, таким образом, действует в соответствии с разрешениями, предоставленными для этой системы. Сумев внедрить необходимый скрипт в веб-страницу, злоумышленник может получить повышенные привилегии в отношении работы с веб-страницами, cookies и другой информацией, хранящейся в браузере для данного пользователя.
Межсайтовый скриптинг использует известные уязвимости в web-приложениях, серверах (или в системных плагинах, относящихся к ним). Используя одну из них, злоумышленник встраивает вредоносный контент в содержание уже взломанного сайта. В результате пользователь получает объединенный контент в веб-браузере, который был доставлен из надежного источника, и, таким образом, действует в соответствии с разрешениями, предоставленными для этой системы. Сумев внедрить необходимый скрипт в веб-страницу, злоумышленник может получить повышенные привилегии в отношении работы с веб-страницами, cookies и другой информацией, хранящейся в браузере для данного пользователя.
Выражение «межсайтинговый скриптинг» первоначально означало взаимодействие уязвимого веб-приложения с сайтом злоумышленника таким образом, чтобы в контексте атакуемого домена был выполнен JavaScript-код, подготовленный злоумышленником (отражённая или хранимая XSS уязвимость). Постепенно определение стало включать в себя и другие способы внедрения кода, включая использование устойчивых и не относящихся к JavaScript языков (например, ActiveX, Java, VBScript, Flash и даже HTML), создавая путаницу среди новичков в сфере информационной безопасности.
XSS уязвимости зарегистрированы и используются с середины 1990-x годов. Известные сайты, пострадавшие в прошлом, включают такие сайты социальных сетей, как ,
,
MySpace,
YouTube,
и др.
Примечания
- ↑ (недоступная ссылка)
- (англ.). The Open Web Application Security Project (OWASP). Дата обращения 26 декабря 2014.
- , p. 290, 379.
- (англ.). W3C. Дата обращения 18 декабря 2014.
- Grossman, Jeremiah. . (англ.)
- , p. 3.
- Mirkov, Denis. . Хакер (21 сентября 2010). Дата обращения 18 декабря 2014.
- Mirkov, Denis. . Хакер (10 марта 2011). Дата обращения 18 декабря 2014.
- Mirkov, Denis. . Хакер (25 сентября 2006). Дата обращения 18 декабря 2014.
- Mirkov, Denis. . Хакер (23 июля 2008). Дата обращения 18 декабря 2014.
- Mirkov, Denis. . Хакер (26 мая 2008). Дата обращения 18 декабря 2014.
- , p. 128.
- (англ.). Web Application Security Consortium (2005). Дата обращения 18 декабря 2014.
- (англ.). JQuery. Дата обращения 18 декабря 2014.
- (англ.). The Open Web Application Security Project (OWASP). Дата обращения 18 декабря 2014.
- (англ.). AngularJS. Дата обращения 18 декабря 2014.
- ↑ (англ.). The Open Web Application Security Project (OWASP). Дата обращения 18 декабря 2014.
- (англ.). Bugzilla@Mozilla. Дата обращения 18 декабря 2014.
- Boerwinkel, Martijn. (англ.). seclists.org (26 May 2002). Дата обращения 18 декабря 2014.
- Стандартная функция PHP по умолчанию не экранирует апостроф, и в сочетании с кодом получается уязвимость.
- . Веб-разработка. Дата обращения 18 декабря 2014.
- (англ.). Web Hypertext Application Technology Working Group (WHATWG). Дата обращения 18 декабря 2014.
- Например, движок MediaWiki кэширует HTML-код страниц.
- Kochetkov, Vladimir. . SecurityLab (8 августа 2012). Дата обращения 18 декабря 2014.
- . PHP. Дата обращения 18 декабря 2014.
- (англ.). PHP. Дата обращения 18 декабря 2014.
- . The Open Web Application Security Project (OWASP). Дата обращения 18 декабря 2014.
- (англ.). The Open Web Application Security Project (OWASP). Дата обращения 18 декабря 2014.