
Script simple de Python para verificar contra una vulnerabilidad hipotética de JWT.
Script simple de Python para verificar una vulnerabilidad hipotética de JWT.
Supongamos que hay una aplicación que utiliza tokens JWT firmados con el algoritmo HS256. Un token de ejemplo se ve así:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.zbgd5BNF1cqQ_prCEqIvBTjSxMS8bDLnJAE_wE-0Cxg
El token anterior se puede decodificar a los siguientes datos:
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Para calcular la firma se utiliza el siguiente secreto:
supersecret
El siguiente pseudocódigo se usa para calcular la firma:
$alg = "sha256";
$data = "...";
$key = "supersecret";
hmac($alg, $data, $key);
Pero, ¿qué pasa si se inyecta un campo inesperado "kid":0 en el encabezado?
{
"alg": "HS256",
"typ": "JWT",
"kid": 0
}
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
El campo kid es una forma estándar de elegir una clave. Mi suposición es que, si el campo kid no es esperado, puede haber una implementación vulnerable que trate el valor de la cadena $key como un array:
hmac($alg, $data, $key[kid]);
Como resultado, se usará el valor "s" ($key[0]) como secreto HMAC.
El script injector.py toma el token JWT original, inyecta el campo "kid":0 en el encabezado y genera tokens firmados con secretos de una sola letra (códigos ASCII: 32 - 126 [{space}, !, ", #, ..., x, y, z, {, |, }, ~]):
python3 injector.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.zbgd5BNF1cqQ_prCEqIvBTjSxMS8bDLnJAE_wE-0Cxg
Como resultado se crean dos archivos: tokens.txt y tokens_meta.txt. tokens.txt contiene los tokens generados y puede usarse como lista de cargas útiles para Burp Intruder. Si algún token es válido (lo que indica que la aplicación es vulnerable), el archivo tokens_meta.txt se puede usar para verificar qué algoritmo y secreto se usaron para generar el token dado. El archivo tokens_meta.txt contiene los siguientes datos:
token1:algorithm:secret
...
token{n}:algorithm:secret
Consulte el CHANGELOG para ver los cambios.