
امتداد Joomla PhocaCommander معرّض لثغرة اجتياز المسار في عمليات الحذف والنسخ والنقل - CVSS 6.4
PhocaCommander ≤ 6.1.3 — مدير مصادق يعبث بالملفات خارج جذر الويب
يقوم معالج إجراءات الملفات في PhocaCommander ببناء مسارات المصدر والوجهة من معاملات مُرمّزة بـ base64 يتحكم بها المهاجم (pathfrom, pathwhere) دون أي تحقق من احتواء المسار. يمكن لمدير مصادق حذف الملفات ونسخها ونقلها في أي مكان على نظام الملفات يمكن الوصول إليه من عملية خادم الويب.
تم التأكيد في المختبر: حذف ملف في /tmp/ (خارج جذر الويب) ونسخ /etc/passwd إلى مدير ملفات PhocaCommander — مما يجعل محتواه قابلاً للقراءة عبر المحرر المدمج. جميع العمليات الثلاث (حذف، نسخ، نقل) تشترك في نفس مسار الكود غير المُتحقق منه.
| COMPONENT | VULNERABLE | TESTED ON | FIXED |
|---|---|---|---|
| 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 من base64 ويدمجهما مباشرة مع 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() على توحيد الشرطات المائلة ولكنها لا تزيل تسلسلات ../، لذا فإن تسلسلات الاجتياز في أي من المعاملين تُحل إلى مسارات نظام ملفات عشوائية دون فحص.
يتم إنشاء ملف اختبار في /tmp/poc.txt مملوك لمستخدم www-data، لتأكيد وجود الهدف قبل عملية الحذف.

قم بالمصادقة عبر صفحة تسجيل دخول المسؤول. استرجع رمز نموذج 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 المدمج. يتم عرض محتوى /etc/passwd الكامل:

www-data خارج جذر الويب بشكل دائم، بما في ذلك إعدادات التطبيقات وملفات القفل ومهام cron للخدمات الأخرى/etc/shadow، المفاتيح الخاصة، ملفات .env للتطبيقات الأخرى) إلى جذر الويب يجعلها قابلة للوصول عبر HTTP دون أي إجراء إضافي