XXE
حقن الكيانات الخارجية XML XXE
XXE تحدث عندما يعالج محلّل XML كيانات خارجية (External Entities) معرّفة داخل DTD دون تعطيلها، فيقرأ ملفّات النظام أو يرسل طلبات نيابة عن الخادم — قريبة من SSRF بأثرها.
معيار XML يسمح بتعريف "كيانات" (entities) داخل قسم DTD يمكن أن تشير لمصدر خارجي — ملفّ محلّي أو رابط شبكة. محلّل XML مُعدّ افتراضيًّا (بلغات وأطر كثيرة قديمة) قد يوسّع هذه الكيانات تلقائيًّا دون سؤال، فيتحوّل أي حقل يقبل XML من مستخدم غير موثوق إلى بوابة لقراءة ملفّات الخادم أو تنفيذ طلبات SSRF.
الخطر الأكبر: هذا سلوك **افتراضي** بمحلّلات كثيرة، لا خطأ برمجي واضح — المطوّر لا يكتب كودًا خاطئًا صراحة، بل ينسى تعطيل ميزة خطرة مفعّلة أصلًا.
الصياغة
<!DOCTYPE root [ <!ENTITY name SYSTEM "...مصدر خارجي..."> ]>
📄 مثال
// دفاع Node.js: تعطيل معالجة الكيانات الخارجية والـ DTD كليًّا
const parser = new XMLParser({
processEntities: false, // لا تحلّ أي كيان خارجي
allowBooleanAttributes: true,
});
// القاعدة العامة بأي لغة: عطّل DTD والكيانات الخارجية
// كخطوة إعداد افتراضية لأي محلّل XML يعالج مدخلات مستخدمينأهم النقاط
| النقطة | الوظيفة |
|---|---|
| السبب الجذري | محلّل XML يقبل ويوسّع كيانات خارجية معرّفة داخل DTD |
| الأثر | قراءة ملفّات محلّية، SSRF، وأحيانًا حجب خدمة (Billion Laughs) |
| الدفاع الأساسي | تعطيل DTD والكيانات الخارجية بإعداد المحلّل — لا معالجتها انتقائيًّا |
💡 نصائح عملية
- الدفاع الأضمن تعطيل DTD كليًّا إن لم يكن تطبيقك يحتاجه فعلًا — لا محاولة فلترة الكيانات الخطرة فقط
- حدّث مكتبة معالجة XML لديك — كثير من اللغات الحديثة عطّلت هذا السلوك افتراضيًّا بإصداراتها الأخيرة
⚠️ أخطاء شائعة
- الافتراض أن XML من نظامك الداخلي آمن دائمًا — أي مصدر خارجي لملفّ XML (رفع مستخدم، Webhook) يجب معاملته كغير موثوق
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CYBERSECURITY الكامل بالعربي.