ВХ06. XSS

Привет, бандиты*! Продолжаем наш многострадальный курс по вебчику. На этот раз мы рассмотрим XSS-атаки (в простонародье - КЫС-КЫС-КЫС). Как и ранее, срывов покровов не будет, только базовая, сжатая инфа.

(* - те, кто идентифицируют себя как бандиты, но еще не решились на активные действия, а также уже осужденные по статье бандитизм, но в первую очередь, конечно, мамкины бандиты)

Что такое XSS?

Аббревиатура XSS расшифровывается как Cross Site Scripting. А как говорит нам лучший переводчик на свете, Cross Site Scripting можно перевести как "крест сайт скриптование" (почти как "гроб кладбище пидор"). Думаю, это вполне себе исчерпывающее объяснение, но пару слов стоит добавить.

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

Примерная схема такая:

Ключевым моментом является тот факт, что атака проводится на клиента, а не на сервер. Обратите на это внимание, чтобы потом не задавать вопросы в духе "Поцоны, есть XSS, как залить шелл?", "Тут html в общем пролазит, как можно порутать?" или "Чо можно сделать с сервером через инклюд JS? Профи тут есть или все ток выебувуются?"

Да, могут быть цепочки уязвимостей, которые начинаются с XSS, а заканчиваются RCE, но сама по себе XSS не может повлиять на сервер. Это атака на клиентов (client side, как говорят в Кембриджах). Ну а SQLi, LFI/RFI - атака на сервер (server side, как говорят в Оксфордах).

Теперь рассмотрим типы XSS-атак.

Типы XSS-атак.

  • Хранимые / Постоянные / Stored / Persistent. Название хорошо отражает суть - единожды внедренная на страницу XSS-ка отрабатывает у каждого клиента, посетившего эту страницу. Простейший пример уязвимого кода:

    Изящная схема, изображенная чуть выше (нет, еще выше), как раз показывает работу хранимых XSS. Огромный плюс подобных XSS в том, что для атаки не нужно взаимодействовать непосредственно с пользователями. Одним словом - БРО.
  • Отраженные / Непостоянные / Reflected / Non-Persistent. XSS отрабатывают возвращая ("отражая") то, что было в запросе. Пример уязвимого кода существенно короче:

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

    То надо еще заморочиться с редиректами. В общем, из-за необходимости куда большего кол-ва телодвижений, данный тип XSS малоюзабелен, хоть и распространен в разы больше, чем хранимые XSS. Сгодится разве что сдать в багбанти. НЕ БРО.
  • DOM-based XSS / основанная на объектной модели документа. Вместо долгих объяснений, проще показать пример уязвимого кода:

    Как мы можем убедиться воочию, тут нет никаких серверных скриптов, всё выполняется непосредственно на клиенте.

    За счет недостаточной фильтрации в Javascript, мы можем влиять на DOM и внедрить уже свой собственный Javascript. Если что-то не ясно (а скорее всего так и есть), в конце статьи будет ссылка на более подробное объяснение.
    Стоит еще добавить, что DOM-based XSS, также делят на хранимые/отраженные, в зависимости от принципа работы.

Также, XSS разделяют по способу взаимодействия с пользователем:

  • Активные XSS. Не требуют от пользователя какого-либо взаимодействия, отрабатывают сразу .
  • Пассивные XSS. Требуют от пользователя какого-то действия - провести мышкой (например XSS срабатывает по событию onmouseover), кликнуть (onclick), отправить форму (onsubmit) и т.д.

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

И еще несколько разновидностей.

  • UXSS. Или Universal (Универсальная) XSS. Это уже бага браузера, а не конкретного приложения. Условно говоря, можно провести XSS-атаку на любом сайте. В отличии от обычных XSS - подобные можно сосчитать по пальцам, да и пальцы уже отрублены (а баги эти запатчены).
  • SelfXSS. Данный тип XSS подразумевает, что вы убедите человека выполнить javascript код у себя в браузере (т.е. - открыть консоль разработчика по F12, вставить код, который предложат и запустить). Это уже скорее атака с помощью социальной инженерии, чем веб-хакинг.
    Не смотря на то, что подобная атака кажется чем-то из ряда вон выходящего (это ведь надо еще найти такого мамонта), тот же фейсбук размещает в консоли подобный текст:

  • mXSS / Mutated XSS. "Мутирующие" XSS основаны на том, что метод innerHtml преобразует данные, которые дают на вход. Например:

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

  • BlindXSS. Слепая XSS, по аналогии со слепыми инъекциями, подразумевает, что мы не увидим, отработала XSS или нет.
    Например, мы отправляем коммент на сайте, а он уходит на модерацию, шлем репорт об ошибке/жалобу/обращение или просто ходим с XSS-вектором в реферере или юзер-агенте.
    В таких ситуациях, хоть и весело использовать в качестве полезной нагрузки:

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

На этом с основными типами XSS покончено.

Контексты, в которых может быть XSS

Вкратце - почти везде.
Пример насквозь уязвимого кода с комментариями:

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

Многообразие возможных контекстов, в совокупности с гибкостью самого JavaScript объясняет, почему тема XSS практически неисчерпаема.

А ведь еще сколько разных фреймворков...

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

Что можно сделать с помощью XSS?

Если вкратце:

  1. Можно выполнить произвольный js-код
  2. Этот код будет выполнен в контексте уязвимого сайта.

Развернутый ответ вряд ли уместится в даже в пару-тройку абзацев. Помимо всем известного alert('мама я нашел xss'), кражи кук и манипулирования контентом (дефейс/фишинг), есть огромное количество других возможностей (например, почитайте возможности фреймворка BEEF).

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

На этом мы и закончим.

Описывать бесконечное кол-во утилит, предназначенных для поиска XSS нет смысла. Не сомневаюсь, что живее всех живых будет Burp Suite. И скорее всего - BEEF. Если работать на объем, то стоит обратить внимание на тулзы заточенные под BlindXSS (el scripto, xss hunter, ezXss), так как гонять сотни тысяч сайтов бурпом вряд ли выйдет.

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

Ссылки

  • https://ru.wikipedia.org/wiki/Межсайтовый_скриптинг
  • https://habr.com/ru/post/149152/
  • https://habr.com/ru/post/189210/ (DOM based XSS)
  • https://habr.com/ru/post/470818/ (Blind XSS)
  • https://hackware.ru/?p=1234 (Контексты XSS)
  • https://portswigger.net/web-security/cross-site-scripting/cheat-sheet (шпаргалка по XSS-векторам)
  • http://html5sec.org/ (коллекция XSS-векторов)
  • http://www.thespanner.co.uk/2014/05/06/mxss/ (mXSS)
  • https://hackinparis.com/data/slides/2013/slidesmarioheiderich.pdf (mXSS)
  • https://research.securitum.com/dompurify-bypass-using-mxss/ (mXSS)
  • https://cure53.de/fp170.pdf (mXSS)
  • https://github.com/0xsobky/HackVault/wiki/Unleashing-an-Ultimate-XSS-Polyglot
  • https://owasp.org/www-community/xss-filter-evasion-cheatsheet