Vamos a aprender qué es una vulnerabilidad IDOR, cómo es, cómo encontrarla y un escenario real de explotación.

¿Qué es una IDOR?

IDOR significa Insecure Direct Object Reference o Referencia Directa Insegura a un Objeto y es un tipo de vulnerabilidad de control de acceso.

Esta vulnerabilidad puede ocurrir cuando un servidor web recibe input del usuario para recuperar objetos (archivos, datos, documentos…). Si se pone mucha confianza en los datos suministrados en la petición, y no se validan en la parte de servidor para confirmar que el objeto pertenece al usuario que lo pide, puede darse una IDOR.

¿Qué significa IDOR?

Insecure Direct Object Reference

Un ejemplo de IDOR

Imaginemos que nos hemos registrado en un servicio online y queremos cambiar la información del perfil.

Para eso, hacemos clic en http://online-service.thm/profile?user_id=1305 y vemos nuestra información.

Pero somos curiosos, así que cambiamos ese 1305 por un 1000 y, para nuestra sorpresa, podemos ver la información de otro usuario.

En ese caso, hemos descubierto una vulnerabilidad IDOR.

Idealmente, el servidor comprobará que la información pedida corresponde al usuario antes de suministrarle la respuesta.

Usando lo que hemos aprendido, abrimos el sitio web de ejemplo que acompaña a la habitación y explotamos la vulnerabilidad IDOR para obtener la bandera.

¿Cuál es esa bandera? (La tarea no tiene ninguna dificultad y te va guiando).

THM{IDOR-VULN-FOUND}

Encontrado IDORs en IDs codificados

Cuando pasamos datos de página en página, ya sea mediante datos enviados, cadenas de peticiones o cookies, los desarrolladores web a menudo cogen los datos en bruto y los codifican.

La codificación asegura que el servidor que recibe la petición será capaz de entender el contenido.

Codificar transforma datos binarios en una cadena ASCII usando normalmente a-z, A-Z, 0-9 y =, siendo este último = para rellenar.

La técnica de codificación más común en la web es base64 y suele ser bastante fácil de reconocer. Puedes usar sitios como este para decodificar la cadena, editar los datos y recodificar para enviar de nuevo la petición web, a fin de ver si hay un cambio en la respuesta.

He aquí un ejemplo gráfico.

Ejemplo de IDOR en ID's codificados

¿Cuál es la codificación más común en un sitio web?

base64

IDOR’s en ID’s hasheados

Los ID’s hasheados son más complicados que los codificados a la hora de tratar con ellos, pero pueden seguir un patrón predecible, como ser la versión hasheada de un valor numérico entero.

Por ejemplo, el ID 123 sería 202cb962ac59075b964b07152d234b70 si usamos hashing MD5.

Es interesante poner los hashes descubiertos a través de un servicio web como:

https://crackstation.net/

Esta página contiene miles de millones de valores hash y sus resultados, para ver si podemos encontrar alguna coincidencia.

¿Cuál es un algoritmo hash habitual para ID’s?

md5

IDs impredecibles

Si el ID no puede detectarse con los métodos anteriores, una excelente técnica de detección de IDORs es crear dos cuentas y cambiar el número ID entre ellas.

Si puedes ver el contenido del otro usuario usando su número de ID, mientras estás identificado con una cuenta diferente (o ni siquiera identificado), has encontrado una vulnerabilidad IDOR válida.

¿Cuál es el número mínimo de cuentas que necesitas crear para chequear IDORs entre cuentas?

2

¿Dónde se localizan los IDORs?

El endpoint vulnerable que tienes como objetivo no siempre será algo que puedes ver en la barra de direcciones. Puede ser contenido que carga tu navegador mediante una petición AJAX o algo que encuentres referenciado en un archivo Javascript.

A veces, los endpoints pueden tener un parámetro no referenciado que podía tener utilidad durante el desarrollo y se subió a producción.

Por ejemplo, puedes detectar una llamada a /user/details mostrando tu información de usuario (autenticado mediante tu sesión). Pero a través de un ataque, conocido como mineado de parámetros, puedes descubrir un parámetro llamado user_id que puedes usar para mostrar la información de otro usuario, como por ejemplo: /user/details?user=id=123

Ejemplo práctico de IDOR

Conectamos la máquina de la habitación y, una vez hecho, abrimos la dirección que nos indica en una nueva pestaña del navegador.

Primero, necesitaremos identificarnos en la web. Para eso, hacemos clic en crear una cuenta dentro de la sección de clientes que hay.

Una vez dentro, Pulsamos en «Your Account».

Esta sección nos permite cambiar información, como nombre de usuario, correo electrónico y contraseña. Vemos que los dos primeros datos ya nos vienen rellenados.

Empecemos a investigar cómo rellena el sistema estos datos. Para eso, abrimos las herramientas de desarrollador del navegador y refrescamos la página.

Seleccionamos la pestaña «Red» (Network) y, al refrescar, vemos que hay una llamada a un endpoint con la ruta /api/v1/customer?id={user_id}.

Esta página devuelve, en formato JSON, el ID de usuario, el nombre de usuario y la dirección de correo. Podemos ver desde la ruta que la información del usuario mostrada se toma del parámetro id de la cadena de petición.

Observemos la imagen.

Detectando IDOR con herramientas de desarrollador

Podemos probar este parámetro id para una vulnerabilidad IDOR cambiando al de otro usuario. Probemos con los usuarios 1 y 13 y respondamos a las preguntas que hay más adelante.

Para esta tarea, si no estamos usando Firefox, lo usamos, que será más fácil porque nos permite editar y reenviar la consulta, viendo la respuesta en formato JSON que nos ofrece el servidor a esa consulta modificada.

Así, hacemos doble clic en la consulta objetivo y seleccionamos «Editar y volver a enviar».

En la pantalla que nos sale podemos cambiar el parámetro deseado y pulsar en el botón azul de Enviar.

Cambiando una petición web con las herramientas de desarrollador de Firefox

Una vez enviada, la veremos dentro de toda esa fila de solicitudes. Si hacemos clic normal en dicha solicitud nueva que acabamos de mandar, y nos vamos a la pestaña «Respuesta», podremos averiguar lo que nos preguntan más abajo.

Respuesta a la petición modificada

¿Cuál es el nombre de usuario del id 1?

adam84

¿Cuál es la dirección de correo del usuario 3?

j@fakemail.thm