
Joomla एक्सटेंशन PhocaCommander, getSource फ़ंक्शन में Path Traversal के प्रति संवेदनशील है।
PhocaCommander ≤ 6.1.3 — प्रमाणित एडमिन पाथ ट्रैवर्सल, कोई CSRF आवश्यक नहीं
PhocaCommander के फ़ाइल संपादक एंडपॉइंट में एक मनमाना फ़ाइल पठन भेद्यता मौजूद है। getSource() फ़ंक्शन base64-एन्कोडेड filename पैरामीटर को डिकोड करता है और उसे बिना किसी पाथ कंटेनमेंट जाँच के सीधे file_get_contents() को भेजता है। एक प्रमाणित व्यवस्थापक केवल GET अनुरोध भेजकर वेब सर्वर प्रक्रिया के लिए सुलभ किसी भी फ़ाइल को पढ़ सकता है - जिसमें वेबरूट के बाहर की फ़ाइलें भी शामिल हैं। कोई CSRF टोकन आवश्यक नहीं है।
इसका दोहन Joomla के डेटाबेस क्रेडेंशियल और configuration.php से गुप्त कुंजी (secret key) लीक कर देता है, और पाथ ट्रैवर्सल अनुक्रमों (जैसे ../../../../etc/passwd) के माध्यम से /etc/passwd जैसी सिस्टम फ़ाइलें पढ़ सकता है।
| घटक | असुरक्षित | परीक्षण किया गया | सुधारा गया |
|---|---|---|---|
| PhocaCommander | 1.0.0 – 6.1.3 | Joomla 5.4.7 + PhocaCommander 6.1.3 (PHP 8.2 / Apache) | 6.1.4 |
प्रमाणीकरण आवश्यक: व्यवस्थापक सत्र (कोई CSRF टोकन आवश्यक नहीं - GET अनुरोध)
फ़ाइल: administrator/components/com_phocacommander/models/phocacommanderedit.php
getSource() filename को base64 से डिकोड करता है और उसे सीधे JPATH_ROOT के साथ जोड़ता है, फिर बिना किसी कंटेनमेंट जाँच के फ़ाइल पढ़ता है:
PHOCACOMMANDEREDIT.PHP — असुरक्षित कोड
public function getSource($fileName) {
$fileName = base64_decode($fileName); // ← attacker-controlled
$item = new stdClass;
if (PhocaCommanderHelper::fileExists(JPATH_ROOT . '/' . $fileName)) {
$item->source = file_get_contents(JPATH_ROOT . '/' . $fileName); // ← no containment check
}
return $item;
}
fileExists() is_file(Path::clean($file)) का उपयोग करता है। Path::clean() स्लैश को सामान्य करता है लेकिन ../ अनुक्रमों को हटाता नहीं है, इसलिए ट्रैवर्सल बिना किसी जाँच के वेबरूट से बाहर निकल जाते हैं।
कोडबेस में helpers/phocacommander.php में getContainedRealPath() शामिल है जो उचित realpath()-आधारित कंटेनमेंट करता है। इसे save() और download() द्वारा कॉल किया जाता है, लेकिन इसे getSource() में कभी नहीं जोड़ा गया। इसके अलावा, कंट्रोलर की edit() विधि GET के माध्यम से dispatch होती है, इसलिए मानक CSRF टोकन जाँचें लागू नहीं होतीं — मनमाना फ़ाइल पठन ट्रिगर करने के लिए एक सक्रिय एडमिन सत्र कुकी पर्याप्त है।
एक वैध सत्र कुकी प्राप्त करने के लिए एडमिन लॉगिन पेज के माध्यम से प्रमाणित करें। मानक एडमिन सत्र के अलावा किसी अतिरिक्त विशेषाधिकार की आवश्यकता नहीं है।
base64-एन्कोडेड ट्रैवर्सल पथ के साथ निम्नलिखित GET अनुरोध भेजें:
GET /administrator/index.php?option=com_phocacommander&task=phocacommanderedit.edit&filename=Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA==
Cookie: [admin session]
filename डिकोड: Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA== → ../../../../etc/passwd
हल किया गया पथ: /var/www/html/../../../../etc/passwd = /etc/passwd
एडिटर /etc/passwd की पूरी सामग्री प्रस्तुत करता है, जो वेबरूट के बाहर पढ़ने की पहुँच की पुष्टि करता है।
अनुरोध / प्रतिक्रिया

सिस्टम फ़ाइल प्रकटीकरण — SSH कुंजियाँ और सह-होस्टेड एप्लिकेशनों की कॉन्फ़िग फ़ाइलें सभी सुलभ हैं (यदि वेब सर्वर प्रक्रिया द्वारा पठनीय हों)
कोई इंटरैक्शन आवश्यक नहीं — हमला एक एकल GET अनुरोध है, कोई CSRF टोकन नहीं, कोई फ़ॉर्म सबमिशन नहीं, पीड़ित की कोई इंटरैक्शन आवश्यक नहीं
विशेषाधिकार वृद्धि श्रृंखला — लीक हुई गुप्त कुंजी ऑफ़लाइन Joomla टोकन जालसाज़ी सक्षम बनाती है, जिससे लक्ष्य साइट के विरुद्ध और अधिक हमला सतह खुलती है