Skip to content

Un flujo práctico de pentest para JWT

Una secuencia probada para evaluar JWT: captura, decodificación, claims, claves, replay y reporte.

Publicado el 3 min de lectura

Un buen pentest de JWT no es una bolsa de trucos lanzados al azar contra un token. Es un flujo de trabajo. Capturas tokens de flujos reales, clasificas emisores y audiencias, entiendes dónde ocurre la verificación y luego pruebas fallos específicos con evidencia. El objetivo no es demostrar que los JWT dan miedo. El objetivo es mostrar dónde esta implementación confía en lo equivocado.

Captura e inventario

Empieza capturando tokens de login, refresh, reset de contraseña, enlaces de invitación, APIs móviles, upgrades websocket y requests en segundo plano. Ponlos en una tabla con emisor, audiencia, algoritmo, kid, vida, scopes y dónde se acepta cada token. No pegues tokens reales de producción en notas compartidas. Guarda encabezados y payloads redactados, y conserva secretos en el vault de pruebas.

Decodifica antes de atacar. Muchos hallazgos aparecen en claims visibles: vidas largas, ausencia de aud, scopes amplios, identificadores de tenant, flags de email verificado o campos debug que no deberían salir del emisor. Compara tokens de dos usuarios y dos tenants. Las diferencias suelen revelar el modelo de autorización más rápido que el código fuente.

Pruebas de firma y claves

Prueba pinning de algoritmo, alg: none, confusión HS256 contra RS256, kid desconocido, kid duplicado y comportamiento de caché JWKS. En cada prueba, cambia una variable. Mantén exp, iss y aud válidos salvo que estés probándolos. Si todos los tokens manipulados reciben el mismo rechazo temprano, eso es buena evidencia. Si endpoints distintos fallan distinto, mapea la división.

Abuso de claims y autorización

Modifica sub, tenant_id, org_id, role, scope y feature flags. Prueba acceso a objetos entre tenants con un token válido de bajo privilegio. En GraphQL, prueba autorización por resolver, no solo el endpoint HTTP. En descargas de archivos, separa la creación de URL firmada y la descarga real. Muchos sistemas autorizan una parte y olvidan la otra.

Replay y ciclo de vida

Comprueba si logout revoca algo en servidor. Reutiliza refresh tokens antiguos después de rotación. Prueba tokens expirados justo dentro y fuera del margen de reloj. Usa tokens después de cambio de contraseña, reset de MFA, retirada de rol y deshabilitación de usuario. Los bugs de ciclo de vida suelen ser más explotables que errores criptográficos raros porque encajan con tiempos reales de ataque.

Reportar bien

Un buen informe incluye propiedad exacta del token cambiada, endpoint, resultado esperado, resultado real e impacto. Evita volcar tokens. Incluye pasos de reproducción seguros con payloads redactados y timestamps. La remediación suele ser concreta: fijar RS256 para el emisor X, rechazar kid desconocido sin fetch ilimitado, revalidar propiedad de tenant en la ruta Y.

Artículos relacionados

Cómo aparece la confusión de algoritmos cuando los verificadores mezclan claves simétricas y asimétricas, con pruebas concretas.
Cómo inspeccionar problemas JWT de forma segura en logs, tickets, CLI, capturas y canales de incidente sin propagar bearer tokens.
Guía operativa para claves de firma JWT: generación, almacenamiento, KMS, rotación, control de acceso, auditoría y respuesta.