El OWASP Top 10 es la lista de referencia mundial de los riesgos de seguridad más críticos en aplicaciones web, mantenida por la Open Web Application Security Project.
| Posición | Categoría | Descripción breve |
|---|---|---|
| A01 | Broken Access Control | Sube desde #5. El 94% de las apps fueron probadas. Controles de acceso defectuosos. |
| A02 | Fallos Criptográficos | Antes: Exposición de datos sensibles. Ahora enfocado en fallos de cifrado en tránsito y reposo. |
| A03 | Inyección | Baja al #3. SQL, NoSQL, OS, LDAP. El 94% de las apps fueron testadas. |
| A04 | Diseño Inseguro | Nueva categoría 2021. Fallos de diseño y arquitectura de seguridad. |
| A05 | Error de Configuración | Sube desde #6. El 90% de apps testadas tenían algún error de configuración. |
| A06 | Componentes Vulnerables | Antes #2 en la encuesta de industria. Uso de librerías y componentes desactualizados. |
| A07 | Fallos de Autenticación | Baja desde #2. Incluye CWE de fallos de identificación. |
| A08 | Integridad de Software y Datos | Nueva categoría. Supuestos incorrectos en actualizaciones y pipelines CI/CD. |
| A09 | Fallos de Registro y Monitoreo | Sube. Registro insuficiente que retrasa la detección de brechas. |
| A10 | SSRF | Nueva desde encuesta de industria. Tasa de incidencia baja pero impacto alto. |
Inyección de código SQL en variables de la aplicación para manipular la base de datos.
-- Ataque: mipass=' OR ''='
-- Defensa:
$stmt = $pdo->prepare("SELECT * FROM users WHERE pass = ?");
$stmt->execute([$_POST['password']]);
Inyección de scripts en páginas vistas por otros usuarios.
// Defensa: escapar salida
echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
// + Content-Security-Policy en cabeceras HTTP
Las aplicaciones que procesan XML pueden ser engañadas para incluir entidades externas.
# Defensa: deshabilitar DTDs en el parser XML
libxml_disable_entity_loader(true);
Usuarios acceden a recursos o funciones para los que no tienen permiso.
// Defensa: verificar autorización en cada endpoint
if (!$user->hasPermission('admin')) { http_response_code(403); exit; }
Permite ejecución remota de código mediante objetos serializados manipulados.
// Defensa: verificar integridad con firma digital antes de deserializar
La app realiza peticiones HTTP a dominios arbitrarios elegidos por el atacante.
// Defensa: lista blanca de dominios, no enviar respuestas raw al cliente
$allowed = ['api.example.com', 'cdn.example.com'];
if (!in_array(parse_url($url, PHP_URL_HOST), $allowed)) die('Forbidden');