
كاشف غير تدميري لـ CVE-2026-64638 (XSS2Shell) — أولية انعكاس XSS قبل المصادقة في ووردبريس
كاشف غير تخريبي وبدون تبعيات لأولية الانعكاس CVE-2026-64638 ("XSS2Shell")
في ملف WordPress wp-login.php.
CVE-2026-64638 هو XSS انعكاسي قبل المصادقة في نواة WordPress، أُعلن عنه من قبل PWN.AI في 2026-08-07 (CVSS 8.9, CWE-79) وصُحِّح في 7.0.3 مع ترحيل التصحيح إلى كل فرع مدعوم (6.9.6, 6.8.7, 6.7.6, 6.6.6, 6.5.9, …).
السبب الجذري هو تباين في أسلوب التحليل بين دالة strip_tags() في PHP
ومنظف KSES في WordPress:
strip_tags() التعرف على أي وسم عندما تأتي مسافة بيضاء بعد الرمز <، لذا
يبقى اسم مستخدم مثل < area id=x> كنص عادي.<area id="x">
نشط داخل رسالة خطأ تسجيل الدخول.ينتج عن ذلك حقن DOM باختيار المهاجم مع سمات id/class/href مختارة —
الأولية الكامنة خلف السلسلة المنشورة متعددة المراحل
(الاستيلاء على DOM → REST JSONP → سرقة كلمات مرور التطبيقات → رفع الإضافات →
RCE ضد ضحية مسؤول مسجّل الدخول).
مسبران غير تخريبيين (محاولة تسجيل دخول فاشلة باسم مستخدم عشوائي كعلامة):
<b>marker</b> بدون تهريب في استجابة الخطأ.< area id=marker> من strip_tags() ويعاود الظهور
كعنصر نشط/مُطبَّع (مثل area id="marker") في الاستجابة.لا تنفذ أي حمولة أي شيء؛ تقيس الأداة فقط ما إذا كان HTML المهاجم يُعرض كـ DOM نشط. خيارات إضافية:
--version — يحدد بصمة إصدار النواة عبر وسم <generator> في التغذية.--jsonp — يتحقق من أن غلاف REST JSONP (_jsonp/_envelope) المستخدم في
السلسلة المنشورة قابل للوصول.python3 xss2shell_check.py https://example.com
python3 xss2shell_check.py --jsonp --verbose https://example.com
python3 xss2shell_check.py --version https://example.com
python3 xss2shell_check.py --json https://example.com
يتطلب Python 3.6+، باستخدام المكتبة القياسية فقط، وبلا أي تبعيات.
| الرمز | المعنى |
|---|---|
| 0 | عرضة للثغرة (أولية الانعكاس موجودة) |
| 1 | مُصحَّح / غير عرضة للثغرة |
| 2 | خطأ (تعذر الوصول، تحدٍّ من WAF، استجابة غير متوقعة) |
<area id="…">).
يختلف أسلوب اقتباس السمات باختلاف جيل KSES (المحلِّل المخصص القديم:
<area id=x>; DOMDocument: <area id="x"> / <area id="x" />)، لذا تتم
مطابقة جميع الأشكال. مرور < area …> الخام دون إعادة تحليل هو نص خامل
في المتصفح، وليس الأولية — ويُبلَّغ عنه كـ RAW_TEXT_ONLY ولا يسبب
نتيجة إيجابية خاطئة.login_errors مخصص أو
CDN/WAF كتابة الاستجابات، أو إذا لم يعكس خطأ تسجيل الدخول اسم المستخدم إطلاقًا.لأغراض اختبار الأمان المصرَّح به فقط. صُممت هذه الأداة حصريًا لاختبار الأنظمة التي تملكها أو لديك إذن كتابي صريح لتقييمها. الاختبار غير المصرَّح به غير قانوني في معظم الولايات القضائية.
| الخيار | الغرض |
|---|
--version | يحدد بصمة إصدار النواة (وسم مولّد التغذية، مع وسم meta في الصفحة الرئيسية كاحتياط) |
--jsonp | يتحقق أيضًا من أن غلاف REST JSONP (_jsonp/_envelope) قابل للوصول |
-v, --verbose | يطبع مقتطفات من استجابات المسابر (أدلة للتقارير) |
--json | نتيجة JSON قابلة للقراءة آليًا (CI / أتمتة) |
| السلوك الملاحَظ | الحكم | رمز الخروج |
|---|
انعكاس <b>marker</b> دون تهريب | RAW_HTML — عرضة للثغرة | 0 |
إعادة تحليل < area id=marker> إلى عنصر <area id="marker"> نشط (أي أسلوب اقتباس / صيغة void) | AREA_BYPASS — عرضة للثغرة | 0 |
| اسم المستخدم مُهرَّب HTML | ESCAPED — غير عرضة للثغرة | 1 |
| تجريد الوسوم مع بقاء النص | STRIPPED — غير عرضة للثغرة | 1 |
مرور < area …> الخام دون إعادة تحليل أبدًا | RAW_TEXT_ONLY — نص خامل، غير عرضة للثغرة | 1 |
| لا انعكاس إطلاقًا | NOT_REFLECTED — غير عرضة للثغرة | 1 |
| حظر المسبر (HTTP ≥ 400 / صفحة تحدٍّ) أو تعذر الوصول إلى الهدف | ERROR | 2 |