
Spring-Cloud-Spel-RCE
Github पर पहले से लिखे गए पर्यावरण कोड को क्लोन करके।
//⚠️ध्यान दें कि पर्यावरण कोड डाउनलोड पथ में चीनी या स्पेस नहीं हो सकता
git clone https://github.com/Ha0Liu/CVE-2022-22947.git

IDEA का उपयोग करके हमारे द्वारा अभी डाउनलोड किए गए कोड पैकेज को खोलें, Open ---> अभी डाउनलोड की गई फ़ाइल का पथ ---> Open।
स्वयं मैन्युअल रूप से प्रोजेक्ट बनाकर और पर्यावरण सेटअप करके।
(1) नया प्रोजेक्ट बनाएं, कॉन्फ़िगर करने के बाद बस next पर क्लिक करते रहें;

(2) प्रोजेक्ट की निर्देशिका संरचना का विश्लेषण करें:
1. .idea फ़ोल्डर में IntelliJ IDEA की डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइलें होती हैं, इसका कोई अन्य उपयोग नहीं है, आप अपनी आवश्यकता के अनुसार इसे हटा या रख सकते हैं;
2. src फ़ोल्डर मुख्य रूप से पूरे प्रोजेक्ट का कोड क्षेत्र है, जिसमें java और resource दो फ़ोल्डर शामिल हैं, java प्रोजेक्ट में java कोड लिखने का क्षेत्र है, resource पूरे प्रोजेक्ट का कॉन्फ़िगरेशन क्षेत्र है, स्प्रिंग प्रोजेक्ट डिफ़ॉल्ट रूप से java में SpringApplication विधि जोड़ता है, यह विधि स्प्रिंग की डिफ़ॉल्ट प्रारंभ विधि है, resource में डिफ़ॉल्ट रूप से application.properties जोड़ा जाता है, जो स्प्रिंग प्रोजेक्ट की कॉन्फ़िगरेशन फ़ाइल है;
3. test फ़ोल्डर परीक्षण फ़ोल्डर है, test में विधियों का परीक्षण किया जा सकता है;
4. pom.xml मावेन की कॉन्फ़िगरेशन फ़ाइल है, जिसमें प्रोजेक्ट के लिए आवश्यक निर्भरताएँ, कॉन्फ़िगरेशन आदि शामिल हैं;
5. .iml मावेन निर्भरता पैकेज का कॉन्फ़िगरेशन है, जो डिफ़ॉल्ट रूप से भी जोड़ा जाता है;
6. External Libraries फ़ोल्डर इस प्रोजेक्ट के सभी निर्भरता पैकेज हैं।
(3) pom.xml फ़ाइल में मावेन निर्भरताएँ जोड़ें (maven रिपॉजिटरी में सभी निर्भरता विवरण शामिल हैं)।
1. pom फ़ाइल में डिफ़ॉल्ट रूप से कुछ xml कोड उत्पन्न होंगे, विवरण इस प्रकार है:

2. प्रोजेक्ट के लिए आवश्यक निर्भरताएँ आयात करें, चूँकि यह प्रोजेक्ट SpringBoot प्रोजेक्ट है, इसलिए सर्वर स्टार्टर के रूप में spring-boot-starter निर्भरता आयात करना आवश्यक है, दूसरी बात, चूँकि यह भेद्यता SpringCloud में Gateway गेटवे की भेद्यता है, और जोखिम संस्करण 3.1.1 से नीचे के संस्करण हैं, इसलिए इस बार हम भेद्यता पुनरुत्पादन के लिए संस्करण 3.1.0 का उपयोग करेंगे, साथ ही हमें actuator इंटरफ़ेस के माध्यम से गेटवे की निगरानी और एक्सेस करने की आवश्यकता है, इसलिए हमें इस निर्भरता की भी आवश्यकता है, विशिष्ट सामग्री इस प्रकार है:

(4) स्प्रिंग की कॉन्फ़िगरेशन फ़ाइल संशोधित करें (पथ src --> main --> resources --> application.properties), विवरण इस प्रकार है:
1. server.port स्प्रिंग सर्वर का प्रारंभ पोर्ट है, डिफ़ॉल्ट रूप से 8080 पोर्ट है, हर कोई अपनी स्थिति के अनुसार सेट कर सकता है;
2. management.endpoint.gateway.enabled=true actuator पोर्ट द्वारा SpringCloud-Gateway गेटवे का पता लगाने के लिए सक्षम करना है, डिफ़ॉल्ट false है, क्योंकि इस भेद्यता को गेटवे की स्थिति की निगरानी आदि संचालन की आवश्यकता है, इसलिए हमें इसे मैन्युअल रूप से true में बदलना होगा, निगरानी सक्षम करें;
3. management.endpoints.web.exposure.include=gateway सर्वर के गेटवे के रूप में गेटवे गेटवे का चयन करना है, क्योंकि यह भेद्यता गेटवे गेटवे की ही है, इसलिए हम कॉन्फ़िगरेशन फ़ाइल में घोषित करते हैं कि गेटवे गेटवे का चयन किया गया है।

(5) नया प्रोजेक्ट बनाने के बाद स्वतः उत्पन्न जावा वर्ग को संशोधित करें (वर्ग का नाम आमतौर पर प्रोजेक्ट नाम + Application होता है, पथ src --> main --> java --> com.xxx.xxx --> xxxApplication), विवरण नीचे दिए गए चित्र में देखा जा सकता है:

(6) प्रोजेक्ट प्रारंभ करें, विवरण नीचे दिए गए चित्र में देखा जा सकता है:

(7) http://localhost:9000 पर जाएँ, यदि पृष्ठ स्क्रीनशॉट के समान प्रदर्शित होता है, तो पर्यावरण सेटअप सफल है।

(1) सबसे पहले आधिकारिक पैच को देखते हैं, differ इस प्रकार है: https://github.com/spring-cloud/spring-cloud-gateway/commit/337cef276bfd8c59fb421bfe7377a9e19c68fe1e , आधिकारिक तौर पर org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue फ़ंक्शन में StandardEvaluationContext को GatewayEvaluationContext से बदलकर SPEL एक्सप्रेशन को निष्पादित किया गया।

उपरोक्त चित्र से देखा जा सकता है कि यह पैच मुख्य रूप से SPEL एक्सप्रेशन के पार्सिंग विधि को संशोधित करके किया गया है, 66वीं पंक्ति से देखा जा सकता है कि यह if स्टेटमेंट यह जाँचता है कि SPEL एक्सप्रेशन को "#{" से शुरू होना चाहिए और "}" से समाप्त होना चाहिए, यह getValue विधि SPEL एक्सप्रेशन पार्सिंग का कार्य करती है, यह देखा जा सकता है कि यह भेद्यता SPEL एक्सप्रेशन द्वारा ट्रिगर RCE भेद्यता है।
(2) control+माउस बायाँ क्लिक करके getValue फ़ील्ड पर क्लिक करें, फिर ऊपर की ओर वापस जाकर org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType एनम ढूँढ सकते हैं।

उपरोक्त पाठ में default विधि से देखा जा सकता है कि एनम में DEFAULT विधि को कॉल किया जाता है, विधि विवरण इस प्रकार है:
default ShortcutType shortcutType() {
return ShortcutType.DEFAULT;
}

(3) ऊपर की ओर वापस जाकर org.springframework.cloud.gateway.support.ConfigurationService.class#normalizeProperties() ढूँढें।

यह normalizeProperties() फ़िल्टर के गुणों को पार्स करने के लिए है, यह फ़िल्टर के कॉन्फ़िगरेशन गुणों को normalize में पास करेगा, और अंत में getValue में जाकर SPEL एक्सप्रेशन निष्पादित करेगा, जिससे SPEL इंजेक्शन होगा।
(1) दस्तावेज़ [https://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html](https://cloud.spring.io/spring-cloud-gateway/multi/multi actuator_api.html) के अनुसार, उपयोगकर्ता actuator के माध्यम से गेटवे में रूट बना और हटा सकते हैं, नीचे दिए गए चित्र में गेटवे की मूल संरचना दिखाई गई है।

(2) IDEA में actuator की mapping सुविधा के माध्यम से गेटवे के निर्माण, विलोपन आदि कार्यों के इंटरफ़ेस पाए जा सकते हैं।

(3) RouteDefinition वर्ग में ट्रैक करें, पाया गया कि यह वर्ग गेटवे की संरचना सामग्री घोषित करता है।