Parte: 4 — Seguridad de aplicaciones web · Fuente: Bug Bounty Bootcamp (Vickie Li) / RFC 7519 ⏱️ Duración estimada: 110 min · Nivel: Avanzado
Auditar la seguridad de los JSON Web Tokens (JWT), hoy omnipresentes en APIs y SPAs. Aprenderás a decodificarlos, detectar implementaciones inseguras y explotar fallos clásicos: alg:none, confusión de algoritmos, claves débiles y falta de verificación de firma.
⚠️ Ética: solo en labs propios/autorizados. Forjar tokens de sistemas ajenos es un delito.
Al finalizar, el alumno podrá:
alg:none y la aceptación de firma vacía.| # | Tema | Por qué importa |
|---|---|---|
| 1 | Estructura y claims de JWT | Base para atacar |
| 2 | Algoritmos: HS256 vs. RS256 | El eje de varios ataques |
| 3 | alg:none |
Bypass de firma |
| 4 | Confusión de algoritmos | Firmar con la clave pública |
| 5 | Claves HMAC débiles | Crackeo offline |
| 6 | Claims: exp, iss, aud, kid | Fallos de validación |
| 7 | Defensa: verificar firma y alg | Cierre del fallo |
alg:none: algoritmo que indica "sin firma". Característica: si el servidor lo acepta, cualquiera forja tokens.alg.kid (key id): cabecera que indica qué clave usar. Característica: inyectable (path traversal, SQLi) si no se valida.exp: expiración del token. Característica: si no se valida, los tokens no caducan.git clone https://github.com/ticarpi/jwt_tool && cd jwt_tool && pip install -r requirements.txt
⚠️ Solo en labs propios.
"alg":"none", elimina la firma y modifica un claim (p. ej. role: admin).hashcat -m 16500 token.txt wordlist.txt
kid para apuntar a un archivo/valor controlado.exp: reusa un token caducado.Resuelve un lab de JWT de PortSwigger (alg:none, clave débil o confusión de algoritmos) y escala a administrador forjando un token. Criterio de aceptación: el lab queda resuelto, entregas el token forjado, el ataque usado y la corrección (verificar firma, fijar el algoritmo esperado, secreto fuerte).
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| alg:none rechazado | Servidor valida el algoritmo; prueba otro ataque |
| Confusión no funciona | La librería fija el alg; documenta como fortaleza |
| hashcat no crackea | Secreto fuerte; solo funciona con claves débiles |
| Token modificado rechazado | La firma sí se verifica; revisa el vector |
| kid no explotable | Se valida contra allowlist; correcto |
❓ ¿JWT es inseguro? No por sí mismo. Los fallos vienen de implementaciones que no verifican bien la firma o el algoritmo.
❓ ¿Puedo revocar un JWT? No fácilmente por ser stateless. Se usan expiraciones cortas y listas de revocación o rotación de claves.
❓ ¿Guardo el JWT en localStorage o cookie? Cookie HttpOnly reduce el robo vía XSS; localStorage es accesible por JS. Cada opción tiene trade-offs de CSRF/XSS.
Clase 102 — Gestión de sesiones y ataques asociados