
जूमला एक्सटेंशन PhocaCommander delete, copy, move क्रियाओं में Path Traversal के प्रति संवेदनशील है - CVSS 6.4
PhocaCommander ≤ 6.1.3 — प्रमाणित व्यवस्थापक वेबरूट के बाहर फ़ाइलों में हेरफेर कर सकता है
PhocaCommander में फ़ाइल एक्शन हैंडलर, आक्रमणकारी-नियंत्रित बेस64-एन्कोडेड पैरामीटर (pathfrom, pathwhere) से स्रोत और गंतव्य पथ बनाता है, बिना किसी पाथ कंटेनमेंट सत्यापन के। एक प्रमाणित व्यवस्थापक वेब सर्वर प्रोसेस के लिए सुलभ फ़ाइलसिस्टम में कहीं भी फ़ाइलों को डिलीट, कॉपी और मूव कर सकता है।
प्रयोगशाला में पुष्टि की गई: /tmp/ (वेबरूट के बाहर) पर एक फ़ाइल को डिलीट करना और को PhocaCommander फ़ाइल मैनेजर में कॉपी करना — जिससे इसकी सामग्री बिल्ट-इन एडिटर के माध्यम से पठनीय हो जाती है। तीनों ऑपरेशन (डिलीट, कॉपी, मूव) एक ही असत्यापित कोड पथ साझा करते हैं।
/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 टोकन)
फ़ाइल: administrator/components/com_phocacommander/views/phocacommanderactiona/view.json.php
एक्शन व्यू pathfrom और pathwhere को बेस64 से डिकोड करता है और उन्हें बिना किसी कंटेनमेंट जांच के सीधे JPATH_ROOT के साथ जोड़ देता है। ये असत्यापित पथ फिर तीनों फ़ाइल ऑपरेशन्स में उपयोग किए जाते हैं:
VIEW.JSON.PHP — भेद्य पथ निर्माण
// Both parameters decoded from base64 — no containment check
$pathFrom = JPATH_ROOT . '/' . base64_decode($this->t['pathfrom']) . '/';
$pathWhere = JPATH_ROOT . '/' . base64_decode($this->t['pathwhere']) . '/';
// Delete — removes any file reachable by www-data
$srcValue = $pathFrom . $v;
if (PhocaCommanderHelper::fileExists($srcValue)) {
File::delete($srcValue);
}
// Copy / Move — arbitrary cross-directory file operations
File::copy($pathFrom . $v, $pathWhere . $v);
File::move($pathFrom . $v, $pathWhere . $v);
PhocaCommanderHelper::fileExists() is_file(Path::clean($file)) का उपयोग करता है। Path::clean() स्लैश को सामान्य (normalize) करता है लेकिन ../ अनुक्रमों को नहीं हटाता, इसलिए किसी भी पैरामीटर में ट्रैवर्सल अनुक्रम बिना जांचे मनमाने फ़ाइलसिस्टम पथों पर हल हो जाते हैं।
www-data के स्वामित्व वाली एक परीक्षण फ़ाइल /tmp/poc.txt पर बनाई जाती है, जो डिलीट ऑपरेशन से पहले लक्ष्य के अस्तित्व की पुष्टि करती है।

एडमिन लॉगिन पेज के माध्यम से प्रमाणित करें। Joomla फॉर्म टोकन प्राप्त करें — यह किसी भी एडमिन पेज पर छिपे हुए इनपुट फ़ील्ड के रूप में दिखाई देता है।

डिकोड किए गए पैरामीटर:
pathfrom=Li4vLi4vLi4vdG1w → ../../..tmp → /tmp/selfiles[0]=file|cG9jLnR4dA== → फ़ाइलनाम poc.txtअनुरोध / प्रतिक्रिया


परिदृश्य 1 से एडमिन सत्र का पुन: उपयोग करें या नया CSRF टोकन प्राप्त करने के लिए फिर से प्रमाणित करें।
डिकोड किए गए पैरामीटर:
pathfrom=Li4vLi4vLi4vLi4vZXRj → ../../../../etc → /etc/pathwhere=cGhvY2EtZmlsZXM= → phoca-files → /var/www/html/phoca-files/selfiles[0]=file|cGFzc3dk → फ़ाइलनाम passwdअनुरोध / प्रतिक्रिया

/etc/passwd अब वेबरूट के अंदर phoca-files/passwd पर मौजूद है, जिसका स्वामित्व www-data के पास है।

एडमिन पैनल में PhocaCommander फ़ाइल मैनेजर पर जाएँ, phoca-files/ खोलें, फ़ाइल passwd पर क्लिक करें और फिर बिल्ट-इन CodeMirror एडिटर में इसकी सामग्री देखने के लिए Edit पर क्लिक करें। पूरी /etc/passwd सामग्री प्रदर्शित होती है:

www-data द्वारा लिखने योग्य कोई भी फ़ाइल स्थायी रूप से हटाई जा सकती है, जिसमें अन्य सेवाओं के एप्लिकेशन कॉन्फ़िग, लॉक फ़ाइलें और क्रॉन जॉब शामिल हैं/etc/shadow, निजी कुंजियाँ, अन्य ऐप्स की .env फ़ाइलें) को वेबरूट में कॉपी करने से वे बिना किसी और कार्रवाई के HTTP के माध्यम से सुलभ हो जाती हैं