Page cover

🕸️Bypass de referencias codificadas

En la sección anterior, vimos un ejemplo de un IDOR que utiliza identificadores de usuario de empleados en texto sin formato, lo que facilita la enumeración. En algunos casos, las aplicaciones web crean hashes o codifican sus referencias de objetos, lo que dificulta la enumeración, pero aún puede ser posible.

Regresemos a la aplicación Employee Manager para probar la funcionalidad Contracts:

Si hacemos clic en el archivo Employment_contract.pdf, comienza la descarga del mismo. La solicitud interceptada en Burp tiene el siguiente aspecto:

descargar_contrato

Vemos que está enviando una solicitud POST a download.php con los siguientes datos:

El uso de un script download.php para descargar archivos es una práctica habitual para evitar vincular directamente a los archivos, ya que esto puede ser explotable con múltiples ataques web. En este caso, la aplicación web no envía la referencia directa en texto sin formato, sino que parece estar creando un hash en un formato md5. Los hashes son funciones unidireccionales, por lo que no podemos decodificarlos para ver sus valores originales.

Podemos intentar hacer un hash de varios valores, como uid, username, filename, y muchos otros, y ver si alguno de sus hashes md5 coincide con el valor anterior. Si encontramos una coincidencia, podemos replicarla para otros usuarios y recopilar sus archivos. Por ejemplo, intentemos comparar el hash md5 de nuestro uid, y veamos si coincide con el hash anterior:

Lamentablemente, los hashes no coinciden. Podemos intentar esto con varios otros campos, pero ninguno de ellos coincide con nuestro hash. En casos avanzados, también podemos utilizar Burp Comparer y realizar pruebas de fuzzing en varios valores y luego comparar cada uno con nuestro hash para ver si encontramos alguna coincidencia. En este caso, el hash md5 podría ser para un valor único o una combinación de valores, lo que sería muy difícil de predecir, lo que hace que esta referencia directa sea un Secure Direct Object Reference. Sin embargo, hay una falla fatal en esta aplicación web.


Divulgación de funciones

Como la mayoría de las aplicaciones web modernas se desarrollan utilizando marcos de JavaScript, como Angular, React o Vue.js, muchos desarrolladores web pueden cometer el error de realizar funciones sensibles en el front-end, lo que los expondría a los atacantes. Por ejemplo, si el hash anterior se estuviera calculando en el front-end, podemos estudiar la función y luego replicar lo que está haciendo para calcular el mismo hash. Afortunadamente para nosotros, este es precisamente el caso en esta aplicación web.

Si echamos un vistazo al enlace en el código fuente, vemos que está llamando a una función de JavaScript con javascript:downloadContract('1'). Si observamos la función downloadContract() en el código fuente, vemos lo siguiente:

Esta función parece estar enviando una solicitud POST con el parámetro contract, que es lo que vimos anteriormente. El valor que está enviando es un hash md5 que utiliza la biblioteca CryptoJS, que también coincide con la solicitud que vimos anteriormente. Por lo tanto, lo único que queda por ver es qué valor se está codificando.

En este caso, el valor que se va a codificar es btoa(uid), que es la cadena codificada en base64 de la variable uid, que es un argumento de entrada para la función. Volviendo al enlace anterior donde se llamó a la función, vemos que llama a downloadContract('1'). Por lo tanto, el valor final que se utiliza en la solicitud POST es la cadena codificada en base64 de 1, que luego se convirtió en un hash md5.

Podemos probar esto codificando en base64 nuestro uid=1, y luego aplicándole un hash con md5, de la siguiente manera:

Consejo: Estamos usando la flag -n con echo, y la flag -w 0 con base64, para evitar agregar nuevas líneas, para poder calcular el md5hash del mismo valor, sin hacer hash de nuevas líneas, ya que eso cambiaría el md5hash final.

Como podemos ver, este hash coincide con el hash de nuestra solicitud, lo que significa que hemos revertido con éxito la técnica de hash utilizada en las referencias de objetos, convirtiéndolas en IDOR. Con eso, podemos comenzar a enumerar los contratos de otros empleados utilizando el mismo método de hash que usamos anteriormente.


Enumeración masiva

Una vez más, escribamos un script bash simple para recuperar todos los contratos de los empleados. En la mayoría de los casos, este es el método más fácil y eficiente para enumerar datos y archivos a través de vulnerabilidades IDOR. En casos más avanzados, podemos utilizar herramientas como Burp Intruder o ZAP Fuzzer, pero un script bash simple debería ser la mejor opción para nuestro ejercicio.

Podemos comenzar calculando el hash para cada uno de los primeros diez empleados usando el mismo comando anterior tr -d pero eliminando los caracteres finales - , de la siguiente manera:

A continuación, podemos realizar una solicitud POST a download.php con cada uno de los hashes anteriores como valor contract, lo que debería darnos nuestro script final:

Con esto, podemos ejecutar el script, y debería descargar todos los contratos de los empleados 1 a 10:

Como podemos ver, debido a que pudimos revertir la técnica de hashing utilizada en las referencias de objetos, ahora podemos explotar con éxito la vulnerabilidad IDOR para recuperar todos los contratos de los demás usuarios.


Caso práctico

Intente descargar los contratos de los primeros 20 empleados, uno de los cuales debe contener la flag, que puede leer con 'cat'. Puede calcular el valor del parámetro 'contract' o calcular directamente el nombre del archivo '.pdf'.

Al abrir el contrato nos lo descarga en local y vemos que tiene un nombre codificado:

Al capturar la petición con BurpSuite vemos que hace una petición GET a /download.php:

Calcular hashes

Lo primero vamos a calcular los hashes md5 de los 20 primeros empleados con el siguiente comando:

Script de enumeración masiva

Vamos a usar el siguiente script, que es un poco más pro que el que vimos antes en esta sección:

Última actualización

¿Te fue útil?