حقن XML هو التلاعب بمدخلات XML لتغيير كيفية تحليل التطبيق للبيانات أو تفسيرها. ويحدث ذلك عندما يتم إدراج مدخلات يتحكم بها المستخدم في مستند XML دون التحقق من صحتها بشكل صحيح، مما يسمح للمهاجمين بحقن عقد أو سمات أو كيانات أو حمولات تعدل تدفق التحكم أو تتجاوز المنطق أو تؤدي إلى سلوكيات محلل خطرة. في النظم الإيكولوجية الحالية التي تتسم بكثافة واجهة برمجة التطبيقات والتكامل، يظل حقن XML تهديدًا حقيقيًا لا يمكن لفرق الأمن تجاهله.
على عكس التلاعب البسيط في المدخلات، يستغل حقن XML القوة التعبيرية لـ XML نفسه، مما يؤثر على الأنظمة المعقدة بما في ذلك SOAP وSAML وأجهزة إنترنت الأشياء وتكامل المؤسسات والأنظمة المالية القديمة.
لماذا لا يزال حقن XML مهمًا
على الرغم من هيمنة JSON على التطبيقات الحديثة، إلا أن XML مدمج بعمق في برمجيات المؤسسات وبروتوكولات المصادقة والتكاملات الخلفية. يمكن للمهاجمين إساءة استخدام هياكل XML من أجل:
- العبث بمنطق العمل
- حقن العقد غير المصرح بها
- معالجة استعلامات XPath
- تشغيل الكشف عن الملفات على غرار XXE
- كسر التحقق من صحة المخطط
- التسبب في الحرمان من الخدمة المستند إلى XML
مرونة XML تجعل إساءة استخدامه قوية بشكل خاص.
مثال حقيقي لـ CVE CVE-2025-13526
يوضّح CVE-2025-13526 كيف يمكن أن يؤدي خطأ بسيط في تحليل XML إلى الكشف عن ملف كامل. حيث سمح النظام بتحميل ملفات تكوين XML، ولكنه فشل في تعطيل تحليل الكيانات الخارجية.
مثال على الحمولة الخبيثة:
xml
<!DOCTYPE بيانات [
] <>
&xxe;الاسم>التكوين>
أعاد الخادم محتويات /etc/passwdيوضح كيف يمكن لـ XML Injection مع XXE أن يكشف الملفات الحرجة.
أسطح الهجوم لحقن XML
إساءة معاملة المهاجمين
- حقن العقدة
- حقن السمة
- معالجة استعلام XPath
- التلاعب في المخطط (XSD)
- الحمولات XXE
- توسيع الكيانات لـ DoS
- تجاوز المنطق داخل تدفقات العمل المستندة إلى XML
تؤثر كل فئة على طبقة مختلفة من النظام.
أمثلة الهجوم (نفس الكمية المحفوظة)
- معالجة حقن العقدة الحقن
xml
<منتج أ</منتج أمنتج></طلب
الحمولة المحقونة:
بي جي إس كيو إس كيو إل
true
يصبح XML الناتج تالفًا هيكليًا وقد يمنح امتيازات غير مصرح بها.
حقن XPath
بايثون
الاستعلام = f"//المستخدمون/المستخدمون/المستخدمون[اسم المستخدم/النص() ='{المستخدم}'']"
المدخلات الخبيثة
باش
' أو '1'='1
هذا يكشف سجلات المستخدمين غير المصرح لهم.
الحمولة XXE Payload
xml
<!DOCTYPE foo [
] &Payload;جذر>
التلاعب بالمخطط
xml
<xs:element name="amount" type="xs:string"/>
هذا يعطل سلوك التحقق من الصحة المتوقع.
مليار ضحكة ضحكة دوس
xml
<!ENTITY a "ha"><!ENTITY b "&a;&a;"><!ENTITY c "&b;&b;">
يؤدي التوسيع الهائل إلى زيادة التحميل الزائد على المُحلل.
التقنيات الدفاعية
تعطيل قرار الكيان المعطل
بايثون
المحلل اللغوي = etree.XMLParser(resolve_entities=False, no_network=True)
استخدام المكتبات الآمنة
بايثون
استيراد defusedxml.ElementTree ك ET
التحقق من صحة المخطط القوي
بايثون
schema.validate(input_xml)
لا تسلسل سلاسل XML أبدًا
نهج أكثر أماناً:
بايثون
el = العنصر("المستخدم") name_tag.text = user_input
جدول المقارنة
| النوع | الهدف | الخطورة | التأثير |
|---|---|---|---|
| حقن XML | التلاعب بالبنية | متوسط-عالي | تجاوز المنطق |
| حقن XPath | التحكم في الاستعلام | عالية | الوصول غير المصرح به |
| XXE | إساءة استخدام المحلل التحليلي | عالية | قراءة الملف / SSRF |
| حقن المخطط | تجاوز التحقق من الصحة | متوسط | مخاطر النزاهة |

حقن XML في اختبار الاختراق الآلي
تعمل منصات اختبار الاختراق الحديثة القائمة على الذكاء الاصطناعي - مثل Penligent - على إجراء طفرة في البنية و XML، واختبار حمولة XPath، واختبار حمولة XPath، واكتشاف التهيئة الخاطئة للمحلل. هذه المنصات:
- اكتشاف أسطح الهجوم المستندة إلى XML
- تحديد نقاط الحقن
- سلوك مخطط التعلم التلقائي
- توليد حمولات متكيفة
- التحقق من صحة سلوك المحلل التحليلي في ظل تكوينات متعددة
يؤدي ذلك إلى توسيع نطاق تغطية الكشف بشكل كبير.
خطوط الأساس الأمنية وتوصيات الإصلاح الآلي
يمكن أن توفر المنصات الآلية أيضاً:
- تدقيقات تكوين المحلل التحليلي
- الكشف عن مكتبات XML غير الآمنة
- التحقق من إعدادات دقة الكيان
- تطبيق التحقق الصارم من صحة XSD
- حظر عمليات CI/CDD لعمليات XML غير الآمنة
وهذا يحول الاكتشاف إلى معالجة قابلة للتنفيذ.
سيناريو للمثال
قواعد Semgrep - حقن Python XML / XXE / تحليل غير آمن
إنشاء ملف:
semgrep-rules/python-xml-injection.yaml
يمل
'القواعد:
القاعدة 1: الاستخدام غير الآمن لـ xml.etree - المحلل الافتراضي عرضة لـ XXE
- المُعرّف: python-unsafe-xml-etree severity: رسالة الخطأ: | xml.etree.ElementTree غير آمن ل XML غير موثوق به. لا يقوم بتعطيل توسيع الكيان الخارجي افتراضيًا. استخدم defusedxml بدلاً من ذلك. بيانات التعريف: cwe: "CWE-611" owasp: "A04:2021 الكيانات الخارجية لـ XML" الأنماط:
- النمط: | استيراد xml.etree.ElementTree كلغة ET: [بايثون]
القاعدة 2: الاستخدام المباشر لـ xml.dom.minidom - محلل XML غير الآمن
- المُعرّف: python-unsafe-xml-minidom severity: رسالة الخطأ: |لا يقوم xml.dom.minidom بتعطيل DTDs أو توسيع ENTITY. لا تستخدمه مع XML غير موثوق به. بيانات التعريف: cwe: نمط "CWE-611": |استيراد xml.dom.minidom اللغات: [بايثون]
القاعدة 3: مُحلل lxml XMLParser الخطير مع resol_entities=صحيح
- المعرف: python-lxml-resolve-entities-enentities-enverity: رسالة الخطأ: | lxml XMLParser() مع resol_entities=صحيح يمكّن XXE. قم بتعيين resol_entities=False و load_dtd=False. البيانات الوصفية: cwe: نمط "CWE-611": |محلل XMLParser(resol_entities=صحيح، ...) اللغات: [بايثون]
القاعدة 4: lxml مع load_dtd=صحيح - خطير
- المعرف: python-lxml-لإكسمل-تحميل-ديتد، شدة: رسالة تحذير: | load_dtd=صحيح يتيح معالجة DTD وقد يسمح بتوسيع الكيان. تعطيل ما لم يكن مطلوبًا تمامًا. البيانات الوصفية: cwe: نمط "CWE-611": |محلل XMLParser(load_dtd=صحيح، ...) اللغات: [بايثون]
القاعدة 5: تكوين المحلل الآمن المفقود عند استخدام lxml.fromstring()
- المعرف: python-lxml-fromstring-no-safeconfig severity: رسالة تحذير: | lxml.fromstring() تم استدعاؤه بدون محلل XMLParser المقوى. تأكد من أن resol_entities=False, no_network=صحيح. البيانات الوصفية: cwe: أنماط "CWE-611":
- النمط: | من lxml استيراد etree - النمط: | etree.fromstring($XML) اللغات: [بايثون]
القاعدة 6: عدم استخدام defusedxml عند تحليل XML الخارجي
- المعرف: python-defusedxml-لا-مستعمل الشدة: رسالة INFO: | استخدام مفقود لـ defusedxml، موصى به لتحليل XML الآمن في Python. البيانات الوصفية: cwe: "CWE-611" نمط-إما:
- نمــط | etree.parse($X) - النمط: | etree.parse($X) اللغات: [بايثون]
القاعدة 7: xmltodict بدون إجبار المحلل اللغوي المعزول
- المعرف: python-xmltodict-unsafe شدة: رسالة تحذير: |يمكن لـ xmltodict استدعاء محلل XML أساسي يسمح بـ XXE. استخدم
defusedxmlالمحلل اللغوي بدلاً من ذلك. النمط: | xmltodict.parse($X) اللغات: [بايثون]
القاعدة 8: الاستخدام الخطير ل eval() على المدخلات المشتقة من XML
- المعرف: python-eval-from-xml severity: رسالة حرجة: | eval() على المدخلات المشتقة من XML قد يؤدي إلى RCE. لا تقم أبدًا بتقييم قيم XML المحللة مباشرةً. بيانات التعريف: cwe: "CWE-95" owasp: "A03:2021 حقن" الأنماط:
- نمــط | $VAL = $XML.xpath(...) - النمط: | eval($VAL) اللغات: [بايثون]
القاعدة 9: مخلل غير آمن يتم تحميله على بيانات مصدرها XML
- المعرف: python-pickle-on-xml severity: رسالة حرجة: | يمكن أن يؤدي pickle.loads() على المدخلات المشتقة من XML إلى تنفيذ تعليمات برمجية عشوائية. تجنب المخلل على بيانات المستخدم. البيانات الوصفية: cwe: أنماط "CWE-502":
- النمط: | $DATA = etree.fromstring(...) - النمط: | pickle.loads.loads($DATA) اللغات: [python]|
ماسح ضوئي كامل من بايثون SAST
هذا يكمل Semgrep من خلال البحث عن الأنماط الخطرة بما في ذلك:
- واردات محلل XML غير الآمنة
- ENTITY / DOCTYPE الاستخدام
التقييم,التنفيذ,مخلل,مارشال,تحميل yaml.loadالأنماط- مشغلات XXE في
.xml,.xsd,.wsdlالملفات
ابتكر: python_sast_scanner.py
بايثون
''#!/usr/bin/env python3"" python_sast_scanner.py ماسح ضوئي خفيف الوزن وسريع خاص بـ Python SAST متخصص في:
- حقن XML / XXE
- استخدام المحلل التحليلي غير الآمن
- الدوال الخطرة (eval، exec، pickle.loads، yaml.load) آمنة للمعلومات السرية؛ لا تنفذ أي شيفرة. يُخرج JSON وخروج غير صفري عند النتائج. """"استيراد os، re، json، sys PATTERNS = {# XML/XXE "xml_etree": r"import\s+xml\.etree\.ElementTree"، "xml_minidom": r"import\s+xml\.dom\.dom\.minidom"، "lxml_resolve_entities": r"resol_entities\s*=\sTrue","lxml_load_dtd": r"load_dtd\s=\s*صحيح"، "doctype_in_xml": r"<!DOCTYPE"، "entity_in_xml": r"<!ENTITY",

الوظائف الخطرة
"eval_usage": r"\\beval\\s*\\(","exec_usage": r"\\bexec\\s*\\(","pickle_loads": r"pickle\\.loads\\s*\\(","marshal_loads": r"marshal\\.loads\\s*\\(","yaml_unsafe_load": r"yaml\\.load\\s*\\(",
} IGNORED = {".git"، "venv"، "env"، "env"، "pycache"، "dist"، "build"، "node_modules"} تعريف مسح ملف (مسار): النتائج = []، حاول: مع فتح (مسار، "r"، ترميز = "utf-8″، أخطاء = "تجاهل") ك f: ل i، سطر في تعداد (f، 1): للقاعدة، regex في PATTERNS.items():إذا كانت re.search(regex, line): النتائج.append({"rule": rule,"line": line.strip(),"lineno": i, })باستثناء الاستثناء:تمرير إرجاع النتائج def walk(root="."): النتائج={}بالنسبة ل dp, dirs, files في os.walk(الجذر): dirs[:] = [d ل d في dirs إذا لم يكن d في IGNORED] ل f في الملفات:إذا كان f.endswith((".py",".xml",".xml",".xsd",".wsdl")): full = os.path.path.join(dp, f) hits = scanfile(full)إذا كانت النتائج: results[full] = hitsreturn results def main(): root = sys.argv[1] إذا كان len(sys.argv)>1 وإلا "." النتائج = المشي(الجذر)طباعة(json.dumps({"النتائج": النتائج، "file_count": len(results)}، المسافة البادئة=2))إذا كانت النتائج: sys.exit(3) sys.exit(0) إذا كان الاسم = "main": main()
ما الذي يغطيه هذا - نطاق بايثون SAST
حقن XML / XXE
✔محللي XML غير الآمنين ✔محللي XML غير الآمنين ✔ lxml مع حل_الكيانات=صحيح ✔ تحميل DTD (يحتمل أن يكون خطيرًا) ✔ علامات XXE في ملفات XML المخزنة
حقن الكود
✔ eval() ✔ تنفيذ()
إلغاء التسلسل غير الآمن
✔ تحميل المخلل() ✔ مارشال.الأحمال() ✔ غير آمن yaml.load()
أنماط أخرى غير آمنة
✔ ENTITY / DOCTYPE في .xml, .xsd, .wsdl ✔ xmltodict بدون محلل تحليلي مقوى
الخاتمة
يظل حقن XML Injection فئة من الثغرات الأمنية الخطيرة وذات الصلة. يتراوح تأثيرها من تجاوز منطق العمل إلى الكشف عن الملفات والحرمان من الخدمة. يعد فهم سلوكيات XML، وتأمين المحللين والتحقق من صحة البنية ودمج اختبار الاختراق الآلي خطوات أساسية في ضمان أمن التطبيقات القوي.

