Skip to main content
High

Ataque IDOR (Referencia Directa Insegura a Objetos)

CategoríaExposición de Datos y Configuración IncorrectaOWASPA01:2021 – Control de Acceso RotoPrimera aparición2007Tiempo de lectura7 minVerificado2026-03-10
DEFINICIÓN

Un ataque de Referencia Directa Insegura a Objetos (IDOR) ocurre cuando una aplicación expone una referencia directa a un objeto interno (como un registro de base de datos, archivo o endpoint de API) sin las verificaciones de control de acceso adecuadas. Los atacantes manipulan estas referencias para acceder a datos no autorizados, modificar registros o realizar acciones en nombre de otros usuarios simplemente cambiando identificadores en URLs, parámetros o cookies.

Cómo Funciona Ataque IDOR (Referencia Directa Insegura a Objetos)

Las vulnerabilidades IDOR surgen cuando los desarrolladores confían en los identificadores proporcionados por el cliente sin verificar que el usuario tiene permiso para acceder al objeto referenciado. Los patrones comunes incluyen IDs secuenciales o predecibles en URLs (por ejemplo, /orders/123), parámetros de API (?userId=456) o campos de formulario. Los atacantes enumeran o adivinan estos identificadores para acceder a los datos de otros usuarios. La vulnerabilidad existe completamente en el lado del servidor — incluso si el frontend restringe el acceso de la interfaz, un atacante determinado puede eludirlo construyendo solicitudes directas.

1

Identificar referencias a objetos

Explorar la aplicación para encontrar referencias directas a objetos. Buscar IDs predecibles en URLs (/profile/42), endpoints de API (/api/orders/789), parámetros de solicitud (?documentId=101) o campos de formulario ocultos. Los objetivos comunes incluyen perfiles de usuario, pedidos, facturas, documentos, mensajes y transacciones.

2

Analizar la lógica de control de acceso

Comprender el modelo de autenticación y autorización. ¿La aplicación verifica que el usuario actual es dueño del objeto? Muchas implementaciones solo verifican si el usuario está autenticado ("ha iniciado sesión") pero no si tiene permiso para acceder al recurso específico. Probar iniciando sesión como Usuario A e intentando acceder a los recursos del Usuario B.

3

Enumerar o manipular identificadores

Probar sistemáticamente las referencias a objetos. Para IDs secuenciales, incrementar o decrementar el número. Para UUIDs o IDs hasheados, buscar patrones o vulnerabilidades en el algoritmo de generación. En SaaS multi-tenant, probar si los usuarios de una organización pueden acceder a datos de otra organización.

4

Explotar el acceso no autorizado

Acceder a datos sensibles (información personal, registros financieros, documentos confidenciales), modificar registros (cambiar direcciones de correo electrónico, destinos de envío, métodos de pago) o realizar acciones privilegiadas (aprobar pedidos, eliminar datos, restablecer contraseñas). En casos graves, los atacantes pueden obtener control completo sobre las cuentas de otros usuarios o privilegios administrativos.

Ejemplos Reales

2014

Recompensa récord del programa bug bounty de Uber

Un investigador de seguridad descubrió que al cambiar los IDs de usuario en la API de Uber, podía acceder al historial de viajes, ubicaciones de recogida e información de pago de cualquier usuario. Uber pagó una recompensa de $100,000 y posteriormente corrigió la vulnerabilidad. El incidente destacó cómo incluso las grandes empresas pueden pasar por alto fallos fundamentales de control de acceso.

2020

Brecha de datos de Clever mediante IDOR

Los atacantes explotaron una vulnerabilidad IDOR en la plataforma educativa de Clever para acceder a datos de estudiantes de múltiples distritos escolares. Al manipular los IDs de distrito en las solicitudes de API, eludieron los controles de acceso y obtuvieron información sensible incluyendo nombres de estudiantes, fechas de nacimiento y asignaciones escolares, afectando potencialmente a miles de estudiantes.

2019

Filtración de datos de Robinhood

Robinhood sufrió una filtración de datos cuando investigadores descubrieron que podían acceder a las direcciones de correo electrónico de otros usuarios enumerando IDs de cuenta. El fallo expuso millones de direcciones de correo electrónico que los atacantes podrían usar para phishing, credential stuffing o campañas de ingeniería social. La compañía corrigió el problema e implementó controles de acceso adecuados.

Impacto y Evaluación de Riesgo

Los ataques IDOR conducen a acceso no autorizado a datos, violaciones de privacidad, toma de cuentas, fraude y violaciones regulatorias. Los atacantes pueden robar información personal (exposición a GDPR, CCPA), datos financieros, propiedad intelectual o realizar transacciones fraudulentas. El impacto escala con la sensibilidad de la aplicación: las aplicaciones de salud exponen registros médicos, las aplicaciones financieras permiten lavado de dinero, los sistemas gubernamentales revelan información clasificada. Las organizaciones enfrentan responsabilidad legal, daño reputacional y pérdida de confianza de los clientes. IDOR se clasifica consistentemente entre los principales riesgos de seguridad de OWASP debido a su prevalencia y graves consecuencias.

Cómo Detectar Ataque IDOR (Referencia Directa Insegura a Objetos)

Monitorear patrones de acceso anormales: enumeración rápida de IDs secuenciales, solicitudes a objetos que el usuario no debería acceder o intentos de acceso entre múltiples tenants. Registrar todas las verificaciones de control de acceso con identificadores de usuario y objeto. Implementar registros de auditoría para el acceso a datos sensibles. Usar pruebas automatizadas para buscar patrones de IDs predecibles en APIs y endpoints. Realizar pruebas de penetración enfocadas en el control de acceso, particularmente en endpoints REST y parámetros de URL. Las herramientas de análisis estático pueden detectar patrones donde los IDs se usan sin verificaciones de autorización.

Cómo Prevenir Ataque IDOR (Referencia Directa Insegura a Objetos)

Implementar verificaciones de autorización adecuadas para cada referencia directa a objetos. Nunca confiar en los identificadores proporcionados por el cliente — siempre verificar que el usuario tiene permiso para acceder al recurso solicitado. Usar referencias indirectas a objetos: mapear IDs internos a tokens imposibles de adivinar (UUIDs, cadenas aleatorias) y mantener tablas de mapeo en el servidor. Implementar control de acceso basado en roles (RBAC) o control de acceso basado en atributos (ABAC). Para aplicaciones multi-tenant, aplicar aislamiento estricto de tenants en las capas de base de datos y aplicación. Usar autorización a nivel de framework (por ejemplo, Django @login_required, Spring Security @PreAuthorize) en lugar de verificaciones manuales. Realizar revisiones de código de seguridad enfocadas en patrones de control de acceso. Probar los límites de autenticación vs. autorización regularmente.

Ejemplos de Código

Vulnerable: No Access Control Check
@app.route('/orders/<int:order_id>')
def get_order(order_id):
# VULNERABLE: No check if user owns this order
order = Order.query.get(order_id)
if not order:
return 'Order not found', 404
return jsonify(order.to_dict())

# Attacker can access any order by changing order_id in URL
# /orders/42, /orders/43, /orders/44, etc.
Secure: Authorization Check
from flask_login import current_user

@app.route('/orders/<int:order_id>')
def get_order(order_id):
# SECURE: Verify ownership before returning data
order = Order.query.get(order_id)

if not order:
return 'Order not found', 404

if order.user_id != current_user.id:
# Log unauthorized access attempt
log_security_event(
'idor_attempt',
user=current_user.id,
attempted_order=order_id
)
return 'Access denied', 403

return jsonify(order.to_dict())
Secure: Middleware-Based Authorization (Node.js)
const authorizeOwnership = (modelName) => {
return async (req, res, next) => {
const resourceId = req.params.id;
const userId = req.user.id;

try {
const Model = mongoose.model(modelName);
const resource = await Model.findById(resourceId);

if (!resource) {
return res.status(404).json({ error: 'Resource not found' });
}

// Check if user owns the resource or has admin role
const hasAccess = resource.userId?.equals(userId) ||
req.user.role === 'admin';

if (!hasAccess) {
// Log the IDOR attempt
await SecurityLog.create({
type: 'idor_attempt',
userId,
resourceId,
modelName,
ip: req.ip
});
return res.status(403).json({ error: 'Access denied' });
}

// Attach resource to request for use in route handler
req.resource = resource;
next();
} catch (error) {
return res.status(500).json({ error: 'Server error' });
}
};
};

// Usage
router.get('/orders/:id', authenticate, authorizeOwnership('Order'), getOrder);

Fortalece tus defensas contra Ataque IDOR (Referencia Directa Insegura a Objetos) con PowerWAF.

Seguridad integral para aplicaciones web con WAF, rate limiting y monitoreo de amenazas en tiempo real.

Los cupos del plan gratuito son limitados

Preguntas Frecuentes

IDOR es un tipo específico de vulnerabilidad de control de acceso roto donde las referencias directas a objetos carecen de autorización adecuada. El control de acceso roto es más amplio e incluye problemas como escalación de privilegios, referencias directas inseguras a objetos y permisos mal configurados. IDOR se enfoca específicamente en la manipulación de identificadores de objetos para eludir los controles de acceso.
Los UUIDs dificultan la enumeración pero no corrigen el problema subyacente. Los atacantes aún pueden obtener UUIDs válidos por otros medios (filtraciones de datos, acceso legítimo a sus propios objetos, cuentas comprometidas). La verdadera solución son las verificaciones de autorización adecuadas — verificar que el usuario es dueño o tiene permiso para acceder al objeto independientemente de cómo esté identificado.
IDOR es extremadamente común, especialmente en APIs REST y aplicaciones CRUD. OWASP clasifica consistentemente el control de acceso roto (que incluye IDOR) como el riesgo de seguridad #1. Muchos desarrolladores se enfocan en la autenticación ("¿este usuario ha iniciado sesión?") pero olvidan la autorización ("¿este usuario es dueño de estos datos?"). La vulnerabilidad es fácil de introducir y a menudo se pasa por alto durante las revisiones de código y las pruebas.