
تحليل وتنفيذ متكامل لثغرة تنفيذ الأكواد عن بُعد (RCE) المُصحَّحة في ووردبريس - CVE-2026-60137 وCVE-2026-63030

جميع الـ PoCs تستغل نفس الثغرتين - التباس مسار REST batch (CVE-2026-63030) وحقن SQL في
author__not_in (CVE-2026-60137) - بنفس الشكل المتداخل المزدوج للدفعة.
ما يختلف بينها هو مسار RCE المختار، والشروط المسبقة للبيئة،
والإعدادات الافتراضية الآمنة. توضح هذه الوثيقة، بشكل ملموس، أين يقع التنفيذ في
هذا المستودع ضمن ذلك المشهد.
check أي حمولة SQL ما لم يُطلب ذلك؛
يمكن لجميع الحركة أن تحمل وسم إسناد؛ كل ما يكتبه أمر على
الهدف يُزال تلقائيًا بعد ذلك. انظر §3.shell| القدرة | هذا المستودع | Icex0/wp2shell-poc | sergiointel/wp2shell-poc | 0xsha/wp2shell | نسخة OUTFILE [4] |
|---|---|---|---|---|---|
| قراءة SQLi عمياء/توقيتية قبل المصادقة | نعم | نعم | نعم (توقيتية) | نعم | نعم |
| قراءة UNION داخل النطاق (طلب واحد/قيمة) | نعم | نعم | - [1] | - [1] | - |
| قراءة قائمة على الأخطاء (EXTRACTVALUE) | نعم | نعم | - | - | - |
| قناة UNION تنجو من ذاكرة التخزين المؤقت الدائمة للكائنات | نعم (killed-base) | لا - فحص بنتائج سلبية كاذبة [2] | غير موثّق | لا - شرط مسبق موثّق [3] | غير قابل للتطبيق [5] |
| RCE قبل المصادقة دون كسر التجزئة | نعم (جسر SQLi إلى مدير) | نعم (نفس الجسر) | نعم (أصل الجسر) | نعم (نفس الجسر) | نعم، عبر INTO OUTFILE [5] |
| شروط مسبقة إضافية لـ RCE | لا شيء يتجاوز التثبيت الافتراضي | لا شيء (على مضيفات بلا ذاكرة تخزين كائنات) | لا شيء (نفس الشيء) | لا شيء (نفس الشيء) | صلاحية FILE في MySQL + مسار قابل للكتابة من الويب مشترك مع mysqld |
| فحص غير تدميري / التحقق من التصحيح | نعم (ثلاثية وسم؛ لا حمولة افتراضيًا) | نعم | لا | نعم (block_cannot_read) | نعم (دفعة وسم) |
| وسم الإسناد/User-Agent | نعم، على جميع الأوامر | لا | لا | علامة نقل | لا |
| التنظيف التلقائي (webshell + حساب مدير مُنشأ) | نعم | نعم | غير موثّق | webshell محمي برمز فقط | الـ dropper يُزال [5] |
| دليل كشف الفريق الأزرق | نعم، من تشغيل إنتاجي | لا | لا | مصفوفة مختبر بدلاً من ذلك | ملاحظات تخفيف |
| التبعيات | المكتبة القياسية فقط | المكتبة القياسية فقط | ملف واحد | المكتبة القياسية فقط، ملف واحد | حزمة Python ≥3.10 |
[1] توقيتية/عمياء فقط كقناة قراءة؛ بدائية المنشور المزوّر عبر UNION موجودة داخل
الجسر ولكنها غير مكشوفة كأوراكل استخراج.
[2] فحص التوفر الساذج (0) UNION SELECT …) يُسقَط بصمت أثناء ترطيب ذاكرة الكائنات،
ويعيد available() قيمة false، ويتوقف جسر ما قبل المصادقة بالكامل - انظر §1.
[3] يسرد README الخاص بالمشروع نفسه "لا يوجد تخزين مؤقت دائم للكائنات (Redis/Memcached)" ضمن
الشروط المسبقة.
[4] نسخة عامة معكوسة على Sploitus (الرابط أدناه): قراءة عمياء بالإضافة إلى dropper عبر INTO OUTFILE
كخطوة RCE، باستخدام ناقل categories بقيمة per_page=-1.
[5] لا يعتمد مسار RCE عبر OUTFILE على عرض المنشورات المزوّرة، لذا لا تحجبه ذاكرات الكائنات -
بل تحجبه صلاحية FILE في MySQL ودليل قابل للكتابة مشترك. نادرًا ما يمنح الاستضافة المُدارة
صلاحية FILE لمستخدم قاعدة بيانات WordPress، وعادةً ما يكون secure_file_priv مضبوطًا.
تعتمد بدائية المنشور المزوّر عبر UNION على كيفية إرجاع WP_Query للصفوف:
wp_posts كاملة؛ يصبح الصف المحقون عبر UNION
كائن WP_Post مباشرةً. يتم عرض التزوير.على المضيفات ذات ذاكرة التخزين المؤقت الدائمة للكائنات، تدفع مجموعة النتائج الأساسية المعبأة WP_Query
إلى وضع التقسيم. الفحص القياسي الذي تستخدمه الـ PoCs العامة -
0) UNION SELECT <forged row> -- -
post_author NOT IN (0) كل صف)، لذا خلف
ذاكرة الكائنات يتبخر الصف المزوّر: يُظهر فحص التوفر نتيجة سلبية كاذبة، ويعيد available()
قيمة false، ويُبلَّغ عن جسر ما قبل المصادقة بالكامل كونه "ميتًا" على مضيف قابل للاستغلال
بالكامل في الواقع. يوثّق الموحِّد العام نفس الحدود بسرد "لا يوجد تخزين مؤقت دائم
للكائنات" كشرط مسبق صارم.يفرّغ هذا المستودع المجموعة الأساسية بدلاً من ذلك:
1) AND 1=0 UNION ALL SELECT <forged row> -- -
مع صفر صفوف أساسية، يكون الصف المزوّر هو الصف الوحيد؛ يبقى الاستعلام في وضع الصف الكامل؛
لا يتم أي بحث ترطيب إطلاقًا. كلمة مفتاحية محقونة واحدة (AND 1=0) هي الفرق الكامل
بين "قناة UNION ميتة" و"RCE كامل قبل المصادقة" على المضيفات ذات ذاكرة الكائنات - وهي
غالبية بيئات إنتاج WordPress المُدار. التشخيص، ومصفوفة الفحص
(per_page × صيغة الحقن).
ملاحظة حول النطاق: قناة القراءة العمياء/التوقيتية ليست حساسة لذاكرة الكائنات (عدّ الصفوف في SQL لا يتضمن ترطيب منشورات مزوّرة)، لذا تعمل القراءة العمياء لكل PoC في كل مكان. ما تقتله ذاكرة الكائنات في الـ PoCs الأخرى هو تحديدًا الجزء المعتمد على UNION: الاستخراج داخل النطاق وجسر SQLi إلى مدير.
درس ثانٍ ذو صلة موثّق في دراسة الحالة: عندما تعمل القناتان معًا، تعامل مع قراءة UNION داخل النطاق باعتبارها المرجع الموثوق - أنتج أوراكل التوقيت في الإنتاج انقلابات بتات تحت التذبذب (jitter) على قيمة حسمتها القراءة داخل النطاق بشكل لا لبس فيه.
توجد ثلاثة مسارات RCE قبل المصادقة عبر الـ PoCs العامة:
| المسار | مستخدَم بواسطة | شروط مسبقة إضافية |
|---|---|---|
جسر SQLi إلى مدير (تزوير صفوف oEmbed/changeset/nav → POST /wp/v2/users → تسجيل الدخول → رفع إضافة) | هذا المستودع، sergiointel (الأصل)، Icex0، 0xsha | لا شيء يتجاوز التثبيت الافتراضي |
dropper عبر INTO OUTFILE (كتابة ملف PHP عبر SQLi وجلبه للحصول على شل) | نسخة OUTFILE [4] | صلاحية FILE في MySQL، وsecure_file_priv تسمح بها، ودليل قابل للكتابة من mysqld و تقدّمه خادم الويب |
استعادة التجزئة → كسرها → تسجيل الدخول (تفريغ user_pass، كسرها دون اتصال، ثم رفع إضافة) | الكل (كخطة احتياطية) | يجب أن تُكسر تجزئة bcrypt فعليًا ($wp$2y$، hashcat -m 35500) - بطيئة، غالبًا لا تُكسر أبدًا |
ينفّذ هذا المستودع الجسر: لا يحتاج صلاحيات قاعدة بيانات تتجاوز ما يملكه WordPress
بالفعل، ويعمل عندما لا تتشارك طبقتا قاعدة البيانات والويب في أي شيء، ولا يترك ملفًا خلفه
ليعتمد عليه مسار صلاحية FILE. المقايضة هي التعقيد - فالجسر رسم بياني مسموم
من سبعة صفوف منشورات - وهو بالضبط المكان الذي كانت فيه النتيجة السلبية الكاذبة لذاكرة الكائنات في §1
تُخفي المسار.
مصمم للتشغيل ضد أنظمة الإنتاج بتصريح، وليس للمختبرات فقط:
check غير تدميري افتراضيًا - بصمة سلبية بالإضافة إلى دفعة وسم حميدة؛
لا تُرسل أي حمولة SQL ما لم يُعطَ --confirm-sqli. بعد التصحيح، تعمل
ثلاثية الوسم المختفية كتحقق من الإصلاح أيضًا.--user-agent على كل أمر بحيث تكون كل حركة الاستغلال
قابلة للتحديد في السجلات (قاعدة أساسية في الاختبارات الاحترافية لا تتبناها الأدوات العامة افتراضيًا).author_exclude → author__not_in، وبدائية UNION لمنشور WP_Post المزوّر،
ومفهوم جسر المخصّص (customizer-bridge) كلها تقنيات عامة (يُقرّ بالنسب أدناه).INTO OUTFILE)، معكوسة على Sploitus -
https://sploitus.com/exploit?id=7CD079AD-E27B-5C54-A696-60635BFDB241