في هذا القسم، سنشرح ماهية حقن كائن (entity أو كيان) XML خارجي، ونذكر بعض الأمثلة الشائعة، ونشرح كيفية العثور على أنواع مختلفة من حقن XXE واستغلالها، ونلخص كيفية منع هجمات حقن XXE.
ما هو حقن كائن XML خارجي؟
حقن كائن XML خارجي والمعروف أيضاً باسم (XEE) هو ثغرة أمنية على الويب تسمح للمهاجم بالتدخل في معالجة تطبيق لبيانات من نوع XML. وغالباً ما تسمح للمهاجم بعرض الملفات الموجودة على نظام ملفات السيرفر الخاص بالتطبيق، والتفاعل مع أي أنظمة خلفية (back-end) أو خارجية يمكن للتطبيق نفسه الوصول إليها.
في بعض الحالات، يمكن للمهاجم تطوير (أو تصعيد) هجوم XXE لخرق الخادم الأساسي أو البنية التحتية الأخرى للواجهة الخلفية (back-end)، من خلال الاستفادة من ثغرة XXE لتنفيذ هجمات تزوير الطلب من جانب الخادم (SSRF).

كيف تنشأ ثغرات XXE؟
تستخدم بعض التطبيقات صيغة (أو تنسيق) XML لنقل البيانات بين المتصفح و الخادم. ودائماً ما تستخدم التطبيقات التي تقوم بذلك فعلياً مكتبة قياسية (standard library) أو واجهة برمجية (API) لمعالجة بيانات XML على الخادم. تنشأ ثغرات XXE لأن مواصفات XML تحتوي على العديد من الميزات التي يمكن أن تكون خطرة، والمحللات (parsers) المعيارية تدعم هذه الميزات حتى لو لم يتم استخدامها بشكل طبيعي من قبل التطبيق.
كائنات XML الخارجية هي نوع من كائنات XML المخصصة والتي يتم تحميل قيمها المحددة من خارج DTD التي يتم التصريح عنها فيه. تعد الكائنات الخارجية مهمة بشكل خاص لجهة الأمان لأنها تتيح تعريف الكائن استناداً إلى محتويات مسار الملف أو عنوان URL.
ما هي أنواع هجمات XXE؟
هناك أنواع مختلفة من هجمات XXE:
- استغلال XXE لاسترداد الملفات ، حيث يتم تعريف كائن خارجي يضم محتويات الملف، ويتم إرجاعه في استجابة (response) التطبيق.
- استغلال XXE لتنفيذ هجمات SSRF ، حيث يتم تعريف كائن خارجي بالاعتماد على عنوان URL لأحد النظم الخلفية (back-end).
- استغلال XXE الأعمى يؤدي إلى استخراج (أو تهريب) البيانات خارج النطاق ، حيث يتم نقل البيانات الحساسة من خادم التطبيق إلى نظام يتحكم فيه المهاجم.
- استغلال XXE الأعمى لاسترداد البيانات عبر رسائل الخطأ (error messagees) ، حيث يمكن للمهاجم تشغيل تحليلٍ لرسالة خطأ تحتوي على بيانات حساسة.
استغلال XXE لاسترداد الملفات:
لتنفيذ هجوم حقن XXE يسترجع ملفاً بشكل كيفي (اعتباطياً) من نظام ملفات الخادم، فستحتاج إلى تعديل الـ XML المقدم بطريقتين:
- تقديم (أو تحرير) عنصر DOCTYPE الذي يعرف كائناً خارجياً يحتوي على المسار إلى الملف.
- تحرير قيمة البيانات في XML التي سيتم إرجاعها في استجابة التطبيق، للاستفادة من الكائن الخارجي المعرَف.
على سبيل المثال، افترض أن أحد تطبيقات التسوق يتحقق من مستوى مخزون أحد المنتجات عن طريق إرسال الـ XML التالي إلى الخادم:
<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>
لا ينفذ التطبيق أي دفاعات محددة ضد هجمات XXE، لذلك يمكنك استغلال ثغرة XXE لاسترداد الملف / etc / passwd عن طريق إرسال حمولة XXE التالية:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>
تعرِّف حمولة XXE هذه كائناَ خارجياً & xxe؛ قيمته هي محتويات ملف / etc / passwd وتستخدم ذلك الكائن ضمن قيمة productId. يؤدي هذا إلى جعل استجابة (response) التطبيق تقوم بتضمين محتويات ذلك الملف:
Invalid product ID: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
ملاحظة:
مع وجود ثغرات XXE في العالم الحقيقي، غالباً ما يكون هناك عدد كبير من قيم البيانات ضمن الـ XML المقدم، والتي قد يتم استخدام أي منها في استجابة التطبيق. لاختبار ثغرات XXE بشكل منهجي، ستحتاج عموماً إلى اختبار كل عقدة بيانات في الـ XML بشكل فردي، من خلال الاستفادة من الكائن المحدد ومعرفة ما إذا كان يظهر في الاستجابة.
استغلال XXE لتنفيذ هجمات SSRF:
بصرف النظر عن استرداد البيانات الحساسة، فإن التأثير الرئيسي الآخر لهجمات XXE هو أنه يمكن استخدامها لإجراء تزوير طلب جانب الخادم (SSRF). وهذه قد تكون ثغرة أمنية خطيرة حيث يمكن جعل التطبيق من جانب الخادم يقوم بتقديم طلبات HTTP إلى أي عنوان URL يمكن للخادم الوصول إليه.
لاستغلال ثغرة XXE لتنفيذ هجوم SSRF ، تحتاج إلى تعريف كائن XML خارجي باستخدام عنوان الـ URL الذي تريد استهدافه، واستخدام الكائن المحدد ضمن إحدى قيم البيانات. إذا كنت تستطيع استخدام ذلك الكائن المعرف ضمن إحدى قيم البيانات التي يتم إرجاعها في استجابة التطبيق، فستكون قادراً على عرض الاستجابة من عنوان الـ URL ضمن استجابة التطبيق، وبالتالي يمكنك الحصول على تفاعل ثنائي الاتجاه (إرسال واستقبال) مع نظام الواجهة الخلفية (back-end). إذا لم يكن الأمر كذلك، فلن تكون قادراً إلا على تنفيذ هجمات SSRF العمياء (والتي لا تزال لها عواقب وخيمة).
في مثال XXE التالي، سيتسبب الكائن الخارجي بقيام الخادم بإنشاء طلب HTTP خلفي (back-end) لنظام داخلي ضمن البنية التحتية للمؤسسة:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>
ثغرات XXE العمياء:
العديد من نماذج ثغرات XXE تكون عمياء. هذا يعني أن التطبيق لا يُرجع قيم أي كائنات خارجية محددة في استجاباته، وبالتالي فإن الاسترجاع المباشر للملفات من جانب الخادم غير ممكن.
لا يزال من الممكن اكتشاف ثغرات XXE العمياء واستغلالها، ولكن سنحتاج إلى المزيد من التقنيات المتقدمة. يمكنك أحياناً استخدام تقنيات خارج النطاق (out-of-band techniques) للعثور على الثغرات واستغلالها للتسلل إلى البيانات. ويمكنك أحياناً إثارة أخطاء تحليل (parsing) XML التي تؤدي إلى الكشف عن البيانات الحساسة ضمن رسائل الخطأ.
العثور على المنصة الخفية لهجوم حقن الـ XXE:
منصة الهجوم لثغرات حقن XXE تكون واضحة في الكثير من الحالات، لأن حركة مرور (traffic) HTTP الطبيعية للتطبيق تتضمن الطلبات التي تحتوي على بيانات بصيغة XML. في حالات أخرى، تكون منصة الهجوم أقل وضوحاً. ومع ذلك، فإذا نظرت إلى الأماكن الصحيحة، ستجد منصة هجوم XXE في الطلبات التي لا تحتوي على أي XML.
هجمات XInclude:
تتلقى بعض التطبيقات البيانات المقدمة من الزبون client، وتقوم تضمينها من جهة الخادم في مستند XML ، ثم تحلل (parse) ذلك المستند. وأحد الأمثلة على ذلك ما يحدث عندما يتم وضع البيانات المقدمة من الزبون ضمن طلب SOAP خلفي، والتي تتم معالجتها بعد ذلك بواسطة خدمة SOAP الخلفية.
في هذه الحالة، لا يمكنك تنفيذ هجوم XXE كلاسيكي، لأنك لا تتحكم في مستند XML بأكمله، وبالتالي لا يمكنك تحديد عنصر DOCTYPE أو تعديله. ومع ذلك، قد تتمكن من استخدام XInclude بدلاً من ذلك . XInclude هو جزء من مواصفات XML التي تسمح بإنشاء مستند XML من المستندات الفرعية. يمكنك وضع هجوم XInclude ضمن أية قيمة بيانات في مستند XML، ولذلك يمكن تنفيذ الهجوم في الحالات التي تتحكم فيها بعنصر واحد فقط من البيانات الموجودة في مستند XML على الخادم.
لتنفيذ هجوم XInclude ، تحتاج إلى إدراج (reference : وضع فضاء الأسماء كمرجع، والمقصود هنا هو استخدام المكتبة البرمجية (فضاء الأسماء) التي تتضمن الخاصية XInclude [الشرح من المترجم]) فضاء الأسماء (namespace) الخاص بـ XInclude وتوفير المسار للملف الذي ترغب في تضمينه. فمثلاً:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>
هجمات XXE عبر رفع الملفات:
تتيح بعض التطبيقات للمستخدمين رفع الملفات التي تتم معالجتها بعد ذلك من جانب الخادم. تستخدم بعض صيغ الملفات الشائعة الـ XML أو تحتوي على مكونات XML فرعية. ومن الأمثلة على الصيغ المستندة إلى XML هي صيغ مستندات الـ office المكتبية مثل DOCX وتنسيقات الصور مثل SVG.
على سبيل المثال، قد يسمح أحد التطبيقات للمستخدمين برفع الصور، ويقوم بمعالجتها أو التحقق من صحتها على الخادم بعد رفعها. وحتى إذا كان التطبيق يتوقع استلام صيغة مثل PNG أو JPEG ، فقد تدعم مكتبة معالجة الصور المستخدمة صورَ SVG. ونظراً لأن تنسيق SVG يستخدم XML ، فيمكن للمهاجم إرسال صورة SVG ضارة وبالتالي الوصول إلى منصة هجوم خفية لثغرات XXE.
هجمات XXE عبر نوع المحتوى المعدل:
تستخدم معظم طلبات POST نوع محتوى افتراضي يتم إنشاؤه بواسطة نماذج HTML ، مثل application / x-www-form-urlencoded. تفترض بعض مواقع الويب تلقي طلبات بهذه الصيغة (format) إلا أنها ستسمح لأنواع المحتوى الأخرى، بما في ذلك XML.
على سبيل المثال، إذا كان الطلب العادي يحتوي على ما يلي:
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>
إذا كان التطبيق يتسامح مع الطلبات التي تحتوي على XML في نص الرسالة، ويحلل (parse) محتوى النص كـ XML ، فيمكنك الوصول إلى منصة هجوم XXE المخفية ببساطة من خلال إعادة تنسيق الطلبات لاستخدام صيغة (أو تنسيق) XML.
كيفية البحث عن ثغرات XXE واختبارها:
يمكن العثور على الغالبية العظمى من ثغرات XXE بسرعة و بشكل موثوق باستخدام ماسح (scanner أو فاحص) الثغرات على الوب الخاص بـ Burp Suite (Burp Suite’s web vulnerability scanner).
وبشكل عام يتضمن الاختبار اليدوي لثغرات XXE ما يلي:
- اختبار لاسترداد الملفات عن طريق تعريف كائن خارجي اعتماداً على ملف نظام تشغيل معروف واستخدام هذا الكائن في البيانات التي يتم إرجاعها ضمن استجابة (response) التطبيق.
- اختبار ثغرات XXE العمياء عن طريق تعريف كائن خارجي اعتماداً على عنوان URL لنظام تتحكم فيه، ومراقبة التفاعلات مع هذا النظام. وهنا فإن Burp Collaborator client مثالي لهذا الغرض.
- اختبار لثغرة تضمين بيانات مقدمة من المستخدم ليست من نوع XML ضمن مستند XML على السيرفر باستخدام هجوم XInclude لمحاولة استرداد ملف نظام تشغيل معروف.
كيفية منع ثغرات XXE:
نظرياً، تنشأ جميع ثغرات XXE لأن مكتبة تحليل XML المستخدمة في التطبيق تدعم ميزات (أو خواص) XML من المحتمل أن تكون خطرة و التي لا يحتاجها التطبيق أو لا ينوي استخدامها. والطريقة الأسهل و الأكثر فعالية لمنع هجمات XXE هي تعطيل هذه الميزات.
عموماً، يكفي تعطيل تحليل الكائنات الخارجية و تعطيل دعم XInclude. يمكن القيام بذلك عادةً عبر خيارات التكوين (أو الإعداد configuration) أو من خلال تجاوز السلوك الافتراضي برمجياً. راجع وثائق (documentation أو الإرشادات مجازاً) مكتبة تحليل XML أو الـ API المتعلقة بها لمعرفة كيفية تعطيل الإمكانيات (أو القدرات capabilities) غير الضرورية بالتفصيل.