
CVE-2026-63030
إثبات المفهوم لثغرة حقن SQL غير موثّقة في نواة ووردبريس تؤدي إلى تنفيذ أوامر عن بُعد، عبر خلط في مسارات دفعة REST (CVE-2026-63030).
لا يحتاج الاستغلال إلى بيانات اعتماد أو أي إعدادات تتجاوز الوصول إلى الهدف. يصل إلى الحقن من خلال نقطة نهاية واحدة: POST /wp-json/batch/v1.
الاكتشاف نفسه هو أن حقن SQL غير موثّق — يؤكّده الأمر check ويُظهر الأمر read قراءة قاعدة بيانات عشوائية. الأمر shell هو اختياري بعد الاستغلال (استعادة بيانات اعتماد المسؤول ← رفع إضافة ← تنفيذ أوامر)، أُدرج لإظهار التأثير الكامل؛ وهو ليس الثغرة بحد ذاتها.
| الفرع | المتأثر | الإصلاح في |
|---|---|---|
| 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.9.0 غير متأثرة بهذه السلسلة.
نقطة نهاية الدفعة REST (/batch/v1) غير موثّقة وتنفذ عدة طلبات فرعية في استدعاء واحد، معتمدة على أن كل طلب فرعي يتم التحقق منه والتحقق من أذوناته بشكل مستقل.
تقوم serve_batch_request_v1() ببناء مصفوفتين متوازيتين — $matches (المعالج المطابق لكل طلب فرعي) و$validation (نتيجة التحقق لكل طلب فرعي) — ثم تفهرس كلتيهما بنفس الإزاحة عند الإرسال. الطلب الفرعي الذي يفشل مساره في wp_parse_url() يُضاف إلى $validation ولكن ليس إلى $matches، مما يؤدي إلى انحراف المصفوفتين وإرسال طلب فرعي تحت معالج مختلف لذلك الطلب الفرعي. هذا هو الخلط في المسار.
يُدرج إثبات المفهوم الأساس مرتين:
POST /wp/v2/posts يحمل نص requests يُرسل تحت معالج الدفعة نفسه. بعد أن تم التحقق منه كطلب منشورات، لا يتم أبدًا فحص قائمة requests الخاصة به مقابل مخطط الدفعة، لذا يمكن لطلباته الفرعية استخدام GET — يتم تجاوز قائمة الأساليب المسموح بها.GET /wp/v2/users يحمل سلسلة author_exclude (لا يحتوي مخطط المستخدمين على مثل هذه المعلمة، لذا تمر القيمة دون تغيير بعد التحقق) يُرسل تحت get_items() الخاص بالمنشورات. هناك، يتم تعيين author_exclude إلى متغير استعلام author__not_in الخاص بـ WP_Query، والذي يُدرج النسخة الضعيفة في SQL كسلسلة نصية.النتيجة هي حقن SQL أعمى قائم على القيمة المنطقية والزمن يمكن الوصول إليه قبل المصادقة. مع الوصول إلى قراءة قاعدة البيانات، يمكن استرجاع تجزئة كلمة مرور المسؤول؛ بعد كسرها، يمنح الوصول كمسؤول تنفيذ أوامر عبر رفع إضافة.
بايثون 3.8+ والمكتبة القياسية. لا تبعيات خارجية.
شغّله من مجلد المستودع:
./wp2shell.py <command> <url> [options]
أو pip install . للحصول على أمر wp2shell في مسار PATH الخاص بك.
يؤكد قابلية الاستغلال بفارق زمني تفاضلي. لا يقرأ أي بيانات ولا يغير شيئًا.
./wp2shell.py check http://target
./wp2shell.py read http://target # بصمة الخادم
./wp2shell.py read http://target --preset users # أسماء المستخدمين وتجزئات كلمات المرور
./wp2shell.py read http://target --query "SELECT @@version"
استغلال اختياري بعد الاختراق. يتطلب بيانات اعتماد مسؤول صالحة؛ يسترجع الحقن تجزئة كلمة المرور، لذا قدّم النص الواضح المسترجع هنا.
./wp2shell.py shell http://target --user admin --password '<recovered>' --cmd id
./wp2shell.py shell http://target --user admin --password '<recovered>' -i # واجهة تفاعلية
يقوم shell برفع إضافة webshell (مقفلة خلف مسار عشوائي ورمز جلسة لكل تشغيل) ويطبع مسارها. قم بإزالتها عند الانتهاء.
قم بالتحديث إلى ووردبريس 6.9.5 أو 7.0.2. لحين ذلك، احجب كلاً من /wp-json/batch/v1 ومعامل الاستعلام rest_route=/batch/v1 عند الحافة، أو اشترط المصادقة على نقطة نهاية الدفعة عبر مرشح rest_pre_dispatch.
لأغراض اختبار الأمن المصرح به فقط. استخدمه حصريًا ضد الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام.
| الخيار | ينطبق على | الوصف |
|---|
--rest-route | الكل | استخدم /?rest_route=/batch/v1 (للمواقع بدون روابط دائمة جميلة). |
--proxy URL | الكل | توجيه الحركة عبر وكيل HTTP (مثل Burp). |
--timeout N | الكل | مهلة الطلب بالثواني. |
--sleep N | check | التأخير المستخدم لتأكيد الحقن. |
--preset | read | fingerprint أو users. |
--query | read | تعبير SQL عددي للقراءة. |
--prefix | read | بادئة جدول قاعدة البيانات (الافتراضي wp_). |
--max-length N | read | الحد الأقصى للأحرف المقروءة لكل قيمة (الافتراضي 128). |
--user / --password | shell | بيانات اعتماد المسؤول (نص واضح، مسترجع من التجزئة). |
--cmd | shell | الأمر المراد تشغيله (احذفه عند استخدام -i). |
-i / --interactive | shell | فتح واجهة تفاعلية بعد النشر. |