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)

  1. Cabeceras seguras y CSP activas en todos los entornos.
  2. Autorización a nivel de recurso y pruebas de IDOR en CI.
  3. Consultas 100% parametrizadas y validación de entrada/longitud.
  4. MFA en cuentas críticas y rotación de tokens.
  5. Escaneo de dependencias y SBOM versionado por release.
  6. Logs centralizados con trace_id y alertas en tiempo real.
  7. 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.