OWASP Top 10 explicado con ejemplos prácticos
Has construido una aplicación web y ahora te preocupa la seguridad. El OWASP Top 10 es la lista de referencia de los riesgos críticos de seguridad en aplicaciones web. Pero leer la lista es una cosa; entender cómo se manifiestan estos riesgos en el código real es otra. Este artículo recorre cada categoría del OWASP Top 10 con ejemplos prácticos y pasos concretos para mitigarlos.
1. Control de acceso roto
El control de acceso roto ocurre cuando los usuarios pueden actuar fuera de sus permisos previstos. Por ejemplo, un usuario podría acceder a la cuenta de otro usuario cambiando un parámetro de URL.
// Vulnerable: No check if the requested user ID belongs to the authenticated user
app.get('/api/user/:id', (req, res) => {
const user = getUserById(req.params.id);
res.json(user);
});
Mitigación: Aplica verificaciones de control de acceso en el lado del servidor. Utiliza control de acceso basado en roles o en atributos y deniega por defecto.
2. Fallos criptográficos
Los datos sensibles como contraseñas y números de tarjetas de crédito deben cifrarse en tránsito y en reposo. Usar algoritmos débiles o codificar secretos directamente son errores comunes.
# Vulnerable: Using MD5 for password hashing
import hashlib
hash = hashlib.md5(password.encode()).hexdigest()
Mitigación: Utiliza algoritmos de hash fuertes y con sal como bcrypt o Argon2. Usa siempre HTTPS (TLS) para datos en tránsito.
3. Inyección
Las fallas de inyección, como la inyección SQL, ocurren cuando datos no confiables se envían a un intérprete como parte de un comando o consulta.
// Vulnerable: String concatenation in SQL query
$sql = "SELECT * FROM users WHERE username = '" . $_GET['username'] . "'";
Mitigación: Utiliza consultas parametrizadas o sentencias preparadas. Nunca concatenes la entrada del usuario directamente en las consultas.
4. Diseño inseguro
El diseño inseguro se refiere a la falta o ineficacia en el diseño de controles. Por ejemplo, un sistema de recuperación de contraseña que revela si un correo electrónico existe puede ayudar a los atacantes.
Mitigación: Modelado de amenazas durante el diseño, utiliza patrones de diseño seguros e implementa limitación de velocidad y otros controles.
5. Configuración de seguridad incorrecta
Esto incluye dejar cuentas predeterminadas habilitadas, mostrar seguimientos de pila a los usuarios o configurar incorrectamente los permisos de almacenamiento en la nube.
# Vulnerable: Debug mode enabled in production
DEBUG = True
Mitigación: Refuerza las configuraciones, elimina características no utilizadas y automatiza las comprobaciones de configuración.
6. Componentes vulnerables y desactualizados
Usar bibliotecas con vulnerabilidades conocidas es como dejar una puerta abierta. Por ejemplo, una versión desactualizada de una biblioteca popular podría tener una falla de ejecución remota de código.
Mitigación: Actualiza regularmente las dependencias, utiliza herramientas como OWASP Dependency-Check y monitorea los CVE.
7. Fallos de identificación y autenticación
Una autenticación débil permite a los atacantes adivinar contraseñas o secuestrar sesiones.
// Vulnerable: No account lockout after failed attempts
if (passwordMatches) {
loginUser();
} else {
// just show error, no rate limiting
}
Mitigación: Implementa autenticación multifactor, aplica políticas de contraseñas seguras y utiliza una gestión de sesiones segura.
8. Fallos de integridad de software y datos
Esta categoría incluye el uso de fuentes no confiables para actualizaciones de software o la deserialización de datos no confiables.
// Vulnerable: Deserializing untrusted data
$data = unserialize($_POST['data']);
Mitigación: Verifica firmas digitales, utiliza comprobaciones de integridad y evita deserializar datos no confiables.
9. Fallos de registro y monitoreo de seguridad
Sin un registro adecuado, las brechas pasan desapercibidas. Por ejemplo, no registrar los intentos de inicio de sesión fallidos.
Mitigación: Registra eventos relevantes para la seguridad, configura alertas y ten un plan de respuesta a incidentes.
10. Falsificación de solicitudes del lado del servidor (SSRF)
SSRF ocurre cuando un atacante puede hacer que el servidor envíe solicitudes a ubicaciones no previstas.
// Vulnerable: Fetching URL from user input without validation
fetch(req.query.url).then(...)
Mitigación: Valida y sanitiza las URL, utiliza listas de permitidos y restringe los permisos del servidor.
Tabla comparativa
| Riesgo | Ejemplo | Mitigación |
|---|---|---|
| Control de acceso roto | Acceder a datos de otros usuarios mediante manipulación de URL | Aplicar verificaciones de acceso en el servidor |
| Fallos criptográficos | Almacenar contraseñas en texto plano | Usar hash fuerte y TLS |
| Inyección | Inyección SQL mediante entrada no sanitizada | Consultas parametrizadas |
| Diseño inseguro | La recuperación de contraseña revela la existencia del correo | Modelado de amenazas y patrones seguros |
| Configuración de seguridad incorrecta | Modo de depuración activado en producción | Reforzar configuraciones |
| Componentes vulnerables | Biblioteca desactualizada con CVE conocido | Actualizaciones regulares y comprobación de dependencias |
| Fallos de autenticación | Sin limitación de velocidad en el inicio de sesión | MFA y políticas fuertes |
| Fallos de integridad | Deserializar datos no confiables | Verificar firmas y evitar deserialización insegura |
| Fallos de registro | Sin registros de inicios de sesión fallidos | Implementar registro y monitoreo |
| SSRF | Obtener URL proporcionada por el usuario | Validar y permitir solo URL en lista blanca |
Preguntas frecuentes
¿Qué es el OWASP Top 10?
El OWASP Top 10 es una lista actualizada periódicamente de los riesgos de seguridad más críticos en aplicaciones web, publicada por el Open Web Application Security Project (OWASP).
¿Con qué frecuencia se actualiza el OWASP Top 10?
Se actualiza periódicamente para reflejar amenazas emergentes y cambios en la tecnología. La última actualización importante fue en 2021.
¿Es suficiente el OWASP Top 10 para la seguridad?
No, es un punto de partida. Un programa de seguridad integral incluye prácticas de codificación segura, pruebas regulares y monitoreo continuo.
Para proteger aún más tus aplicaciones, considera usar herramientas como el Analizador de registros de Nginx para monitorear y detectar actividades sospechosas en los registros de tu servidor.