Top 10 vulnerabilidades web más comunes en 2024
La seguridad web sigue siendo prioritaria. A continuación, profundizamos en las 10 categorías críticas, con foco en cómo detectarlas, cómo suelen explotarse y —sobre todo— cómo mitigarlas de forma práctica y verificable. Incluimos patrones de código, cabeceras seguras, políticas de despliegue y checklists que puedes incorporar hoy mismo en tu pipeline de CI/CD.
1) Broken Access Control
Señales: endpoints accesibles sin autorización, manipulación de IDs (IDOR), force browsing, elevación horizontal/vertical de privilegios.
Explotación típica: cambiar /api/users/123
por /api/users/124
, o forzar acciones administrativas sin rol.
Mitigación:
- Enforce policy-as-code (ABAC/RBAC) en el servidor; nunca confíes en la UI.
- Evita IDs secuenciales; usa UUID v4 y filtra por owner en la consulta.
- Control de acceso por recurso y por acción (lectura/escritura/borrado).
// Laravel Policy (ejemplo)
public function view(User $user, Post $post) {
return $post->user_id === $user->id || $user->hasRole("admin");
}
2) Cryptographic Failures
Señales: transmisión sin TLS fuerte, claves duras en código, uso de cifrados obsoletos (MD5, SHA1), IVs predecibles.
Mitigación: TLS 1.2+ con suites modernas; almacenamiento de contraseñas con bcrypt/argon2id; key rotation y envelope encryption; nunca loguear secretos.
# Nginx TLS endurecido (fragmento)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5:!3DES;
3) Injection (SQL/LDAP/OS)
Señales: concatenación de entradas en consultas, errores SQL filtrados al cliente, RCE vía argumentos de shell.
Mitigación universal: consultas parametrizadas, ORMs seguros, allowlists para columnas/ordenación, sanitización de LIKE
, y prohibir shell_exec
en entradas de usuario.
// PDO parametrizado
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute(["email" => $email]);
// Node (pg)
await client.query("SELECT * FROM users WHERE id = $1", [id]);
4) Insecure Design
Señales: lógica de negocio laxa, falta de límites, ausencia de separación de dominios.
Mitigación: threat modeling (STRIDE), límites por rol/región, rate limits por acción, estados explícitos de workflow.
5) Security Misconfiguration
Señales: paneles por defecto, listados de directorio, cabeceras de seguridad ausentes.
Mitigación: hardening de servidor, deshabilitar módulos, mínimos privilegios, plantillas de infra inmutables.
# Cabeceras seguras
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
6) Vulnerable & Outdated Components
Señales: dependencias sin parches, imágenes base antiguas, librerías sin mantenimiento.
Mitigación: SBOM + escaneo periódico, versionado estricto (no latest
), renovate bots, ventanas de mantenimiento.
7) Identification & Authentication Failures
Señales: tokens sin expiración/rotación, MFA ausente, sesiones no invalidadas en logout.
Mitigación: MFA por defecto, session fixation prevention, rotación de refresh tokens, device binding.
// Laravel: expiración y rotación de tokens (Passport/Sanctum)
config(["sanctum.expiration" => 60]); // minutos
8) Software & Data Integrity Failures
Señales: pipelines sin firmas, descargas sin verificación, plantillas de actualización sin checksum.
Mitigación: firmas de artefactos, attestations, verificación de integridad (SHA256), política de supply chain en CI/CD.
9) Security Logging & Monitoring Failures
Señales: logs locales sin rotación, ausencia de alertas, trazabilidad insuficiente.
Mitigación: centraliza logs, añade trace_id, define umbrales/alertas, playbooks de respuesta a incidentes.
{
"timestamp":"2025-09-23T11:00:00Z",
"trace_id":"uuid",
"user_id":123,
"action":"login_failed",
"ip":"203.0.113.10",
"risk":"medium"
}
10) Server-Side Request Forgery (SSRF)
Señales: servicios que aceptan URLs y las consultan desde el servidor, acceso a metadatos cloud (169.254.169.254), DNS rebinding.
Mitigación por capas:
- Aplicación: allowlist estricta de destinos/protocolos; bloquear
file://
,gopher://
, rangos internos RFC1918. - Red: egress control en firewall/NACL, resolver DNS confiable, bloquear metadata endpoints si no son necesarios.
- Infra: instance metadata v2 (IMDSv2) en nubes compatibles.
// Ejemplo Node: allowlist + timeout + tamaño máximo
import got from "got";
const ALLOWED_HOSTS = new Set(["api.ejemplo.com"]);
function isAllowed(url) {
const u = new URL(url);
return u.protocol === "https:" && ALLOWED_HOSTS.has(u.hostname);
}
export async function fetchSafe(url) {
if (!isAllowed(url)) throw new Error("Destino no permitido");
return got(url, { timeout: { request: 3000 }, maxRedirects: 2, retry: 0 }).text();
}
XSS (Transversal a varias categorías)
Señales: salida sin escapar, HTML dinámico, plantillas mal configuradas.
Mitigación: escapar por contexto (HTML/attr/URL), CSP estricta, librerías que eviten dangerouslySetInnerHTML
. En Laravel, {{ $var }}
escapa por defecto; usar {!! !!}
solo con contenido confiable.
# CSP base (ajustar a tu app)
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'" always;
CSRF (Transversal a autenticación)
Mitigación: tokens sincronizados, cabecera SameSite=Lax/Strict
, validar Origin/Referer
en operaciones sensibles.
Cabeceras y cookies seguras (resumen)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
// Cookie de sesión segura en Laravel (config/session.php)
return [
"secure" => env("SESSION_SECURE_COOKIE", true),
"same_site" => "lax",
];
Automatización: SAST/DAST/Dependabot + pipelines
- SAST: análisis estático en cada PR; bloquea merges con findings críticos.
- DAST: escaneo en staging con datos sintéticos.
- Dependencias: escaneo y actualización automática (renovate/dependabot).
- Política: "no merge con tests rojos o CVEs críticos".
Checklist operativo (copiable a tu repo)
- Cabeceras seguras y CSP activas en todos los entornos.
- Autorización a nivel de recurso y pruebas de IDOR en CI.
- Consultas 100% parametrizadas y validación de entrada/longitud.
- MFA en cuentas críticas y rotación de tokens.
- Escaneo de dependencias y SBOM versionado por release.
- Logs centralizados con trace_id y alertas en tiempo real.
- Pruebas de SSRF con allowlist/egress control.
Conclusión
Reducir superficie de ataque es un trabajo continuo: diseño seguro, defensas por capas, automatización de controles y telemetría accionable. Implementa las mitigaciones de esta guía de forma incremental, audítalas en CI/CD y valida su eficacia con pentesting y bug bounty interno.