
JoomGallery में Broken Object-Level Authorization के माध्यम से IDOR + Stored XSS
JoomGallery ≤ 4.3.0 — एडिटर-रोल उपयोगकर्ता किसी भी गैलरी छवि को हाईजैक करता है और XSS पेलोड संग्रहीत करता है, जिससे एडमिन सत्र अपहरण सक्षम होता है
JoomGallery में UserimageController::save() checkACL('edit.own', ...) के बजाय checkACL('edit', ...) की जाँच करता है। एक एडिटर-रोल उपयोगकर्ता स्वामित्व की परवाह किए बिना किसी भी छवि के लिए task=userimage.save&id=N पर POST कर सकता है (IDOR — CWE-639)। चूँकि एडिटर-रोल के पास वैश्विक रूप से core.edit होता है, साइट पर हर छवि ID के लिए प्राधिकरण जाँच सफल हो जाती है, जिसमें एडमिनिस्ट्रेटरों के स्वामित्व वाली छवियाँ भी शामिल हैं।
फ्रंटएंड इमेज टेम्पलेट में $this->escape() कॉल की कमी के साथ, एक एडिटर किसी भी छवि शीर्षक में XSS पेलोड संग्रहीत कर सकता है — जिसमें एडमिन-स्वामित्व वाली छवियाँ भी शामिल हैं — जिससे हर आगंतुक के ब्राउज़र में JavaScript निष्पादित होती है। यह पूर्ण एडमिन सत्र अपहरण और पूरी साइट से समझौता सक्षम करता है।
| कॉम्पोनेंट | असुरक्षित संस्करण | परीक्षण किया गया | हल संस्करण |
|---|---|---|---|
| JoomGallery (com_joomgallery) | 4.0.0 – 4.3.0 | Joomla 5.4.7 + JoomGallery 4.3.0-stable (PHP 8.2 / Apache) | 4.4.0 |
प्रकार: टूटा हुआ ऑब्जेक्ट-स्तर प्राधिकरण / IDOR (CWE-639) जो संग्रहीत क्रॉस-साइट स्क्रिप्टिंग (CWE-79) के साथ जुड़ा हुआ है आवश्यक प्रमाणीकरण: निम्न-विशेषाधिकार वाला एडिटर खाता
फ़ाइल: components/com_joomgallery/src/Controller/UserimageController.php
save() क्रिया edit.own के बजाय edit अनुमति का उपयोग करके ACL जाँच करती है। edit अनुमति सभी एडिटर-रोल उपयोगकर्ताओं को वैश्विक रूप से दी जाती है, इसलिए जाँच किसी भी छवि ID के लिए सफल हो जाती है, चाहे उसे किसी ने भी बनाया हो।
USERIMAGECONTROLLER.PHP — असुरक्षित कोड (लाइन 145)
// Vulnerable
if (!$this->checkACL('edit', 'image', $recordId, $parent_id, true)) { ... }
चूँकि core.edit एडिटर समूह के पास वैश्विक रूप से होता है, हर छवि ID के लिए शर्त false मूल्यांकित होती है, जिससे असीमित लेखन पहुँच मिलती है। सफल सहेजने पर, मॉडल अतिरिक्त रूप से created_by को हमलावर के उपयोगकर्ता ID में अपडेट कर देता है, जिससे छवि का स्वामित्व चुपचाप हमलावर को स्थानांतरित हो जाता है।
फ़ाइल: components/com_joomgallery/tmpl/image/default.php
फ्रंटएंड इमेज टेम्पलेट $this->item->title को alt एट्रिब्यूट संदर्भ में HTML-एन्कोडिंग किए बिना प्रतिध्वनित (echo) करता है। जूमला का JInput STRING फ़िल्टर दोहरे-उद्धरण वर्णों को नहीं हटाता है, इसलिए " युक्त पेलोड एट्रिब्यूट से बाहर निकलकर मनमाने ईवेंट हैंडलर इंजेक्ट कर देता है।
DEFAULT.PHP — असुरक्षित कोड (लाइन 64, 78)
// Vulnerable
item->title; ?>" ...>
पेलोड abc" onmouseover="alert(document.domain);" x=" को jos_joomgallery.title में संग्रहीत किया जाता है और हर पेज रेंडर पर HTML एट्रिब्यूट में कच्चा (raw) इंजेक्ट किया जाता है। स्टोरेज या डिस्प्ले लेयर पर कोई सैनिटाइज़ेशन नहीं किया जाता।
jform[title] में task=userimage.save&id=3 पर POST करता है। ACL जाँच सफल होती है (core.edit, न कि edit.own)। सर्वर HTTP 303 — न कि 403 — लौटाता है।created_by हमलावर के उपयोगकर्ता ID पर स्थानांतरित हो जाता है।jos_joomgallery.title में बिना एस्केप किए संग्रहीत होता है।alt="abc" onmouseover="alert(document.domain);" रेंडर करता है। XSS ट्रिगर होता है। एडमिन सत्र कैप्चर हो जाता है → पूरी साइट से समझौता।एडमिन JoomGallery बैकएंड (Joomla 5.4.7) के माध्यम से admin_image बनाता है। छवि प्रकाशित, अनुमोदित है, और इसका स्वामित्व एडमिनिस्ट्रेटर के पास है।

GET /index.php/component/users/login — प्रतिक्रिया JSON में "csrf.token":"a68c2b3a..." होता है। टोकन बाद के लॉगिन POST के लिए कैप्चर किया जाता है।

joomla_user_state=logged_inPOST /index.php/component/users/login CSRF टोकन और एडिटर क्रेडेंशियल के साथ। प्रतिक्रिया: HTTP 303 और Set-Cookie: joomla_user_state=logged_in। सत्र कुकी कैप्चर की गई।

GET /index.php?option=com_joomgallery सत्र कुकी के साथ। प्रतिक्रिया में सहेजने के अनुरोध के लिए एक नया "csrf.token":"2d96934b..." होता है।

एडिटर निम्न के साथ option=com_joomgallery&task=userimage.save&id=3 पर POST करता है, जिसमें jform[title] सेट है:
abc" onmouseover="alert(document.domain);" x="
सर्वर HTTP 303 (न कि 403) लौटाता है, जो IDOR की पुष्टि करता है। Location हेडर रीडायरेक्ट URL में XSS पेलोड दिखाता है, जिससे पुष्टि होती है कि शीर्षक स्वीकार कर सहेज लिया गया था।

JoomGallery बैकएंड दिखाता है कि छवि ID=3 का स्वामी अब Editor User है। अनधिकृत सहेजने के दौरान डेटाबेस में created_by फ़ील्ड चुपचाप अपडेट कर दी गई थी।

jos_joomgallery पर SQL क्वेरी पुष्टि करती है कि XSS पेलोड संग्रहीत है — " को " के रूप में नहीं, बल्कि कच्चे दोहरे-उद्धरण के रूप में संग्रहीत किया गया है। स्टोरेज लेयर पर कोई सैनिटाइज़ेशन नहीं हुआ।

/index.php/component/joomgallery/gallery पर जाने वाला कोई भी उपयोगकर्ता पेलोड को ट्रिगर करता है। ब्राउज़र का alert() डायलॉग पीड़ित के मूल (origin) में JavaScript निष्पादन की पुष्टि करता है (document.domain)।

created_by को हमलावर को पुनः सौंप देता है, जिससे ऑडिट ट्रेल स्थायी रूप से बदल जाता है।alt एट्रिब्यूट में एक दुर्भावनापूर्ण स्क्रिप्ट एडमिनिस्ट्रेटर के सत्र कुकी को बाहर निकाल सकती है, जिससे हमलावर को पूर्ण बैकएंड पहुँच और पूरे Joomla इंस्टॉलेशन पर नियंत्रण मिल जाता है।S:C) में निष्पादित होता है, जो हमलावर के निम्न-विशेषाधिकार सत्र और पीड़ित के उच्च-विशेषाधिकार सत्र के बीच की विश्वास सीमा को पार कर जाता है।