Authentication bypass via encryption oracle
Laboratorio de Portswigger sobre Business Logic Vulnerabilities
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio contiene un fallo lógico que expone un oracle cifrado a los usuarios. Para resolver el laboratorio, debemos explotar este fallo para obtener acceso al panel de administración 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 vemos esto
Hacemos click sobre My account y nos logueamos con las credenciales wiener:peter
Al loguearnos vemos esto
Si hacemos click sobre View post vemos que tenemos una sección de comentarios
En este caso el email que proporcionamos no hace falta que cumpla un patrón en concreto
Al usar un email inválido nos muestra este mensaje
Si recargamos la página y capturamos la petición con Burpsuite vemos que se ha asignado una nueva cookie llamada notification
Si nos fijamos vemos que tanto notification como stay-logged-in tienen el mismo formato, notification es el email que hemos proporcionado pero cifrado, sin embargo, está siendo descifrado. Por lo tanto si el valor de notification está siendo descifrado si cambiamos ese valor por el de stay-logged-in también lo descifrará
Vamos a hacer este comentario para que nos cree una cookie con el nombre de administrator y así podamos iniciar sesión
El problema es que al publicar el comentario nos arroja un error, habría que intentar que en la cookie solo apareciera administrator:1740393673294. Actualmente el Invalid email address: es parte de la cookie, por lo tanto no podemos usarla para iniciar sesión
El texto Invalid email address: tiene un total de 23 caracteres, esto lo podemos comprobar es https://www.contadordecaracteres.com/
Si copiamos la cadena HokaDFQLTaLOScegXUavsZ%2fsDPNHTvifB04CMpZwfKEGc3%2bFMTlT53%2f%2f6df%2bVKcgBcRrmG5oaB0eG9R7VXByPw%3d%3d en el Decoder y la decodificamos primero con URL y luego como Base64 obtenemos datos en binario
En el caso de este laboratorio si borramos los primeros 23 bytes estos corresponderán al texto Invalid email address: . Esto puede no funcionar en otros casos porque depende de la tecnología de encriptación que se está usando. En este caso debemos señalar los bits que vamos a borrar y pulsar Delete selected bytes
El output obtenido lo encodeamos en Base64 y posteriormente lo encodeamos en URL
Si le asignamos este valor %6e%77%64%4f%41%6a%4b%57%63%48%79%68%42%6e%4e%2f%68%54%45%35%55%2b%64%2f%2f%2b%6e%58%2f%6c%53%6e%49%41%58%45%61%35%68%75%61%47%67%64%48%68%76%55%65%31%56%77%63%6a%38%3d a la cookie notification
Existen dos tipos de cifrados block cypher y stream cypher, el stream cypher toma solamente 1 byte a la vez y lo encripta usando una clave, mientras que el block cypher toma el bloque entero del tamaño que ha sido fijado y lo encripta. En este caso, se está usando un block cypher, en este tipo de cifrado se usa un padding para completar los bloques, cada tipo de cifrado tiene su forma de añadir padding a los bloques. El padding se usa porque si el bloque está incompleto no se puede encriptar. En este caso vemos como el último bloque tiene 7 bits vacíos, por lo tanto el bloque que es un conjunto de 16 bytes no está completo y no puede cifrarse
Para solventar este problema vamos a usar el payload xxxxxxxxxadministrator:1740393673294 que incorpora 9 caracteres más, esto lo hacemos para en vez de borrar 23 caracteres borrar 32 y de esta forma los bloques mantienen un tamaño múltiplo de 16
Nos devuelve este output el cual tiene una longitud de 60 caracteres
Nos copiamos el valor de la cookie HokaDFQLTaLOScegXUavsYyumBaSkI1UHN5xWo6X8g8WBpkcTVXHNf4inBX9NupRvRPLvdZaVRNrLfH3mkQXxA%3d%3d en el Decoder, primero decodeamos como URL y luego como Base64
Seleccionamos las primeras dos filas de caracteres que son 32 bits, hacemos click izquierdo y pulsamos Delete selected bytes
Una vez hecho esto encodeamos en Base64 y posteriormente encodeamos la URL
Sustituimos el valor notification en la cookie y recargamos la web
Una vez comprobado que es correcto, accedemos a /admin, sustituimos el valor de la cookie stay-logged-in por %46%67%61%5a%48%45%31%56%78%7a%58%2b%49%70%77%56%2f%54%62%71%55%62%30%54%79%37%33%57%57%6c%55%54%61%79%33%78%39%35%70%45%46%38%51%3d y eliminamos la cookie session porque está asociada con el usuario wiener
Una vez hecho eso recargamos la página y vemos que hemos accedido al panel administrativo. Una vez aquí, ya podemos borrar al usuario carlos

























