JWT Lab 4
Skills
- JWT authentication bypass via jwk header injection
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio
utiliza un mecanismo basado en JWT
para manejar las sesiones
. El servidor
admite el parámetro jwk
en el encabezado del JWT
. Esto se utiliza a veces para incrustar
directamente en el token
la clave correcta de verificación
. Sin embargo, no verifica si la clave proporcionada proviene de una fuente confiable
. Para resolver
el laboratorio, debemos modificar y firmar
un JWT
que nos dé acceso al panel de administración
en /admin
y eliminar al usuario
carlos
. Podemos iniciar sesión
en nuestra propia cuenta utilizando las credenciales wiener:peter
Resolución
Al acceder
a la web
nos sale esto
Pulsamos sobre My account
y nos logueamos
con credenciales wiener:peter
Recargamos
la página
y capturamos
la petición
mediante Burpsuite
Debemos tener instalado la extensión JWT Editor
, esta extensión
nos avisará si detecta
un token
Los JWT
pueden ser de dos tipos: JWS
(JSON Web Signature) y JWE
(JSON Web Encryption). Los JWS
se utilizan para garantizar la integridad
y la autenticidad
de los datos
mediante una firma digital
, pero no cifran la información
, por lo que los datos
pueden ser leídos
, aunque no modificados
sin invalidar la firma
. En cambio, los JWE
están diseñados para proteger la confidencialidad
de los datos
mediante cifrado
, asegurando que solo las partes autorizadas
puedan acceder a la información
, pero no garantizan la autenticidad
sin mecanismos adicionales
De acuerdo con la especificación de JWS
, solo el parámetro alg
del encabezado
es obligatorio
. Sin embargo, en la práctica, los encabezados
de JWT
(también conocidos como encabezados JOSE
) a menudo contienen otros parámetros
El jwk
(JSON Web Key) proporciona un objeto JSON
incrustado que representa la clave
, el jku
(JSON Web Key Set URL) proporciona una URL
desde la cual los servidores
pueden obtener un conjunto de claves
que contiene la clave
correcta y el kid
(Key ID) que proporciona un ID
que los servidores
pueden usar para identificar la clave
correcta en casos donde hay varias claves
para elegir. Dependiendo del formato de la clave
, esto puede tener un parámetro kid
correspondiente
La especificación de JSON Web Signature
(JWS) describe un parámetro opcional
en el encabezado
llamado jwk
, que los servidores
pueden usar para incrustar
su clave pública
directamente dentro del token
en formato JWK
. Idealmente, los servidores
deberían utilizar solo una lista limitada
de claves públicas
autorizadas para verificar las firmas
de los JWT
Sin embargo, los servidores mal configurados
a veces aceptan cualquier clave
incrustada en el parámetro jwk
. Podemos explotar
este comportamiento firmando un JWT modificado
utilizando nuestra propia clave privada RSA
y luego incrustando la clave pública
correspondiente en el encabezado jwk
. Para hacer esto no dirigimos al Burpsuite
, hacemos click sobre JWT Editor
y pulsamos sobre New RSA Key
para generar
nuestra propia clave privada
Nos dirigimos al repeater
pulsamos en Attack
y pulsamos sobre Embedded JWK
, de esta forma Burpsuite
extrae la clave pública
de la clave privada
y la inyecta
en el parámetro jwk
Cambiamos
el nombre
de usuario
a administrador
y firmamos
el JWT
con la clave privada
. En este caso la extensión JWT Editor
de Burpsuite
nos actualiza
el parámetro kid
, pero si realizamos este ataque
de forma manual
deberemos actualizarlo
nosotros para que funcione
Pulsamos Ctrl + Shift + i
y pegamos
el nuevo JWT
Refrescamos
la web
con F5
, accedemos
al panel
de administrador
y borramos
al usuario carlos