JWT authentication bypass via unverified signature – PortSwigger Write Up

En este post vamos a estar resolviendo el laboratorio «JWT authentication bypass via unverified signature»:

Lo primero de todo es iniciar el laboratorio:

Una vez lo iniciamos, nos dirigimos a «My account» e iniciamos sesión con las credenciales que nos dan en la descripción del laboratorio:

Ahora que ya estamos autenticados, si observamos las cookies que tenemos, podemos observar como tenemos una cookie llamada «session» la cual es un JWT:

Si copiamos este valor y lo colocamos en jwt.io, podemos ver la estructura del JWT:

En este caso, en la parte del payload, podemos observar el campo de «sub» que tiene como valor el nombre de nuestro usuario. Por lo que algo que se nos puede ocurrir al ver esto es que este campo defina el usuario con el que se está autenticado.

En este punto, si conocemos las vulnerabilidades referentes a JWT se nos pueden ocurrir varias cosas a probar, sin embargo, en este caso, el JWT es vulnerable a «unverified signature». Esto quiere decir que el servidor no revisa si la firma del token JWT es correcta o no, por tanto, sin conocer en este caso la clave pública ni nada, podemos editar el token JWT a nuestro placer debido a que el servidor no va a revisar si el token está firmado correctamente o no.

Como la firma entonces nos da igual, lo que nos interesa es modificar el campo de «sub» para ver si podemos autenticarnos como otro usuario, en este caso, «administrator».

Esta tarea de modificar el JWT se puede hacer de diversas formas, por ejemplo, usando la herramienta jwtear:

  • jwtear jws -h <header> -p <payload>

En este caso, también le modificamos el algoritmo a «None» porque si lo dejamos en RSA nos pedirá una clave para firmar el token. Que realmente, como no lo verifica, podríamos dejar el mismo algoritmo y firmarlo con cualquier clave. También funciona si modificamos el algoritmo a HMAC y lo firmamos con cualquier secret. Por simplicidad, lo modificamos a «None» y listo.

Con el JWT que acabamos de generar, si lo sustituimos por el que teníamos y actualizamos para usarlo:

Nos convertimos en «administrator».

Ya para resolver el laboratorio, nos dirigimos al panel de administración y eliminamos el usuario «carlos».

De esta manera se resuelve el primer laboratorio de JWT :).

Todo el procedimiento de edición del JWT lo podríamos haber hecho también usando el plugin de burp suite «JSON Web Tokens». En este caso, interceptaríamos una petición al perfil y la mandamos al repeater:

Una vez en el repeater, seleccionamos la extensión:

En la nueva interfaz que se habilita, podemos observar las distintas partes del JWT decodeadas y separadas. En este caso, simplemente tendríamos que editar «wiener» por «administrator» y mandar la petición

De esta manera también funcionaría, y en este caso, no hemos editado ni la firma ni el algoritmo, solo el payload. Todo debido a lo que ya hemos comentado, al servidor le da bastante igual la firma del JWT.

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Subir para arriba