לדלג לתוכן

מה זה XXE - כשמסמך XML תמים חושף קבצים מהשרת

רוב האנשים שמתחילים בפריצת אתרים מכירים את XSS ו-SQL Injection, אבל הרבה פחות מכירים את XXE, למרות שהיא הופיעה לא מעט פעמים ברשימת OWASP Top 10 ויכולה להיות הרסנית לא פחות. הסיבה שהיא פחות מוכרת היא שהיא דורשת קצת יותר הבנה של איך פורמט XML עובד, אז בואו נתחיל משם.

רגע, מה זה בכלל XML

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

אז מה זה בעצם ישות חיצונית

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

<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>

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

מה עוד אפשר לעשות עם XXE, מעבר לקריאת קבצים

חוץ מקריאת קבצים רגישים מהשרת, XXE יכולה לשמש גם כדי לגרום לשרת לשלוח בקשות רשת למקומות שהוא לא אמור לגשת אליהם - וזה למעשה חופף לחולשת SSRF. במקרים מסוימים, תלוי בהגדרות הספציפיות של השרת, אפשר אפילו להגיע להרצת קוד מרחוק, או לגרום לשרת "להיתקע" תוך ניצול הגדרה שגורמת לו לנסות להרחיב ישות שמפנה לעצמה שוב ושוב, במה שנקרא לפעמים "פצצת XML" - צריכת משאבים עד קריסה.

למה זה עדיין קורה, למרות שהפתרון פשוט יחסית

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

איפה נתקלים בזה בפועל

חולשת XXE יכולה להופיע בכל מקום שבו האתר מעבד קלט XML - ממשקי API ישנים יותר, טפסים שמקבלים קובצי SVG (שגם הם בעצם XML), ואפילו קבצי Office מסוימים כמו DOCX שהם למעשה ארכיון שמכיל בפנים קבצי XML.

איך מגנים מפני XXE

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

איך לומדים לזהות את זה בעצמכם

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

בקורס פריצת אתרים אנחנו מכסים את XXE בפרק חולשות צד השרת, ומראים איך היא קשורה לחולשות אחרות כמו SSRF, כדי שתבינו את התמונה המלאה ולא רק חולשה בודדת מבודדת.

לסיכום

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

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