
ماسح Async RCE لـ CVE-2025-55182 / CVE-2025-66478 — prototype-pollution → تنفيذ أكواد عبر React Server Actions.
تلوث النموذج الأولي → تنفيذ أوامر عن بُعد عبر إجراءات خادم React
كشف غير متزامن، قائم على الإصدار الأول، مبني على مخرجات الكناري - بدون تخمين أعمى
[!WARNING] فقط لأبحاث الأمن المصرح بها واختبارات الاختراق. فحص الأنظمة دون إذن كتابي صريح غير قانوني. المؤلف لا يتحمل أي مسؤولية عن سوء استخدام هذه الأداة.
إجراءات خادم React تمرر بيانات الإجراء كـ بيانات نموذج متعددة الأجزاء (multipart form data) مباشرة إلى سياق تنفيذ من جانب الخادم. بسبب عدم كفاية تنقية تلوث النموذج الأولي في الإصدارات المتأثرة من react-server-dom-webpack، يمكن للمهاجم:
Object.prototype_response._prefix على كائن الاستجابة الداخليprocess.mainModule.require('child_process').execSync(cmd)
وهذا يعطي تنفيذ أوامر عن بُعد بدون مصادقة على أي تطبيق Next.js يمكن الوصول إليه علنًا يستخدم إجراءات خادم React مع إصدار متأثر من React.
CVE-2025-55182 - واسع: يؤثر على حزم React 19 (react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack)
CVE-2025-66478 - ضيق: مسار استغلال خاص بـ Next.js عبر نقطة نهاية إجراء الخادم /
يستخدم هذا الماسح التحقق من الكناري القائم على المخرجات - الطريقة الأكثر موثوقية لتأكيد تنفيذ الأكواد الحقيقي مع عدم وجود نتائج إيجابية خاطئة:
1. إرسال POST / مع رأس Next-Action وحمولة تلوث النموذج الأولي متعددة الأجزاء
2. الحمولة تنفذ: echo <canary_عشوائي>
3. الخادم الضعيف يرمي NEXT_REDIRECT مع base64(canary) في الرابط
4. رأس الاستجابة: X-Action-Redirect: /login?a=<base64(canary)>
5. يفك الماسح base64 → يطابق الكناري → تأكيد RCE ✓
allow_redirects=False أمر بالغ الأهمية - التأكيد موجود في الرأس، وليس وجهة إعادة التوجيه.
git clone https://github.com/InferiorAK/React2Shell
cd React2Shell
pip install -r requirements.txt
# مطلوب فقط في حالة استخدام وضع --browser لتحسين كشف الإصدار:
playwright install chromium
playwright install-deps chromium
المتطلبات: Python 3.10+
# هدف واحد
python3 CVE-2025-55182_scanner.py -u https://target.com
# مسح قائمة عناوين URL
python3 CVE-2025-55182_scanner.py -f urls.txt
# وضع هادئ - طباعة نتائج RCE / Vulnerable فقط
python3 CVE-2025-55182_scanner.py -f urls.txt -q
# وضع المتصفح - Chromium بدون واجهة للكشف الدقيق عن الإصدار
python3 CVE-2025-55182_scanner.py -f urls.txt -b
# الخيارات الكاملة - موصى بها للمسح على نطاق واسع
python3 CVE-2025-55182_scanner.py -f urls.txt -b -q -c 3 -t 20
يتم تعيين أحد الأحكام التالية لكل هدف تم مسحه:
ملفات الإخراج (تُحفظ في مجلد outputs/، يتم إنشاؤها تلقائيًا):
outputs/vuln.txt — نتائج RCE و VULNERABLE (تُلحق في كل تشغيل)outputs/unknown.txt — أهداف ذات إصدار Unknown؛ أعد المحاولة مع -b للكشف الدقيق عن الإصدارلماذا يظهر الإصدار كـ
unknownلأكثر من 90٪ من المواقع؟
Next.js 13+ الحديثة التي تستخدم بنية توجيه التطبيق (App Router) لا تضمن أبدًا إصدار الإطار في HTML الثابت. الإصدار موجود فقط في window.next.version بعد تنفيذ JavaScript في سياق متصفح حقيقي.
بدون --browser:
__NEXT_DATA__، والنصوص البرمجية المضمنة، وملفات القطع المجزأة المجمعةunknown تقريبًا - يتم تجاوز التصفية القائمة على الإصدارمع --browser (-b):
window.next.version مباشرة من DOM المباشر# موصى به مع وضع المتصفح - تقليل التزامن (صفحات المتصفح تستهلك موارد كثيرة)
python3 CVE-2025-55182_scanner.py -f urls.txt -b -c 3
يقوم الماسح بتشغيل ما يصل إلى 7 مراحل، ويتوقف بمجرد العثور على إصدار:
المرحلة 1 │ رؤوس استجابة HTTP
│ X-Powered-By: Next.js X.Y.Z
│ x-nextjs-*, x-next-version
المرحلة 2 │ كتل <script> المضمنة (مسح كتلة بكتلة)
│ window.next = { version: "X.Y.Z", ... }
│ version:"X.Y.Z", router: ... ← نمط المفتاح المجاور للحزمة المصغرة
│ "nextVersion":"X.Y.Z"
│ Next.js vX.Y.Z ← نص عادي في تعليقات HTML/البيانات الوصفية
│ __NEXT_VERSION__ = "X.Y.Z"
المرحلة 3 │ كتلة JSON __NEXT_DATA__
│ فقط موجه الصفحات - "version":"X.Y.Z" آمن في هذا السياق
المرحلة 4 │ عناوين URL للقطع المجزأة المجمعة (مستخرجة من <script src>)
│ /_next/static/chunks/*, /_next/static/app/*, /_next/static/runtime/*
│ يجلب ما يصل إلى 12 ملف حزمة حقيقية، يفحص سلاسل الإصدار
المرحلة 5 │ القطع المجزأة الاحتياطية بأسماء ثابتة
│ main.js, framework.js, webpack.js, _app.js, pages/_app.js
المرحلة 6 │ نقطة نهاية /package.json
│ وضع التطوير / الخوادم غير المهيأة بشكل صحيح تكشف هذا مباشرة
المرحلة 7 │ متصفح Playwright بدون واجهة [--browser / -b فقط]
│ يقيّم window.next.version بعد تنفيذ JS بالكامل
│ يتم تشغيله فقط عندما تعيد المراحل 1-6 "unknown"
تم نشر هذه الأداة لأغراض البحث الأمني التعليمي والمصرح به فقط. المؤلف، InferiorAK، غير مسؤول عن أي ضرر ناتج عن سوء الاستخدام. احصل دائمًا على إذن كتابي قبل اختبار أي نظام لا تملكه.
من إعداد InferiorAK
روابطي
| المكون | عرضة للخطر | تم التصحيح |
|---|
React react-server-dom-* | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
| Next.js 16.x | 16.0.0 – 16.0.6 | 16.0.7+ |
| Next.js 15.x | 15.0.0-15.0.4, 15.1.0-15.1.8, 15.2.0-15.2.5, 15.3.0-15.3.5, 15.4.0-15.4.7, 15.5.0-15.5.6 | 15.0.5+, 15.1.9+, 15.2.6+, 15.3.6+, 15.4.8+, 15.5.7+ |
| Next.js 14.x | إصدارات canary 14.3.0-canary.77+ فقط | جميع إصدارات 14.x المستقرة - غير متأثرة |
| Next.js 13.x | - | غير متأثرة |
| العلم | الصيغة الطويلة | الافتراضي | الوصف |
|---|
-u | --url | - | عنوان URL هدف واحد |
-f | --file | - | ملف يحتوي على عنوان URL واحد لكل سطر |
-o | --output | outputs/vuln.txt | ملف إخراج للأهداف الضعيفة |
-U | --unknown-output | outputs/unknown.txt | ملف إخراج للأهداف ذات الإصدار غير المعروف |
-c | --concurrency | 5 | اتصالات HTTP متزامنة |
-t | --timeout | 15 | مهلة لكل طلب (بالثواني) |
-q | --quiet | إيقاف | طباعة صفوف RCE / VULNERABLE فقط |
-b | --browser | إيقاف | احتياطي كشف الإصدار باستخدام Playwright Chromium بدون واجهة |
| الحكم | اللون | المعنى |
|---|
RCE | 🔴 أحمر | تأكيد الكناري في X-Action-Redirect - تنفيذ أوامر عن بُعد مثبت |
VULNERABLE | 🟠 برتقالي | الإصدار ضمن النطاق الضعيف؛ حمولة RCE لم ترجع (جدار حماية / تكوين مصحح / نقطة نهاية خاطئة) |
Unknown | 🟡 أصفر | تم تأكيد Next.js ولكن لم يمكن اكتشاف الإصدار - تمت محاولة RCE على أي حال؛ تم الحفظ في outputs/unknown.txt لإعادة المحاولة بوضع المتصفح |
Not Vulnerable | 🟢 أخضر | تم تأكيد الإصدار على أنه مصحح، أو أن RCE أعادت صراحةً القيمة آمن |
Skipped | ⚪ أبيض | إصدار مؤكد أنه مصحح أو موقع ليس Next.js - لم تتم محاولة PoC |
Error | ⚪ أبيض | المضيف غير قابل للوصول أو فشل الاتصال |