
IDOR بعد المصادقة / كسر التحكم في الوصول في إضافة Tutor LMS
إخلاء مسؤولية: تم إنشاء هذا المستودع لأغراض تعليمية وللكشف الأخلاقي فقط. تم الإبلاغ عن الثغرة بشكل مسؤول إلى البائع وتم إصلاحها. لا تستخدم هذه المعلومات لاستغلال الأنظمة دون إذن مناسب.
تم اكتشاف ثغرة الإحالة المباشرة غير الآمنة للكائنات (IDOR) / كسر التحكم في الوصول في إضافة Tutor LMS الخاصة بووردبريس (الإصدارات <= 3.9.5). يسمح هذا العيب لمستخدم منخفض الامتيازات يملك دور Tutor Instructor بتنفيذ إجراءات جماعية غير مصرح بها، مثل تغيير حالة النشر أو حذف الدورات التدريبية المملوكة لمدرّسين أو مدراء آخرين بشكل دائم.
من خلال اعتراض طلب خلفي شرعي والتلاعب بمعامل معرف الدورة، يمكن للمهاجم تجاوز ضوابط الوصول المقصودة. في سيناريو واقعي، يسمح ذلك للجهات الخبيثة بتخريب دورات المنافسين على سوق متعدد المدرّسين، مما يسبب تعطيلًا مباشرًا للأعمال، وفقدان الإيرادات، وضررًا بالسمعة.
<= 3.9.53.9.6يعود السبب الجذري إلى غياب فحوصات التفويض على مستوى الكائن داخل معالج الإجراءات الجماعية في الإضافة.
الملف: tutor/classes/Course_List.php
الدالة: course_list_bulk_action()
1. معرفات الكائنات غير المُتحقق منها:
تقبل الدالة مدخلات يتحكم بها المستخدم (bulk-action و bulk-ids) مباشرة من طلب HTTP. بينما تتحقق الإضافة من أن المستخدم يمتلك صلاحية عامة لإدارة الدورات التدريبية، فإنها تفشل تمامًا في التحقق من ملكية كل دورة على حدة للمعرفات المحددة المقدمة في مصفوفة bulk-ids.
2. التنفيذ دون التحقق من الملكية:
عند تشغيل مسار تحديث الحالة (update_course_status()) أو مسار الحذف (bulk_delete_course())، يتكرر الكود على المعرفات المقدمة من المهاجم. وينفذ عمليات قاعدة بيانات (مثل تحديث cp_posts.post_status) باستخدام عبارة WHERE ID IN (...) دون إضافة شرط لضمان $post_author == $current_user_id.
نظرًا لأن المعالج لا يفرض تفويضًا على مستوى الكائن، يمكن لأي مدرّس لديه حق الوصول إلى سير عمل الإجراءات الجماعية التلاعب بأي معرفات دورات تعسفية.
توضح الخطوات التالية كيف يمكن لمستخدم مصادق عليه بدور Tutor Instructor تغيير حالة دورة تدريبية تخص مدرّسًا آخر.
course_id الهدف الذي يخص مدرّسًا آخر (الضحية). (مثال: المعرف: 27)./wp-admin/admin.php?page=tutor). اختر أي دورة تملكها، وحدد إجراء تغيير الحالة (على سبيل المثال، تعيينها على "مسودة")، ثم انقر فوق "تطبيق".POST الصادر إلى /wp-admin/admin-ajax.php.status إلى trash (أو pending أو private).id من معرف الدورة الخاص بك إلى معرف دورة الضحية (27).{"success":true}. يتم نقل دورة الضحية إلى المهملات بنجاح وتختفي من الواجهة الأمامية العامة.