כותרת Penligent

הסבר על הזרקת XML: סיכונים, התקפות אמיתיות ומדריך הגנה מקיף

הזרקת XML היא מניפולציה של קלט XML כדי לשנות את האופן שבו יישום מפרש או מפרש נתונים. היא מתרחשת כאשר קלט הנשלט על ידי המשתמש מוחדר למסמך XML ללא אימות נאות, מה שמאפשר לתוקפים להזריק צמתים, תכונות, ישויות או מטענים המשנים את זרימת הבקרה, עוקפים את ההיגיון או מפעילים התנהגויות מסוכנות של המפרש. במערכות האקולוגיות של ימינו, הכבדות ב-API ומונעות אינטגרציה, הזרקת XML נותרת איום ממשי שצוותי האבטחה אינם יכולים להתעלם ממנו.

בניגוד לחבלה פשוטה בקלט, הזרקת XML מנצלת את כוח הביטוי של XML עצמו, ומשפיעה על מערכות מורכבות, כולל SOAP, SAML, מכשירי IoT, אינטגרציות ארגוניות ומערכות פיננסיות מסורתיות.

מדוע הזרקת XML עדיין חשובה

למרות ש-JSON שולט ביישומים מודרניים, XML מוטמע עמוק בתוכנות ארגוניות, בפרוטוקולי אימות ובאינטגרציות אחוריות. תוקפים יכולים לנצל לרעה מבני XML כדי:

  • לשנות את הלוגיקה העסקית
  • הזרקת צמתים לא מורשים
  • לערוך שאילתות XPath
  • הפעלת חשיפת קבצים בסגנון XXE
  • שבירת אימות סכימה
  • גורם למניעת שירות מבוססת XML

הגמישות של XML הופכת את השימוש הבלתי נאות בו למסוכן במיוחד.

דוגמה אמיתית ל-CVE: CVE-2025-13526

CVE-2025-13526 מדגים כיצד תצורה שגויה של ניתוח XML פשוט עלולה להוביל לחשיפת קבצים מלאה. המערכת אפשרה העלאת קבצי תצורה XML, אך לא הצליחה להשבית את פתרון הישויות החיצוניות.

דוגמה למטען זדוני:

xml

<!DOCTYPE data [

]>

&xxe;

השרת החזיר את התוכן של /etc/passwd, המדגים כיצד הזרקת XML בשילוב עם XXE עלולה לחשוף קבצים קריטיים.

משטחי תקיפה של הזרקת XML

התוקפים מנצלים לרעה:

  • הזרקת צומת
  • הזרקת תכונות
  • מניפולציה של שאילתות XPath
  • מניפולציה של סכמה (XSD)
  • מטעני XXE
  • הרחבת ישויות עבור DoS
  • עקיפת לוגיקה בתוך זרימות עבודה מבוססות XML

כל קטגוריה משפיעה על שכבה אחרת של המערכת.

דוגמאות להתקפה (אותה כמות נשמרה)

  1. מניפולציה של הזרקת צמתים

xml

מוצר A

מטען מוזרק:

pgsql

true

ה-XML שנוצר נפגם מבחינה מבנית ועשוי להעניק הרשאות לא מורשות.

הזרקת XPath

פייתון

שאילתה = f"//users/user[username/text()='{user}']"

קלט זדוני:

לנזוף

' או '1'='1

זה חושף רשומות משתמשים לא מורשים.

מטען XXE

xml

<!DOCTYPE foo [

]>&payload;

מניפולציה של סכמות

xml

<xs:element name="amount" type="xs:string"/>

פעולה זו מבטלת את התנהגות האימות הצפויה.

מיליארד צחוקים DoS

xml

<!ENTITY a "ha"><!ENTITY b "&a;&a;"><!ENTITY c "&b;&b;">

התרחבות מסיבית מעמיסה על המנתח.

טכניקות הגנה

השבת פתרון ישויות

פייתון

parser = etree.XMLParser(resolve_entities=False, no_network=True)

השתמש בספריות בטוחות

פייתון

ייבא defusedxml.ElementTree כ-ET

אימות סכמה חזק

פייתון

schema.validate(input_xml)

לעולם אל תחבר מחרוזות XML

גישה בטוחה יותר:

פייתון

el = Element("user") name_tag.text = user_input

טבלה השוואתית

סוגיעדחומרההשפעה
הזרקת XMLמניפולציה של מבניםבינוני-גבוהעקיפת לוגיקה
הזרקת XPathבקרת שאילתותגבוהגישה לא מורשית
XXEשימוש לא נכון ב-Parserגבוהקריאת קובץ / SSRF
הזרקת סכמהעקיפת אימותבינוניסיכוני יושרה
הזרקת XML

הזרקת XML בבדיקות חדירה אוטומטיות

פלטפורמות בדיקת חדירה מודרניות המונעות על ידי בינה מלאכותית, כגון Penligent, מבצעות מוטציה מבנית, פוזינג XML, בדיקת מטען XPath וזיהוי תצורה שגויה של מפרש. פלטפורמות אלה:

  • גלה משטחי תקיפה מבוססי XML
  • זהה נקודות הזרקה
  • התנהגות סכימה של למידה אוטומטית
  • יצירת מטענים אדפטיביים
  • אמת את התנהגות המנתח תחת תצורות מרובות

זה מרחיב באופן משמעותי את כיסוי הזיהוי.

קווי בסיס אבטחה והמלצות לתיקונים אוטומטיים

פלטפורמות אוטומטיות יכולות גם לספק:

  • ביקורות תצורת המנתח
  • איתור ספריות XML לא בטוחות
  • אימות הגדרות פתרון ישויות
  • אכיפת אימות XSD קפדני
  • חסימת CI/CD של פעולות XML לא מאובטחות

זה הופך את הזיהוי לתיקון בר-ביצוע.

תסריט לדוגמה

כללי Semgrep — הזרקת XML ב-Python / XXE / ניתוח לא בטוח

צור קובץ:

semgrep-rules/python-xml-injection.yaml

yaml

`כללים:

כלל 1: שימוש לא בטוח ב-xml.etree – מפרש ברירת המחדל פגיע ל-XXE

  • id: python-unsafe-xml-etree חומרה: שגיאה הודעה: | xml.etree.ElementTree אינו בטוח עבור XML שאינו מהימן. הוא אינו מבטל את הרחבת הישויות החיצוניות כברירת מחדל. השתמש ב-defusedxml במקום. מטא-נתונים: cwe: "CWE-611" owasp: "A04:2021 ישויות חיצוניות ב-XML" תבניות:
    • תבנית: | ייבוא xml.etree.ElementTree כ-ET שפות: [python]

כלל 2: שימוש ישיר ב-xml.dom.minidom – מפרש XML לא בטוח

  • id: python-unsafe-xml-minidom חומרה: שגיאה הודעה: | xml.dom.minidom אינו מבטל DTDs או הרחבת ENTITY. אל תשתמש בו עבור XML שאינו אמין. מטא-נתונים: cwe: "CWE-611" תבנית: | import xml.dom.minidom שפות: [python]

כלל 3: lxml XMLParser מסוכן עם resolve_entities=True

  • id: python-lxml-resolve-entities-enabled חומרה: ERROR הודעה: | lxml XMLParser() עם resolve_entities=True מאפשר XXE. הגדר resolve_entities=False ו-load_dtd=False. מטא-נתונים: cwe: “CWE-611” תבנית: | XMLParser(resolve_entities=True, …) שפות: [python]

כלל 4: lxml עם load_dtd=True – מסוכן

  • id: python-lxml-load-dtd חומרה: אזהרה הודעה: | load_dtd=True מאפשר עיבוד DTD ועשוי לאפשר הרחבת ישויות. יש להשבית אלא אם כן הדבר נחוץ בהחלט. מטא-נתונים: cwe: "CWE-611" תבנית: | XMLParser(load_dtd=True, …) שפות: [python]

כלל 5: תצורת מפרש בטוחה חסרה בעת שימוש ב-lxml.fromstring()

  • id: python-lxml-fromstring-no-safe-config חומרה: אזהרה הודעה: | lxml.fromstring() נקרא ללא XMLParser מחוזק. ודא ש-resolve_entities=False, no_network=True. מטא-נתונים: cwe: “CWE-611” תבניות:
    • תבנית: | מ-lxml ייבוא etree – תבנית: | etree.fromstring($XML) שפות: [python]

כלל 6: אי שימוש ב-defusedxml בעת ניתוח XML חיצוני

  • id: python-defusedxml-not-used חומרה: INFO הודעה: | שימוש חסר ב-defusedxml, מומלץ לניתוח XML מאובטח ב-Python. מטא-נתונים: cwe: “CWE-611” pattern-either:
    • תבנית: | ET.parse($X) – תבנית: | etree.parse($X) שפות: [python]

כלל 7: xmltodict ללא אילוץ מפרש מנוטרל

  • id: python-xmltodict-unsafe חומרה: אזהרה הודעה: | xmltodict יכול להפעיל מפרש XML בסיסי המאפשר XXE. השתמש defusedxml במקום זאת, משתמשים במנתח תחבירי. תבנית: | xmltodict.parse($X) שפות: [python]

כלל 8: שימוש מסוכן ב-eval() בקלט שמקורו ב-XML

  • id: python-eval-from-xml חומרה: קריטית הודעה: | eval() על קלט שמקורו ב-XML עלול להוביל ל-RCE. לעולם אל תעריך ערכי XML מפורשים ישירות. מטא-נתונים: cwe: "CWE-95" owasp: "A03:2021 הזרקה" תבניות:
    • תבנית: | $VAL = $XML.xpath(…) – תבנית: | eval($VAL) שפות: [python]

כלל 9: עומסים לא בטוחים על נתונים שמקורם ב-XML

  • id: python-pickle-on-xml חומרה: קריטית הודעה: | pickle.loads() על קלט שמקורו ב-XML עלול להוביל לביצוע קוד שרירותי. הימנע משימוש ב-pickle על נתוני משתמש. מטא-נתונים: cwe: "CWE-502" תבניות:
    • תבנית: | $DATA = etree.fromstring(…) – תבנית: | pickle.loads($DATA) שפות: [python]`

סורק SAST מלא ב-Python

זה משלים את Semgrep על ידי סריקה אחר תבניות מסוכנות, כולל:

  • ייבוא לא בטוח של מפרש XML
  • שימוש ב-ENTITY / DOCTYPE
  • eval, exec, מלפפון חמוץ, מרשל, yaml.load דפוסים
  • XXE מפעיל ב .xml, .xsd, .wsdl קבצים

צור: python_sast_scanner.py

פייתון

`#!/usr/bin/env python3″”” python_sast_scanner.py סורק SAST קל משקל ומהיר המיועד במיוחד ל-Python ומתמחה ב:

  • הזרקת XML / XXE
  • שימוש לא בטוח ב-parser
  • פונקציות מסוכנות (eval, exec, pickle.loads, yaml.load) בטוח עבור CI; אינו מבצע כל קוד. פלט JSON ויציאה שאינה אפסית על ממצאים. “””import os, re, json, sys PATTERNS = {# XML / XXE "xml_etree": r"import\s+xml\.etree\.ElementTree","xml_minidom": r"import\s+xml\.dom\.minidom","lxml_resolve_entities": r"resolve_entities\s*=\sTrue", "lxml_load_dtd": r"load_dtd\s=\s*True”,”doctype_in_xml”: r”<!DOCTYPE”,”entity_in_xml”: r”<!ENTITY”,
הזרקת XML PoC בלחיצה אחת

פונקציות מסוכנות

"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", "pycache", "dist", "build", "node_modules"} def scan_file(path): findings = []try:with open(path, "r", encoding="utf-8", errors=”ignore”) as f:for i, line in enumerate(f, 1):for rule, regex in PATTERNS.items():if re.search(regex, line): findings.append({“rule”: rule,”line”: line.strip(),”lineno”: i, })except Exception:pass return findings def walk(root=”.”): results={}for dp, dirs, files in os.walk(root): dirs[:] = [d for d in dirs if d not in IGNORED]for f in files:if f.endswith((“.py”,”.xml”,”.xsd”,”.wsdl”)): full = os.path.join(dp, f) hits = scan_file(full)if hits: results[full] = hitsreturn results def main(): root = sys.argv[1] if len(sys.argv)>1 else “.” results = walk(root)print(json.dumps({“results”: results, “file_count”: len(results)}, indent=2))if results: sys.exit(3) sys.exit(0) if name == “main”: main()`

מה זה מכסה – היקף SAST ב-Python

הזרקת XML / XXE

✔ מפרשי XML לא בטוחים ✔ lxml עם resolve_entities=True ✔ טעינת DTD (עלולה להיות מסוכנת) ✔ סמני XXE בקבצי XML מאוחסנים

הזרקת קוד

eval()exec()

דה-סריאליזציה לא בטוחה

pickle.loads()marshal.loads() ✔ לא בטוח yaml.load()

דפוסים מסוכנים אחרים

✔ ENTITY / DOCTYPE ב .xml, .xsd, .wsdl ✔ xmltodict ללא מפרש מחוזק

סיכום

הזרקת XML נותרה קטגוריה רלוונטית ומסוכנת של פגיעות. השפעתה נעה מעקיפת לוגיקה עסקית ועד חשיפת קבצים ומניעת שירות. הבנת התנהגות XML, אבטחת מפרסים, אימות מבנה ושילוב בדיקות חדירה אוטומטיות הם צעדים חיוניים להבטחת אבטחת יישומים חזקה.

שתף את הפוסט:
פוסטים קשורים