PortSwigger · JWT Attacks
Qué es
Un JWT (JSON Web Token) es un token de sesión en tres partes separadas por puntos: cabecera, datos (payload) y firma, todo en Base64URL. La firma es lo que impide que lo modifique. Si el servidor no la comprueba bien, puedo cambiar los datos y hacerme pasar por otro usuario.
Labs completados
| # | Lab | Tipo |
|---|---|---|
| 1 | JWT authentication bypass via unverified signature | Unverified signature |
Lo que me llevo
- Inicio sesión e intercepto la petición con Burp. La cookie de sesión es un JWT.
- Lo decodifico (con la extensión JWT Editor de Burp o en jwt.io): el campo
subcontiene mi usuario. - Cambio
subporadministrator, no toco la firma y envío el token modificado a/admin. - Responde
200 OK: el servidor decodifica pero no verifica la firma.
Cómo se arregla
- Verificar siempre la firma con la librería (no usar funciones de solo decodificar).
- Fijar el algoritmo esperado y rechazar
alg: none. - Claves de firma largas y secretas.
