
نشرة أمنية مفصلة لـ CVE-2026-36669: رفع ملف عشوائي غير مصادق عليه في Feng Office، مما يتيح XSS مخزنة واختطاف الجلسة. تشمل تحليلاً تقنياً وPoC وخطوات التصحيح.
توجد ثغرة رفع ملف تعسفي غير مصادق عليه في ck_upload_handler.php في Feng Office Community Edition (الإصدار 3.11.13.11). تسمح هذه الثغرة للمهاجمين عن بُعد وغير المصادقين برفع ملفات تعسفية (بما في ذلك نصوص .html أو .php ضارة) إلى دليل يمكن الوصول إليه عبر الويب. عند دمج ذلك مع عدم وجود حماية لملفات تعريف الارتباط الإدارية (HttpOnly)، يمكن أن تؤدي هذه الثغرة إلى تخزين نصوص برمجية عبر المواقع (XSS) واختطاف جلسة إدارية.
| المعيار | التفاصيل |
|---|---|
| معرف CVE | CVE-2026-36669 |
| نوع الثغرة | رفع ملف بدون قيود مع نوع خطير (CWE-434) |
| الضعف المرتبط | فقدان المصادقة لوظيفة حرجة (CWE-306) |
| المنتج المتأثر | Feng Office Community Edition |
| الإصدارات المتأثرة | الإصدار 3.11.13.11 (وربما إصدارات أقدم) |
| حالة الاستغلال | تم التحقق من إثبات المفهوم |
| حالة المعالجة | غير مُصحح (تم إخطار البائع، ولم يُقدم تصحيح ضمن نافذة الإفصاح القياسية) |
يعمل نقطة النهاية ck_upload_handler.php كنص منفصل. لا يقوم بتحميل أو وراثة وسيط المصادقة الرئيسي للتطبيق أو قوائم التحكم في الوصول (ACL). وبالتالي، فإن أي طلب خارجي يُرسل مباشرة إلى هذا النص يُعتبر مُصادقًا عليه.
في شفرة المصدر لـ ck_upload_handler.php، تم تعطيل منطق التحقق من الملف على جانب الخادم (الأسطر 21–25) المصمم لتقييد الرفع إلى تنسيقات صور محددة (.jpg, .png, .gif) بشكل صريح باستخدام التعليقات:
// $pattern = "/\.(jpg|png|gif)$/i";
// if (!preg_match($pattern,$_FILES['upload']['name'])) {
// ...
// }
نظرًا لأن هذا القيد القائم على التعبير العادي غير نشط، فإن آلية رفع الملفات تقبل أي امتداد يُقدمه المستخدم.
يستخدم النص دالة copy() في PHP لكتابة الملفات المرفوعة مباشرة إلى دليل /tmp/، والذي تم تكوينه ليكون قابلاً للوصول عبر الويب.
لا يفرض ملف التكوين العام application/config/config.php علامة HttpOnly على ملفات تعريف ارتباط الجلسة. عندما يقوم المهاجم برفع ملف .html يحتوي على كتل نصوص برمجية من جانب العميل، فإن أي مسؤول يعرض الملف سينفذ النص البرمجي في سياق جلسته النشطة. يتيح ذلك للمهاجمين استخراج رموز الجلسة الإدارية النشطة بصمت.
ملاحظة: يُقدم إثبات المفهوم هذا لأغراض تعليمية وتدقيق دفاعي فقط.
للتحقق من الثغرة، أرسل طلب POST متعدد الأجزاء يحتوي على ملف تحقق غير ضار (مثل test.html) إلى نقطة النهاية، مع إضافة معامل CKEditorFuncNum المطلوب:
curl -i -X POST \
-F "[email protected]" \
"http://<target-domain>/ck_upload_handler.php?CKEditorFuncNum=1"
حيث يحتوي test.html على ترميز HTML أساسي لإثبات المفهوم:
<!DOCTYPE html>
<html>
<body>
<script>
alert("Vulnerability Verified: " + document.cookie);
</script>
</body>
</html>
إذا كانت الثغرة موجودة، سيرد الخادم بحالة 200 OK ويخرج كتلة JavaScript تشير إلى مسار الرفع:
<script type="text/javascript">
window.parent.CKEDITOR.tools.callFunction("1", "/tmp/test.html", "");
</script>
إذا كنت تشغل إصدارًا متأثرًا من Feng Office، طبق الإصلاحات اليدوية التالية لتأمين نقطة نهاية رفع الملفات:
تأكد من أن ck_upload_handler.php يتحقق من وجود جلسات إدارية نشطة قبل معالجة أي منطق لرفع الملفات.
قم بإزالة التعليقات وفرض فحص الامتدادات بشكل صارم. ارفض أي عمليات رفع لا تطابق بشكل صريح أنواع MIME للصور غير القابلة للتنفيذ والمتوقعة:
$pattern = "/\.(jpg|jpeg|png|gif)$/i";
if (!preg_match($pattern, $_FILES['upload']['name'])) {
header("HTTP/1.1 403 Forbidden");
exit("Invalid file type.");
}
قم بتعديل تكوين PHP أو تكوين تشغيل التطبيق لضمان عدم إمكانية الوصول إلى ملفات تعريف ارتباط الجلسة عبر واجهات برمجة تطبيقات البرمجة النصية من جانب العميل:
session.cookie_httponly = On
Soufiane LAGZIRI