Broken Access Control
🌐 Vulnerabilidad: Broken Access Control (Control de Acceso Roto)
🕵️♂️ ¿Qué es Broken Access Control?
La vulnerabilidad Broken Access Control ocurre cuando una aplicación no implementa correctamente controles de acceso, lo que permite a los usuarios realizar acciones o acceder a recursos para los cuales no tienen permisos. Esto incluye acceso no autorizado a datos sensibles, operaciones administrativas o recursos de otros usuarios.
⚙️ ¿Cómo se produce?
Ausencia de validación de permisos: El servidor no verifica si el usuario tiene autorización para acceder a un recurso o realizar una acción.
Controles de acceso mal implementados: Los permisos están definidos, pero no se aplican correctamente.
Escalada de privilegios: Un usuario con permisos limitados manipula solicitudes para obtener acceso administrativo.
Errores en la lógica de acceso: Como permitir acceso basado solo en roles mal configurados o falta de comprobación en rutas sensibles.
🛠️ Mecanismo de ataque
IDOR (Insecure Direct Object Reference):
El atacante accede a recursos de otros usuarios manipulando identificadores.
http://victim.com/orders/123
Cambiado a:
http://victim.com/orders/124
Manipulación de roles:
El atacante modifica su rol o privilegios en la solicitud:
{ "role": "admin" }
Acceso directo a rutas protegidas:
El atacante accede a rutas administrativas sin restricciones:
http://victim.com/admin
🎯 Impacto
Exposición de datos sensibles: Información personal, financiera o corporativa.
Modificación no autorizada: Cambiar configuraciones, datos de otros usuarios o contenido sensible.
Escalada de privilegios: Permitir a usuarios sin permisos realizar acciones administrativas.
Eliminación de datos: Un atacante puede eliminar recursos críticos.
📉 Puntaje CVSS v3
Vector de ataque: Red (Explotable remotamente)
Complejidad del ataque: Baja
Impacto en confidencialidad: Alto
Impacto en integridad: Alto
Impacto en disponibilidad: Medio a alto
Puntaje CVSS v3: 8.0 - 10.0 (Crítico) 🔥
🧑💻 Ejemplo práctico
Código vulnerable en PHP:
<?php
$user_id = $_GET['user_id'];
$query = "SELECT * FROM orders WHERE user_id = $user_id";
$result = $db->query($query);
echo json_encode($result->fetch_assoc());
?>
📌 Ataque: El atacante manipula la URL para acceder a pedidos de otro usuario:
http://victim.com/orders?user_id=5
Esto devuelve datos no autorizados.
🛡️ ¿Cómo prevenir Broken Access Control?
1️⃣ Validar siempre los permisos
Verifica que el usuario tenga autorización antes de acceder o modificar recursos:
<?php
session_start();
$current_user_id = $_SESSION['user_id'];
$requested_user_id = $_GET['user_id'];
if ($current_user_id != $requested_user_id) {
die("Acceso denegado.");
}
?>
2️⃣ Implementar controles en el servidor
Nunca confíes en controles implementados únicamente en el cliente (JavaScript). Asegúrate de validar en el backend.
3️⃣ Usar principios de menor privilegio
Diseña roles y permisos de manera que cada usuario tenga acceso solo a lo estrictamente necesario.
4️⃣ Restringir rutas críticas
Configura reglas específicas para proteger rutas administrativas:
En Apache:
<Directory "/var/www/admin"> Require ip 192.168.1.0/24 </Directory>
En Express (Node.js):
app.use('/admin', (req, res, next) => { if (!req.user.isAdmin) return res.status(403).send('Access denied.'); next(); });
5️⃣ Auditorías y pruebas de seguridad
Realiza pruebas de control de acceso con herramientas como Burp Suite para detectar rutas o funciones desprotegidas.
6️⃣ Usar bibliotecas y frameworks seguros
Utiliza middleware o extensiones que gestionen roles y permisos de manera automatizada, como Laravel Gates o Spring Security.
💡 Dato extra: Los controles de acceso rotos son la causa principal de escaladas de privilegios y uno de los problemas más destacados en el OWASP Top 10.
🚨 Nota importante: Las rutas ocultas mediante métodos como robots.txt
o enlaces no visibles en el frontend no son un sustituto para un control de acceso adecuado.
Última actualización
¿Te fue útil?