Давайте разоблачим интересную полезную нагрузку XSS и узнаем о ней! Цель этого поста - помочь вам рассказать о моей методике отладки.

Введение

Однажды я случайно просматривал Twitter и нашел интересную полезную нагрузку XSS:

document.body.innerHTML = eval (‘Error`.stack // # sourceURL = http: // \ u {3c} img / src / onerror = alert (1) \ u {3e} // ')

Если честно, я не помню, кто это опубликовал, может быть, это был @XssPayloads в Твиттере, а может кто-то другой.

Провел быстрый поиск и обнаружил, что кто-то упомянул об этом здесь: https://www.bugbountytips.tech/2021/06/01/xss-payloaddocument-body-innerhtmlevalerror-stack-sourceurlxss-c/

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

Разбивка полезной нагрузки

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

Итак, приступим :)

eval (‘Error``.stack // # sourceURL = http: // \ u {3c} img / src / onerror = alert (1) \ u {3e} // ')

Полезная нагрузка содержит:

Здорово! Итак, мы разделили эту полезную нагрузку и знаем все компоненты в ней. Теперь мы можем лучше его проанализировать!

eval просто выполнит любую полезную нагрузку, которую вы ему предоставите, а это сейчас не интересно. Посмотрим, что внутри него происходит.

Примечание. Вы можете продолжить, открыв окно консоли (нажмите CTRL + Shift + I).

Ошибка '' вызовет функцию Ошибка.

Ошибка '' то же самое, что и Ошибка ()

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

Вернемся к полезной нагрузке:

Итак, мы только что создали новый объект Error и проверили свойство стека этого объекта (которое будет содержать трассировку стека - да, это то же самое, что и трассировки стека, которые вы слышали в Разработка эксплойтов, если вам нравится такая штука!).

Вот соответствующий фрагмент из Документов MDN:

Довольно просто - свойство stack будет отображать трассировку выполнения прямо от самой последней функции, вплоть до самой первой функции, которая ее вызвала. Также указаны номера строк и имена файлов, а также могут быть показаны аргументы (чего не было в Firefox на момент написания этой статьи).

Теперь, когда все это сделано, что, по вашему мнению, произойдет, если я выполню eval для полезной нагрузки?

Обладая такими обширными знаниями, я сначала подумал, что «//» будет комментарием и, следовательно, ничего после этого не должно выполняться! Но когда я запустил эту полезную нагрузку, полезная нагрузка XSS была фактически добавлена ​​к URL-адресу!

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

Итак, теперь раскопайтесь в этом последнем кусочке головоломки и узнайте, почему он работает и что, черт возьми, (или спецификация Javascript;) заставляет его работать ?!

Решение головоломки

Если вы выбросите ошибки и проверите трассировку стека, вы заметите, что она содержит имя файла, в котором произошла ошибка, и если вы используете eval в консоли, вы увидите строку отладчик вместо имени файла:

И для этого я использовал пример из MDN doc for stack:

<!DOCTYPE HTML>
<meta charset="UTF-8">
<title>Stack Trace Example</title>
<body>
<script>
function trace() {
  try {
    throw new Error('myError');
  }
  catch(e) {
    alert(e.stack);
  }
}
function b() {
  trace();
}
function a() {
  b(3, 4, '\n\n', undefined, {});
}
a('first call, firstarg');
</script>

Опять же, я просто добавляю пример здесь для полноты картины.

Между прочим, почему мы обсуждаем это, когда мы были на миссии по демистификации директивы sourceURL? Неужели вы снова отвлеклись !!

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

Поскольку я уже показал вам, что трассировка стека для eval или любого другого приемника, например, Function (), не выдаст вам никаких имен файлов, а просто строку «debugger»!

Теперь представьте, что вы используете eval или Function () внутри своего кода и случайно получаете кучу ошибок из этого же скрипта.

Как бы вы отладили это? Номера строк верны… Умно!

Но видели ли вы сейчас страницы, созданные в Интернете? Большинство, если не все страницы имеют минимизированный Javascript, который либо добавляется вручную, либо в настоящее время из-за эры популярности JS Framework, скомпилированный JS (который минимизирован сборщиком) возвращается в ваши браузеры!

Так что номер строки всегда будет 1, мои умные друзья!

Что теперь? Вы бы сказали, что у вас все еще есть номер столбца, по которому его можно найти.

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

Не стесняйтесь экспериментировать, если вы все еще настроены скептически!

Так что же мне делать? у вас может возникнуть соблазн спросить.

И ответ будет: использовать sourceURL директиву FTW!

С помощью этой директивы вы можете на самом деле назвать скрипты, созданные eval или Function () или любым другим приемником / гаджетом выполнения JS, если на то пошло!

И, таким образом, ваши трассировки стека теперь будут иметь гораздо больше информации, которая будет полезна вам, ребята!

Это будет сделано следующим образом:

eval («… какой-то код… // # sourceURL = some-random-name.js»)

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

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

Поскольку вы уже знаете, что делает директива sourceURL, давайте теперь перейдем к сути этой полезной нагрузки!

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

Демистификация полезной нагрузки

Снова осматриваем полезную нагрузку:

eval (‘Error``.stack // # sourceURL = http: // \ u {3c} img / src / onerror = alert (1) \ u {3e} // ')

Что-то заметили? sourceURL? Правильный! Это не комментарий, а синтаксис для указания директивы sourceURL !!

И это был главный трюк в этой полезной нагрузке :)

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

Если вы запустите полезную нагрузку в консоли, вы увидите следующий вывод:

@, за которым следует URL-адрес, за которым следуют номера строк и столбцов соответственно!

Если вы думаете, как \ u {3c} преобразовался в и как \ u {3e} преобразовался в , ответ - Unicode!

Наберите его в окне консоли (CTRL + Shift + I) и убедитесь в этом сами:

И теперь остается последняя часть - добавление этой полезной нагрузки в DOM с помощью другого приемника - innerHTML!

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

document.body.innerHTML

Итак, эта полезная нагрузка, которая у нас была, войдет в DOM, а затем будет отрисован тег ‹img› из полезной нагрузки. Поскольку источник пуст, обработчик события onerror будет запущен, для которого установлено значение alert (1), и поэтому, как вы уже догадались, произойдет XSS!

Сладко и весело! Полезная нагрузка XSS успешно демистифицирована, ребята :)

Заключительные мысли

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







или это будет какой-нибудь другой домен! Важны сам процесс и образ мышления - разбейте проблему и посмотрите, как работают мельчайшие молекулы, а затем постройте все снизу вверх! Мне он всегда помогал, и я надеюсь, что он мне тоже помогает :)

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

Если вам понравился этот пост, поделитесь им со всеми своими друзьями и коллегами в сообществе информационной безопасности!

Поделитесь своим мнением в комментариях ниже и не стесняйтесь общаться в твиттере: @_SecurityGOAT

Вы также можете отправить любую тему, о которой хотите узнать больше. Дай мне знать в комментариях :)

Наконец, строчка, которая должна быть в основном просто скучной, которую мне приходится каждый раз копировать из моего предыдущего поста !!!! - если вам нравится моя работа и вы хотели бы поддержать меня, подумайте о том, чтобы заглянуть на мою страницу Patreon или вы даже можете Купить мне кофе :)

А также будьте готовы к еще большему количеству забавных постов! В последнее время у меня появилось больше интересных идей, и я планирую расширить их, добавив больше технического контента для ваших мозговых мышц!

Так что помогите мне распространить эти посты, чтобы сделать информационную безопасность более доступной для новичков и более увлекательной для КОЗ;)

Увидимся!
До следующего раза, друг мой, продолжай учиться и желаю тебе счастья.