Flask Cookie Forge & Decoder
Decodifica cookies de sesión Flask itsdangerous o forja firmadas — para CTF challenges y pruebas autorizadas.
Decodificar Cookie
Decodificar y verificar una cookie Flask existenteForjar Cookie
Generar una cookie Flask firmada válidaCómo funciona
Flask usa la biblioteca itsdangerous para firmar las cookies de sesión con HMAC. El formato de cookie son tres segmentos base64url separados por puntos: PAYLOAD.TIMESTAMP.SIGNATURE. La derivación de clave es HMAC-{algo}(key=secret, msg=salt) — la clave derivada se usa para calcular HMAC-{algo}(key=derived, msg=PAYLOAD.TIMESTAMP). Esta herramienta decodifica y opcionalmente verifica cualquier cookie de sesión Flask, luego te permite forjar una nueva — todo del lado del servidor en PHP sin almacenar ninguna entrada.
- 1. Get the cookie: intercepta la solicitud objetivo en Burp Suite o DevTools del navegador y copia el valor de la cookie de sesión.
- 2. Decode: pega la cookie para revelar el payload JSON sin necesitar una clave — las cookies Flask están firmadas, no cifradas.
- 3. Obtener la SECRET_KEY: encuéntrala en la configuración de la app objetivo, un .env filtrado, historial de git, o crackéala a partir de la firma conocida.
- 4. Modify & forge: cambia el payload JSON (p.ej. establece user_id o is_admin), ingresa la SECRET_KEY y forja una nueva cookie firmada válida.
- 5. Inject: reemplaza la cookie de sesión en tu solicitud y reenvía.
¿Qué son las cookies de sesión Flask?
Flask almacena el diccionario de sesión completo directamente en la cookie del navegador — no hay almacén de sesión del lado del servidor por defecto. El objeto de sesión se serializa en JSON, opcionalmente se comprime con zlib, se codifica en base64url y se firma con HMAC usando la SECRET_KEY de la app. La firma previene la manipulación, pero como el payload no está cifrado, cualquiera puede leer los datos de sesión sin la clave. Esto convierte a las cookies de sesión Flask en un objetivo habitual en CTF web challenges.
payload
Objeto JSON codificado en base64url (comprimido con zlib si tiene un punto como prefijo). Contiene los datos de sesión — user_id, roles, token CSRF, etc.
timestamp
Época Unix big-endian de 4 bytes empaquetada en base64url. Presente en cookies con tiempo (URLSafeTimedSerializer). Usada para comprobaciones de expiración de cookies.
signature
base64url(HMAC-{algo}(derived_key, PAYLOAD.TIMESTAMP)). Clave derivada = HMAC-{algo}(secret_key, salt). El salt predeterminado es "cookie-session".
compression
itsdangerous comprime el payload con zlib deflate cuando la compresión ahorra espacio. Los payloads comprimidos tienen un punto como prefijo antes de la codificación base64url.
Preguntas frecuentes
¿Envía mi cookie o SECRET_KEY a algún lugar?
No. Toda la decodificación y firma ocurre del lado del servidor en PHP. No se almacena, registra ni transmite ningún dato a terceros.
¿Puedo leer el payload sin la SECRET_KEY?
Sí — las cookies Flask están firmadas pero no cifradas. Pega la cookie sin una clave para ver instantáneamente los datos de sesión JSON. Solo necesitas la SECRET_KEY para verificar o forjar una firma válida.
¿Cómo funciona la derivación de clave de itsdangerous?
itsdangerous deriva una clave de firma como HMAC-{algo}(key=secret_key, msg=salt). La firma es entonces HMAC-{algo}(key=derived_key, msg=PAYLOAD.TIMESTAMP). Esto difiere de un HMAC directo — el salt añade separación de dominio entre diferentes usos de la misma clave secreta.
¿Qué algoritmo debo elegir al forjar?
HMAC-SHA1 es el predeterminado de Flask/itsdangerous. Usa HMAC-SHA512 solo si la app objetivo lo configura explícitamente. Puedes detectar el algoritmo probando ambos durante la decodificación — esta herramienta prueba sha1 primero, luego sha512.
La decodificación falla o la firma es inválida — ¿por qué?
Asegúrate de pegar el valor de cookie en bruto sin codificación URL (%3D etc). La herramienta gestiona la entrada URL-codificada automáticamente. Para la verificación de firma, comprueba que la SECRET_KEY es correcta y que el salt coincide con la app objetivo (el predeterminado es "cookie-session").