Laravel Cookie Forge & Decodificador
Decodifica cookies cifradas AES de Laravel o forja firmadas — para retos CTF y pruebas autorizadas.
Decodificar Cookie
Descifrar y verificar una cookie existenteForjar Cookie
Generar una cookie de Laravel firmada válidaCómo funciona
Laravel cifra las cookies con AES-256-CBC (o las variantes AES-128-CBC / GCM) usando la APP_KEY de tu archivo .env. El valor cifrado es un JSON en base64 que contiene un IV, el texto cifrado y una firma HMAC-SHA256. Esta herramienta descifra y verifica la firma, o falsifica una cookie válida desde cero. Ambas operaciones ocurren en el servidor, en PHP, sin almacenar ninguna entrada.
- 1. Obtén la cookie: intercepta la petición en Burp Suite o en las DevTools del navegador y copia el valor de la cookie laravel_session.
- 2. Obtén la APP_KEY: encuéntrala en el .env del objetivo, en una configuración filtrada, o crackéala a partir de texto plano conocido.
- 3. Decodificar: pega ambos arriba y decodifica para revelar el payload de sesión (ID de usuario, token CSRF, datos flash).
- 4. Modificar y falsificar: cambia el payload (por ejemplo, elevando user_id), pega la APP_KEY y falsifica una nueva cookie firmada válida.
- 5. Inyectar: sustituye la cookie original en tu petición y vuelve a enviarla.
¿Qué son las cookies cifradas de Laravel?
Laravel cifra y firma automáticamente todas las cookies establecidas mediante Cookie::make() o el helper cookie (salvo que se excluyan con $except en el middleware EncryptCookies). La cookie de sesión (laravel_session por defecto) usa el driver de sesión cookie solo cuando SESSION_DRIVER=cookie; de lo contrario, solo contiene un puntero de ID de sesión cifrado. En los retos CTF, las apps suelen usar el driver cookie para almacenar todo el payload de sesión directamente en la cookie.
iv
Vector de inicialización. Se genera aleatoriamente en cada operación de cifrado. Codificado en Base64 dentro del payload JSON.
value
El texto cifrado con AES. Codificado en Base64. openssl_encrypt() con flags=0 (por defecto) devuelve base64 directamente.
mac
HMAC-SHA256 de base64(iv) concatenado con base64(value), con la clave de los bytes en bruto de APP_KEY. Ausente en cifrados GCM.
tag
Etiqueta de autenticación GCM. Se usa en lugar de HMAC para los cifrados AES-256-GCM y AES-128-GCM (Laravel 10+).
Preguntas frecuentes
¿Envía mi cookie o APP_KEY a algún lugar?
No. El descifrado y cifrado ocurren del lado del servidor en PHP usando openssl_decrypt / openssl_encrypt. No se almacena, registra ni transmite ningún dato a terceros.
¿Qué es el driver de sesión cookie?
Cuando se establece SESSION_DRIVER=cookie en .env, Laravel serializa todo el array de sesión, lo cifra y lo almacena directamente en la cookie del navegador. Esto es común en configuraciones de retos CTF. La mayoría de las apps de producción usan los drivers file, database o Redis, donde solo se guarda un ID de sesión cifrado en la cookie.
¿Cómo funciona la firma HMAC?
Laravel calcula hash_hmac("sha256", base64(iv) . base64(ciphertext), raw_key). Tanto la IV como el texto cifrado usados en el cálculo del MAC son las versiones codificadas en base64 almacenadas en el JSON, no los bytes en bruto.
¿Qué cifrado debo elegir al forjar?
Haz coincidir el cifrado con el que usa la app objetivo. El valor por defecto en Laravel 5-9 es AES-256-CBC. Laravel 10+ admite AES-256-GCM. Puedes detectarlo por la presencia del campo tag en la estructura de la cookie decodificada (GCM tiene un campo tag no vacío; CBC tiene mac en su lugar).
El descifrado falla incluso con la APP_KEY correcta — ¿por qué?
Verifica que estás pegando el valor en crudo y no una versión codificada en URL. Algunos frameworks codifican las cookies dos veces. También verifica el formato de la clave: Laravel lo almacena como base64:xxx en .env — pégalo exactamente como aparece allí.