Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
spring-RCE-CVE-2022-22965 — تحليل تعليمي واستغلال إثبات المفهوم لثغرة CVE-2022-22965، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد في Spring MVC/WebFlux عبر ربط البيانات على JDK 9+ مع نشر Tomcat WAR. | Kitploit
أدوات/GitHubGitHub/enokiy/spring-rce-cve-2022-22965
تحليل الثغرات الأمنيةتحليل الكودالاستغلالاستغلال تطبيقات الويبالتعلم والتعليم
GitHubenokiy/spring-rce-cve-2022-22965

spring-RCE-CVE-2022-22965

تحليل تعليمي واستغلال إثبات المفهوم لثغرة CVE-2022-22965، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد في Spring MVC/WebFlux عبر ربط البيانات على JDK 9+ مع نشر Tomcat WAR.

عرض المستودع
12منذ 4 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

مقدمة الثغرة

في الآونة الأخيرة، كشفت Spring عن ثغرة CVE من العيار الثقيل. تُظهر معلومات CVE ما يلي: "قد يكون تطبيق Spring MVC أو Spring WebFlux الذي يعمل على JDK 9+ عرضةً لتنفيذ التعليمات البرمجية عن بُعد (RCE) عبر ربط البيانات. يتطلب الاستغلال المحدد تشغيل التطبيق على Tomcat كنشر WAR. إذا تم نشر التطبيق كملف jar تنفيذي من Spring Boot، أي الوضع الافتراضي، فلن يكون عرضةً لهذا الاستغلال. ومع ذلك، فإن طبيعة الثغرة أكثر عمومية، وقد توجد طرق أخرى لاستغلالها. (قد تكون تطبيقات Spring MVC أو Spring WebFlux التي تعمل على JDK 9+ عرضةً لهجوم تنفيذ التعليمات البرمجية عن بُعد (RCE) عبر ربط البيانات. يتطلب الاستغلال المحدد نشر التطبيق كحزمة WAR على Tomcat. إذا تم نشر التطبيق كملف jar تنفيذي من Spring Boot، أي الوضع الافتراضي، فإنه ليس عرضةً للهجوم. لكن طبيعة الثغرة أكثر عمومية، وقد توجد طرق أخرى لاستغلالها.)". يُجري هذا التحليل تكرارًا لهذه الثغرة لتعلّم مبدأ الثغرة.

java Bean API

قبل الاطلاع على مبدأ ربط المعاملات في Spring MVC، دعونا نلقي نظرة أولًا على بعض واجهات برمجة التطبيقات المتعلقة بـ Java Bean.

  • java Bean: إنها في الواقع مواصفة؛ عندما يستوفي الفصل هذه المواصفة، يمكن للفئات المحددة الأخرى استدعاؤه. عندما يُستخدم الفصل كـ Java Bean، يحتوي الفصل على مجموعة من الخصائص الخاصة، ويتم قراءة وكتابة الخصائص عبر طرق get/is() أو set() العامة (public).
  • Introspector (استبطان): توفر فئة Introspector طريقةً قياسيةً للأدوات للتعرّف على الخصائص والأحداث والأساليب التي يدعمها Java Bean المستهدَف. لكل نوع من هذه الأنواع الثلاثة من المعلومات، يقوم Introspector بتحليل فئة الفول وفئاته الفائقة بشكل منفصل بحثًا عن معلومات صريحة أو ضمنية، ويستخدم هذه المعلومات لبناء كائن BeanInfo يصف الفول المستهدَف بشكل شامل. (توفر Java معالجةً افتراضيةً لخصائص وأحداث وأساليب فئة Java Bean. على سبيل المثال، عند البحث عن خاصية/أسلوب لفئة bean، إذا لم يتم العثور على هذه الخاصية في فئة bean الحالية، يتم البحث في الفئة الأصلية لفئة bean، وهكذا.)
  • BeanInfo: قم باستبطان Java Bean وتعرّف على جميع خصائصه وأساليبه المكشوفة وأحداثه. إذا تم استبطان فئة BeanInfo الخاصة بـ Java Bean مسبقًا، فسيتم استرجاع فئة BeanInfo من ذاكرة التخزين المؤقت لـ BeanInfo. (قم باستبطان Java Bean وتعرف على جميع خصائصه وأساليبه وأحداثه العامة. إذا تم استبطان فئة BeanInfo الخاصة بـ Java Bean مسبقًا، فسيتم استرداد فئة BeanInfo من ذاكرة التخزين المؤقت لـ BeanInfo.)
  • PropertyDescriptor: يُستخدم لوصف الخصائص التي يكشفها Java Bean عبر مجموعة من أساليب الوصول (accessor methods).

قم بتعريف فئة java bean كما يلي:```java public class User { private String name;

public User() {
}
public void setName(String name) {
    this.name = name;
}
public String getName() {
    return this.name;
}
public int getAge() {
    return 18;
}

}

لنلقِ نظرة على المعلومات التي يحصل عليها Introspector.getBeanInfo باستخدام كود الاختبار التالي:```java
@Test
    public  void testIntrospector() throws IntrospectionException {
        BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
        for (PropertyDescriptor pdesc:beanInfo.getPropertyDescriptors()){
            System.out.println("Property: " + pdesc.getName() + ",Class:" + pdesc.getPropertyType());
        }
//        for (MethodDescriptor md:beanInfo.getMethodDescriptors()) {
//            System.out.println("Method: " + md.getName());
//        }
    }

المخرجات:```text Property: age,Class:int Property: class,Class:class java.lang.Class Property: name,Class:class java.lang.String

إلى جانب age و"ذلك" المتوقعين، هناك أيضًا خاصية class، واسم الفئة هو Class. وإذا واصلت استدعاء Introspector.getBeanInfo(Class.class)، فيمكنك الحصول على مزيد من المعلومات مثل classLoader وما إلى ذلك:```text jdk11:
Property: annotatedInterfaces
Property: annotatedSuperclass
Property: annotation
Property: annotations
Property: anonymousClass
Property: array
Property: canonicalName
Property: class
Property: classLoader
Property: classes
Property: componentType
Property: constructors
Property: declaredAnnotations
Property: declaredClasses
Property: declaredConstructors
Property: declaredFields
Property: declaredMethods
Property: declaringClass
Property: enclosingClass
Property: enclosingConstructor
Property: enclosingMethod
Property: enum
Property: enumConstants
Property: fields
Property: genericInterfaces
Property: genericSuperclass
Property: interface
Property: interfaces
Property: localClass
Property: memberClass
Property: methods
Property: modifiers
Property: module
Property: name
Property: nestHost
Property: nestMembers
Property: package
Property: packageName
Property: primitive
Property: protectionDomain
Property: signers
Property: simpleName
Property: superclass
Property: synthetic
Property: typeName
Property: typeParameters

بالإضافة إلى ذلك، دعنا نقارن الفرق في المعلومات التي تم الحصول عليها عبر Introspector.getBeanInfo(Class.class) في إصدارات JDK المختلفة؛ ما سبق هو الإخراج تحت jdk-11، وما يلي هو الإخراج تحت JDK8:```text jdk8: Property: annotatedInterfaces Property: annotatedSuperclass Property: annotation Property: annotations Property: anonymousClass Property: array Property: canonicalName Property: class Property: classLoader Property: classes Property: componentType Property: constructors Property: declaredAnnotations Property: declaredClasses Property: declaredConstructors Property: declaredFields Property: declaredMethods Property: declaringClass Property: enclosingClass Property: enclosingConstructor Property: enclosingMethod Property: enum Property: enumConstants Property: fields Property: genericInterfaces Property: genericSuperclass Property: interface Property: interfaces Property: localClass Property: memberClass Property: methods Property: modifiers Property: name Property: package Property: primitive Property: protectionDomain Property: signers Property: simpleName Property: superclass Property: synthetic Property: typeName Property: typeParameters

`\r````text
Property: annotatedInterfaces
Property: annotatedSuperclass
Property: annotation
Property: annotations
Property: anonymousClass
Property: array
Property: canonicalName
Property: class
Property: classLoader
Property: classes
Property: componentType
Property: constructors
Property: declaredAnnotations
Property: declaredClasses
Property: declaredConstructors
Property: declaredFields
Property: declaredMethods
Property: declaringClass
Property: enclosingClass
Property: enclosingConstructor
Property: enclosingMethod
Property: enum
Property: enumConstants
Property: fields
Property: genericInterfaces
Property: genericSuperclass
Property: interface
Property: interfaces
Property: localClass
Property: memberClass
Property: methods
Property: modifiers
Property: module
Property: name
Property: package
Property: packageName
Property: primitive
Property: protectionDomain
Property: signers
Property: simpleName
Property: superclass
Property: synthetic
Property: typeName
Property: typeParameters

بالمقارنة مع JDK8، أضاف JDK9 خاصيتين هما module وpackageName، بينما في JDK11 بالإضافة إلى خاصيتي module وpackageName توجد خاصيتان أخريان هما nestHost وnestMembers.

تنزيل الأداة