IDOR (Insecure Direct Object Reference)
🌐 Vulnerabilidad: Insecure Direct Object Reference (IDOR)
🕵️♂️ ¿Qué es IDOR?
Insecure Direct Object Reference (IDOR) es una vulnerabilidad que ocurre cuando una aplicación permite a un usuario acceder directamente a recursos u objetos (como archivos, registros o parámetros) mediante identificadores que no están protegidos adecuadamente. Si no se implementan controles de acceso, un atacante puede manipular estos identificadores para acceder a datos o acciones no autorizadas.
⚙️ ¿Cómo se produce?
La aplicación usa identificadores directos para acceder a recursos:
Ejemplo: URL que incluye un identificador de usuario o recurso.
http://victim.com/user/123
El atacante manipula el identificador:
Cambia
123
por124
para acceder a recursos de otro usuario:http://victim.com/user/124
Si no hay validación de acceso:
El atacante puede acceder, modificar o eliminar datos de otros usuarios.
🛠️ Mecanismo de ataque
Ejemplo de una API vulnerable:
GET /api/orders/123 HTTP/1.1
Host: victim.com
Authorization: Bearer valid-token
El atacante cambia el identificador 123
por 124
y obtiene información sobre otro pedido:
GET /api/orders/124 HTTP/1.1
Host: victim.com
Authorization: Bearer valid-token
🎯 Impacto
Exposición de información sensible: Datos personales, detalles financieros, etc.
Modificación no autorizada: Cambiar información de otros usuarios.
Eliminación de datos: Un atacante podría borrar información importante.
Escalada de privilegios: Acceso a recursos administrativos o restringidos.
📉 Puntaje CVSS v3
Vector de ataque: Red (Explotable remotamente)
Complejidad del ataque: Baja
Impacto en confidencialidad: Alto
Impacto en integridad: Alto
Impacto en disponibilidad: Bajo a medio
Puntaje CVSS v3: 7.0 - 9.0 (Alto - Crítico) 🔥
🧑💻 Ejemplo práctico
Código vulnerable en PHP:
<?php
// Obtiene el ID del usuario desde el parámetro de la URL
$user_id = $_GET['id'];
// Consulta sin validación de permisos
$query = "SELECT * FROM users WHERE id = $user_id";
$result = $db->query($query);
echo json_encode($result->fetch_assoc());
?>
📌 Ataque: El atacante manipula la URL:
http://victim.com/api/user?id=124
Esto devuelve datos de otro usuario, como:
{
"id": 124,
"name": "John Doe",
"email": "[email protected]"
}
🛡️ ¿Cómo prevenir IDOR?
1️⃣ Implementar controles de acceso
Verifica que el usuario tenga permisos para acceder al recurso solicitado:
<?php
session_start();
$user_id = $_SESSION['user_id']; // Usuario autenticado
$requested_id = $_GET['id'];
if ($user_id != $requested_id) {
die("Acceso no autorizado.");
}
?>
2️⃣ Uso de identificadores indirectos
En lugar de usar identificadores directos, usa identificadores únicos que no sean predecibles (como UUID o tokens):
{
"user_id": "ae34bd76-1e25-4d92-9f5c-1234example"
}
3️⃣ Validar siempre las solicitudes
Revisa en el backend si el usuario tiene permisos para cada acción o recurso.
4️⃣ Evitar exponer identificadores sensibles
Si no es estrictamente necesario, no expongas datos como IDs internos en las URLs o respuestas API.
5️⃣ Auditorías y registros
Registra todas las solicitudes de acceso a recursos para detectar patrones de abuso.
6️⃣ Implementar controles en la base de datos
Asegúrate de que las consultas incluyan filtros que restrinjan los datos según los permisos del usuario:
SELECT * FROM orders WHERE user_id = ?
💡 Dato extra: Aunque IDOR es fácil de entender y explotar, también es relativamente simple de prevenir mediante controles de acceso adecuados y mejores prácticas de diseño.
🚨 Nota importante: Esta vulnerabilidad forma parte del OWASP Top 10 debido a su prevalencia y facilidad de explotación.
Última actualización
¿Te fue útil?