
رفع ملف تعسفي غير مصادق عليه في إضافة EventPrime
إخلاء مسؤولية: تم إنشاء هذا المستودع لأغراض تعليمية والإفصاح الأخلاقي فقط. تم الإبلاغ عن الثغرة بشكل مسؤول إلى البائع وتم تصحيحها. لا تستخدم هذه المعلومات لاستغلال الأنظمة دون إذن مناسب.
تم اكتشاف ثغرة رفع ملفات عشوائية غير موثقة في إضافة EventPrime لووردبريس (الإصدارات <= 4.2.8.1). يسمح هذا الخلل لأي زائر غير موثق برفع الملفات مباشرة إلى دليل uploads الخاص بووردبريس وإنشاء سجلات مرفقات في مكتبة الوسائط.
توجد الثغرة لأن نقطة نهاية AJAX محددة تم تسجيلها صراحةً مع nopriv (قابلة للوصول العام) وتفتقر إلى كل من فحوصات التفويض والتحقق السليم من محتوى الملف. يمكن للمهاجمين إساءة استخدام نقطة النهاية هذه لاستنزاف التخزين، أو إغراق مكتبة الوسائط، أو ربما تحميل حمولات ضارة متنكرة في شكل صور.
<= 4.2.8.1السبب الجذري هو مزيج من تسجيل هوك AJAX غير آمن والتحقق غير الكافي من الملف.
1. تسجيل نقطة نهاية AJAX غير آمنة:
في includes/class-eventprime-event-calendar-management.php، تسجل الإضافة إجراء upload_file_media. حول السطر 557، تقوم بتعيين {upload_file_media: true} في خريطة الإجراءات الخاصة بها، حيث يشير true إلى دعم _nopriv. وبالتالي، يتم تسجيل هوك wp_ajax_nopriv_ep_upload_file_media، مما يجعل نقطة النهاية متاحة للجميع.
2. عدم وجود فحوصات التفويض و nonce:
لا تستخدم دالة المعالج upload_file_media() (في includes/class-ep-ajax.php، الأسطر 1659-1697) current_user_can() للتحقق من صلاحيات الرفع، ولا تتحقق من nonce أمني.
3. منطق تحقق معيب:
يقوم المعالج فقط بالتحقق من امتداد الملف (مثل jpg/jpeg/png/gif) بناءً على اسم الملف المقدم من العميل (الأسطر 1661-1664). لا يقوم بتحقق قوي من محتوى الملف على جانب الخادم (مثل getimagesize() أو wp_check_filetype_and_ext()). وهذا يعني أن البرامج النصية الضارة أو أنواع الملفات الأخرى المعاد تسميتها إلى harmless.jpg سيتم كتابتها على القرص قبل أن يحاول ووردبريس توليد البيانات الوصفية.
4. الثبات:
يتم حفظ الملف باستخدام move_uploaded_file() مباشرة في wp_upload_dir()['path'] ويتم إنشاء مرفق ووردبريس عبر wp_insert_attachment().
الصور)، قد يؤدي ذلك إلى تنفيذ تعليمات برمجية عن بُعد (RCE).1. إعداد الحمولة: قم بإنشاء ملف صورة نموذجي على جهازك المحلي باسم poc.jpg.
2. تنفيذ الطلب: أرسل طلب POST متعدد الأجزاء/نموذج البيانات إلى نقطة نهاية AJAX العامة دون أي ملفات تعريف ارتباط جلسة:
curl -i \
-F "[email protected];filename=poc.jpg" \
"http://TARGET_SITE/wp-admin/admin-ajax.php?action=ep_upload_file_media"
3. مراقبة الاستجابة: سيرد الخادم برمز 200 OK ويعيد كائن JSON يحتوي على معرف المرفق الذي تم إنشاؤه حديثًا:
{"success":true,"data":{"attachment_id":117}}
4. التحقق:
wp-content/uploads/<year>/<month>/poc.jpg.لحل هذه الثغرة، يجب على المطورين القيام بما يلي:
nopriv إذا كان الرفع مخصصًا للمستخدمين الموثوقين فقط حسب التصميم.current_user_can('upload_files') لضمان أن المستخدمين المصرح لهم فقط هم من يمكنهم الرفع.check_ajax_referer() لمنع هجمات تزوير الطلبات عبر المواقع (CSRF).wp_handle_upload()) التي تقوم بإجراء فحوصات أكثر صرامة لنوع MIME والمحتوى.