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?

  1. 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
  2. El atacante manipula el identificador:

    • Cambia 123 por 124 para acceder a recursos de otro usuario:

      http://victim.com/user/124
  3. 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": "john.doe@example.com"
}

🛡️ ¿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?