
PhocaCart के व्यवस्थापक ऑर्डर दृश्य में User-Agent के माध्यम से Stored XSS
PhocaCart ≤ 6.1.7 — बिना प्रमाणीकरण वाला हमलावर Checkout के माध्यम से XSS Payload संग्रहीत करता है। यह एडमिन ब्राउज़र संदर्भ में निष्पादित होता है
जब store_user_agent कॉन्फ़िगरेशन विकल्प सक्षम होता है, तो Joomla के लिए PhocaCart 6.1.7, checkout अनुरोधों से कच्चे HTTP User-Agent हेडर को orders डेटाबेस तालिका में संग्रहीत करता है। संग्रहीत मान को बाद में Adminview.php में itemText() के माध्यम से एडमिनिस्ट्रेटर ऑर्डर संपादन दृश्य में बिना HTML एन्कोडिंग के प्रस्तुत किया जाता है।
एक बिना प्रमाणीकरण वाला हमलावर JavaScript payload युक्त क्राफ्टेड के साथ ऑर्डर दे सकता है। जब कोई एडमिनिस्ट्रेटर बैकएंड में ऑर्डर खोलता है, तो payload एडमिन ब्राउज़र संदर्भ में निष्पादित हो जाता है — जिससे सत्र अपहरण (session hijacking), क्रेडेंशियल चोरी, या अनधिकृत प्रशासनिक कार्य संभव हो जाते हैं।
User-Agentइस भेद्यता के लिए store_user_agent = 1 (गैर-डिफ़ॉल्ट) सक्षम होना आवश्यक है। चूँकि यह विकल्प ब्राउज़र आँकड़े एकत्र करने के लिए एडमिनिस्ट्रेटर का जानबूझकर किया गया चयन है, प्रभावित दुकानें वे हैं जहाँ दुकान स्वामी ने इस सुविधा को सक्षम किया है — जिससे हमलावर के दृष्टिकोण से शोषण पूरी तरह से मूक रहता है।
| घटक | भेद्य | परीक्षण किया गया | समाधान |
|---|---|---|---|
| PhocaCart (com_phocacart) | 5.0.0 – 6.1.7 | Joomla 5.4.7 + PhocaCart 6.1.7 + MariaDB 10.6 | 6.1.8 |
प्रकार: Stored XSS (CWE-79) — एडमिन-लक्षित
प्रमाणीकरण आवश्यक: इंजेक्ट करने के लिए कोई प्रमाणीकरण आवश्यक नहीं। ट्रिगर करने के लिए एडमिनिस्ट्रेटर आवश्यक।
CSRF टोकन आवश्यक: हाँ (checkout के लिए मानक Joomla CSRF टोकन आवश्यक)
फ़ाइल: administrator/components/com_phocacart/libraries/Phoca/Render/Adminview.php:382
जब store_user_agent = 1 होता है, तो PhocacartUtils::getUserAgent() विधि $_SERVER['HTTP_USER_AGENT'] को बिना किसी सैनिटाइज़ेशन के लौटाती है। यह कच्चा स्ट्रिंग #__phocacart_orders में संग्रहीत होता है (200 वर्णों पर छोटा किया गया — XSS रोकने के लिए अपर्याप्त)। जब कोई एडमिनिस्ट्रेटर बैकएंड में ऑर्डर देखता है, तो itemText() बिना htmlspecialchars() को कॉल किए संग्रहीत मान को सीधे HTML प्रतिक्रिया में जोड़ देता है।
डेटा प्रवाह:
Attacker sends checkout request:
User-Agent: <script>alert(document.domain)</script>
utils.php:334 PhocacartUtils::getUserAgent()
└─ return (string) $_SERVER['HTTP_USER_AGENT'] // raw, no sanitization
order.php:413 $d['user_agent'] = substr($user_agent, 0, 200)
└─ INSERT INTO #__phocacart_orders (user_agent) VALUES ('<script>...</script>')
Admin opens order in backend:
edit.php:84 echo $r->itemText($this->itemcommon->user_agent, ...)
Adminview.php:382 '<div class="controls >' . $item . '</div>'
// → NO htmlspecialchars()
→ Browser renders: <div><script>alert(document.domain)</script></div>
→ XSS fires in administrator's browser
ORDER.PHP — संग्रहण चरण (भेद्य स्रोत)
administrator/components/com_phocacart/libraries/phocacart/order/order.php:424
$user_agent = PhocacartUtils::getUserAgent(); // reads $_SERVER['HTTP_USER_AGENT'] raw
$d['user_agent'] = substr($user_agent, 0, 200); // stored in DB unfiltered
ADMINVIEW.PHP:382 — प्रतिपादन चरण (भेद्य सिंक)
// No htmlspecialchars() applied:
$output .= ' <div class="controls ' . $class . '">' . $item . '</div>' . "\n";
administrator/components/com_phocacart/views/phocacartorder/tmpl/edit.php:84 से कॉल किया गया:
echo $r->itemText($this->itemcommon->user_agent, Text::_('COM_PHOCACART_USER_AGENT'), '', 'user_agent');
itemText() फ़ंक्शन $item (संग्रहीत user_agent मान) को बिना किसी एन्कोडिंग के सीधे HTML आउटपुट में पारित करता है, जिससे यह प्राथमिक सिंक बन जाता है। इसे सिंक स्तर पर ठीक करने से itemText() के सभी कॉलर सुरक्षित हो जाते हैं।
हमले के लिए एक दुर्भावनापूर्ण User-Agent हेडर के साथ पूर्ण checkout प्रवाह को पूरा करना आवश्यक है। CSRF टोकन पहले प्राप्त किया जाना चाहिए क्योंकि Joomla का checkout नियंत्रक इसे मान्य करता है।
Joomla एडमिन में, Components → Phoca Cart → Options → Main tab → Statistics Options पर जाएँ। Store User Agent Information = Yes सेट करें और सहेजें।

हमलावर checkout नियंत्रक द्वारा आवश्यक एक मान्य Joomla CSRF टोकन निकालने के लिए दुकान के फ्रंटएंड पर जाता है। टोकन किसी भी दुकान पृष्ठ के HTML स्रोत या JavaScript कॉन्फ़िगरेशन में दिखाई देता है।

हमलावर एक हानिरहित User-Agent का उपयोग करके AJAX checkout एंडपॉइंट के माध्यम से उत्पाद को कार्ट में जोड़ता है। यह checkout सत्र को अगली स्थिति में ले जाता है।

हमलावर checkout स्टेट मशीन को आगे बढ़ाने के लिए बिलिंग जानकारी जमा करता है।

हमलावर भुगतान के लिए आगे बढ़ने हेतु एक शिपिंग विधि चुनता है।

हमलावर एक भुगतान विधि चुनता है (उदा., Cash on Delivery)।

महत्वपूर्ण इंजेक्शन चरण। हमलावर User-Agent हेडर को XSS payload पर सेट करके task=checkout.order के माध्यम से अंतिम ऑर्डर देता है। checkout.order कार्य कच्चे HTTP_USER_AGENT मान को पढ़ता है और इसे #__phocacart_orders.user_agent में बिना एस्केप किए संग्रहीत करता है।
POST /index.php/shop/checkout HTTP/1.1
Host: TARGET
User-Agent: <script>alert(document.domain)</script>
Content-Type: application/x-www-form-urlencoded
phcheckouttac=1&task=checkout.order&option=com_phocacart&return=&<CSRF_TOKEN>=1
परिणाम: ऑर्डर बन गया। डेटाबेस user_agent = '<script>alert(document.domain)</script>' संग्रहीत करता है।

एडमिनिस्ट्रेटर Components → Phoca Cart → Orders पर जाता है। इंजेक्ट किया गया ऑर्डर सूची में दिखाई देता है। इस चरण में XSS अभी तक ट्रिगर नहीं होता है।

जब एडमिनिस्ट्रेटर संपादन दृश्य खोलने के लिए ऑर्डर पर क्लिक करता है, तो संग्रहीत user_agent को itemText() के माध्यम से बिना एस्केप किए प्रस्तुत किया जाता है। JavaScript तुरंत निष्पादित हो जाता है।
ट्रिगर URL:
/administrator/index.php?option=com_phocacart&view=phocacartorder&layout=edit&id=<ORDER_ID>
