
امتداد Joomla PhocaCommander معرّض لثغرة اجتياز المسار في إجراء رفع الملفات - CVSS 6.1
PhocaCommander ≤ 6.1.3 — إمكانية قيام مدير مُصادَق بكتابة ملفات خارج المجلد الجذر للويب
يقوم معالج رفع الملفات في PhocaCommander ببناء مسار الوجهة من معامل folder مُرمَّز بـ base64 يتحكم فيه المهاجم دون أي تحقق من احتواء المسار. يمكن للمدير المُصادَق رفع ملفات إلى مواقع عشوائية خارج المجلد الجذر للويب، شريطة أن تكون تلك المواقع قابلة للكتابة من قِبل عملية خادم الويب.
تأكَّد ذلك في المختبر: رفع ملف باستخدام folder=Li4vLi4vLi4vdG1w (أي ../../../tmp) يضع الملف المرفوع في /tmp/ — خارج /var/www/html/ — ويكون الملف مملوكًا للمستخدم www-data. في بيئات PHP-FPM الإنتاجية، يمكن استغلال ذلك بالتسلسل لتحقيق تنفيذ برمجي عن بُعد (RCE).
| المكوّن | الإصدارات المعرّضة | اختُبر على | الإصدار المُصحَّح |
|---|---|---|---|
| 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/helpers/fileupload.php — realMultipleUpload()
يقوم realMultipleUpload() بفك ترميز معامل folder المرسل عبر POST من base64 ويمرّره مباشرة إلى دمج في Path::clean()، والذي يُستخدم بعد ذلك كوجهة للرفع دون أي فحص احتواء.
FILEUPLOAD.PHP — الكود المعرّض للثغرة
$folder = $app->getInput()->get('folder', '', '', 'string');
$folder = base64_decode($folder); // ← attacker-controlled
$path = JPATH_ROOT; // = /var/www/html
if (isset($folder) && $folder != '') {
$pathFolder = Path::clean($path . '/' . $folder . '/');
// e.g. Path::clean('/var/www/html/../../../tmp/')
// = '/tmp/' — outside the webroot, no error thrown
}
// ...
File::upload($file['tmp_name'], $pathFolder . strtolower($file['name']));
يعمل Path::clean() على توحيد فواصل الدلائل ولكنه لا يحلّ أو يزيل تسلسلات ../. يُمرَّر المسار المُستنتَج مباشرة إلى File::upload() دون أي فحص حدود لاحق.
القائمة البيضاء لامتدادات الرفع
يفرض المعالج قائمة بيضاء للامتدادات (صور، مستندات، ملفات مضغوطة، ملفات نصية) ويمنع الأنواع القابلة للتنفيذ على الخادم مثل .php و.htaccess. ومع ذلك، فإن العديد من أنواع الملفات المسموح بها في القائمة البيضاء — بما في ذلك سكربتات الصدفة وتعريفات مهام cron وأجزاء ملفات الإعداد — يمكن أن تسبب ضررًا كبيرًا عند كتابتها في مسارات حساسة في نظام التشغيل.
سجّل الدخول عبر صفحة دخول المدير. احصل على رمز CSRF الخاص بـ Joomla من أي صفحة إدارة — يظهر كحقل مخفي في النموذج أو يمكن استخراجه من مصدر الصفحة.

أرسل طلب POST متعدد الأجزاء إلى POST /administrator/index.php?option=com_phocacommander&task=phocacommanderupload.multipleupload مع محتوى الملف في الحقل file ومسار الاجتياز المُرمَّز بـ base64 Li4vLi4vLi4vdG1w (أي ../../../tmp) في الحقل folder. يستجيب الخادم بـ HTTP 200 و{"jsonrpc":"2.0","result":"OK","code":200,"message":"Success: ","details":"Files uploaded"}.
الطلب / الاستجابة

تأكَّد وجود الملف في /tmp/upload_test.txt، مملوكًا للمستخدم www-data، خارج /var/www/html/.

www-data أن يستقبل محتوى يختاره المهاجم، بما في ذلك المسارات التي يستخدمها مُجدوِل نظام التشغيل وخفيض SSH والخدمات الأخرى..txt يحتوي كود PHP مقترنًا بملف .user.ini (auto_prepend_file) إلى دليل يمكن الوصول إليه عبر الويب يؤدي إلى تنفيذ PHP عند الطلب التالي لذلك الدليل.