OWASP Top 10 — Guía práctica
Una guía visual para priorizar controles de seguridad web. Incluye ejemplos seguros, explicaciones línea a línea y glosario de términos. Ideal para desarrollo, pentesting y equipos de producto.
Priorizar riesgos frecuentes y de alto impacto en aplicaciones web, con ejemplos de implementación segura.
Lee cada riesgo, revisa el código, despliega el acordeón “Explicación línea a línea” y consulta el glosario.
Guía práctica para Dev, Sec y QA. Complementa normativas (PCI, ISO, NIST) con controles técnicos concretos.
A01 · Broken Access Control Autorización
Ocurre cuando se puede acceder a recursos/acciones sin permisos válidos (manipulación de IDs, escalado horizontal, bypass de políticas). Impacto: fuga de datos personales, fraudes y cambios no autorizados.
// Express.js — Control de acceso por ownership y rol
app.get('/api/orders/:id', requireAuth, async (req, res) => {
const order = await Order.findById(req.params.id); // (1)
if (!order) return res.status(404).end(); // (2)
const isOwner = order.userId === req.user.id; // (3)
const isAdmin = req.user.roles?.includes('admin'); // (4)
if (!isOwner && !isAdmin) return res.status(403).json({error:'forbidden'}); // (5)
res.json(order); // (6)
});
- (1) Búsqueda segura: se obtiene el recurso en servidor (no confiar en datos del cliente).
- (2) 404 si no existe: evita filtrar qué IDs son válidos.
- (3) Ownership: compara el propietario real del recurso con el usuario autenticado.
- (4) Rol con privilegios: admins pueden consultar para soporte/forense (principio de necesidad).
- (5) 403: deniega si no es dueño ni admin. La lógica de autorización vive en el servidor.
- (6) Respuesta: entrega datos solo tras pasar controles de autorización.
Explicación de tecnicismos
Ownership validación de pertenencia al recurso; Escalado horizontal acceso a recursos de otro usuario; 403 acceso prohibido.
A02 · Cryptographic Failures Confidencialidad/Integridad
Criptografía mal aplicada: secretos en texto plano, algoritmos obsoletos, claves sin rotación. Consecuencias: violaciones de privacidad, fraude, pérdida de integridad.
# Nginx — HSTS fuerza HTTPS en clientes compatibles
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# Python — Hash de contraseñas con Argon2 (passlib)
from passlib.hash import argon2
hash = argon2.hash(password) # (1) derivación segura
argon2.verify(input_pwd, hash) # (2) verificación sin exponer la clave
- HSTS: obliga a usar HTTPS, mitigando downgrade/mixto.
- (1) Argon2: algoritmo de derivación con costo configurable (resistente a fuerza bruta).
- (2) verify(): compara sin revelar el secreto original.
Explicación de tecnicismos
HSTS política que fuerza TLS; KDF (Key Derivation Function) para almacenar contraseñas; Rotación cambio periódico de claves.
A03 · Injection Entrada/Consultas
Payloads maliciosos alcanzan intérpretes (SQL/NoSQL/LDAP/SO). Resultado: fuga, manipulación de datos o ejecución no autorizada.
// Node (pg) — SIEMPRE consultas parametrizadas
const text = 'SELECT * FROM users WHERE email=$1';
const values = [req.body.email]; // (1) nunca concatenar strings
const r = await pool.query(text, values); // (2) el driver hace el escape
- (1) Parametriza: evita que la entrada del usuario altere la estructura de la consulta.
- (2) Driver: se encarga del escaping correcto según el motor de BD.
Explicación de tecnicismos
Escaping neutraliza caracteres especiales; ORM mapea objetos a tablas; RCE ejecución remota de código.
A04 · Insecure Design Arquitectura
Falta de seguridad embebida desde el diseño: autenticación frágil, ausencia de separación de funciones, confianza indebida en el cliente.
<!-- CSP (Content-Security-Policy) reduce superficie para XSS -->
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'">
- default-src ‘self’: solo cargar desde el propio origen.
- script-src ‘self’: bloquea scripts externos no autorizados.
- frame-ancestors ‘none’: evita clickjacking al impedir embebidos.
Explicación de tecnicismos
Threat Modeling identificar activos/amenazas; CSP política de fuentes confiables; Clickjacking UI engañosa en iframes.
A05 · Security Misconfiguration Configuración
Exposición de servicios innecesarios, permisos erróneos, cabeceras faltantes, paneles sin protección.
# Cabeceras clave (Nginx) y desactivar listados
add_header X-Frame-Options "DENY" always; # (1) bloquea iframes
add_header X-Content-Type-Options "nosniff" always;# (2) no adivinar MIME
# X-XSS-Protection está obsoleta; usar CSP.
autoindex off; # (3) sin listado de dirs
- (1) Anti-iframe: reduce clickjacking en navegadores que aún respetan el header.
- (2) No Sniff: impide que el navegador cambie el tipo de contenido anunciado.
- (3) autoindex off: evita exponer estructura de archivos.
A06 · Vulnerable & Outdated Components Dependencias
Dependencias con CVEs conocidas son un vector masivo (bots automatizados). Mantén inventario y parches.
# Node — auditoría y SBOM (CycloneDX)
npm ci
npm audit --omit=dev --json # (1) reporte para CI
npx @cyclonedx/cyclonedx-npm --output bom.json # (2) genera SBOM
- (1) Audit en CI: produce salida parseable para romper el build ante severidades altas.
- (2) SBOM: inventario de componentes para gestión de riesgo y respuesta a incidentes.
A07 · Identification & Authentication Failures Identidad
Sesiones sin expiración, MFA ausente, contraseñas débiles o manejo inseguro de tokens habilitan toma de cuenta.
// JWT con caducidad corta + cookies seguras (Express)
const token = jwt.sign({ sub: user.id, roles: user.roles }, JWT_KEY, { expiresIn: '15m' }); // (1)
app.use(session({
cookie: { httpOnly: true, secure: true, sameSite: 'lax' }, // (2)
secret: SECRET, resave: false, saveUninitialized: false
}));
- (1) 15m: tokens cortos reducen ventana de abuso; combinar con refresh y rotación.
- (2) Cookies seguras: httpOnly bloquea JS; secure exige HTTPS; sameSite limita CSRF.
A08 · Software & Data Integrity Failures Supply Chain
Integridad comprometida en CI/CD o en artefactos sin firma permite introducir código malicioso.
# CI — verificar integridad y firmas
- name: Verify checksums
run: |
echo "$EXPECTED artifact.tgz" | sha256sum -c - # (1)
# Firmado de contenedores (cosign)
cosign verify --key cosign.pub registry.example.com/app:latest # (2)
- (1) Checksums: comparan hash esperado vs. archivo descargado (detecta alteraciones).
- (2) Firma: verifica que la imagen proviene del emisor legítimo y no fue modificada.
A09 · Security Logging & Monitoring Failures Detección
Sin telemetría ni alertas, la intrusión es silenciosa. Establece logging estructurado y monitoreo centralizado.
// Winston (Node.js) — logging estructurado
const logger = winston.createLogger({
level: 'info', format: winston.format.json(),
transports: [ new winston.transports.Console() ] // (1)
});
logger.warn('auth_failed', { user: req.body.email, ip: req.ip, ua: req.headers['user-agent'] }); // (2)
- (1) JSON: facilita correlación en SIEM (búsqueda/alertas).
- (2) Contexto: evento con atributos clave (IP/UA/usuario) para investigar incidentes.
A10 · Server-Side Request Forgery (SSRF) Red/Egress
El servidor hace solicitudes a destinos no autorizados (crítico en cloud por metadatos/credenciales internas).
// Validación de URL con lista blanca (Node.js)
const ALLOW = new Set(['https://api.trusted.tld','https://maps.trusted.tld']); // (1)
function isAllowed(urlStr){
try { const u = new URL(urlStr); return ALLOW.has(u.origin); } // (2)
catch { return false; }
}
if(!isAllowed(req.body.target)) return res.status(400).json({error:'url_not_allowed'}); // (3)
- (1) Lista blanca: define orígenes permitidos explícitos.
- (2) URL API: usa el parser estándar (evita parsing casero).
- (3) 400: rechaza destinos no permitidos; combinar con segmentación y egress controlado.
Glosario rápido
SBOM
Inventario (lista de materiales) de software: librerías, versiones y orígenes. Útil en respuesta a incidentes.
KDF
Función de derivación de clave (p.ej. Argon2) para almacenar contraseñas de forma resistente.
HSTS
Política que obliga al navegador a usar HTTPS (evita downgrade/mixto).
CSRF
Ataques que fuerzan al navegador a enviar acciones autenticadas sin intención del usuario.
SIEM
Plataforma para centralizar, correlacionar y alertar sobre eventos de seguridad.
Clickjacking
Engaño de interfaz embebiendo páginas en iframes invisibles.
🎓 Entrena con laboratorios prácticos
Lleva estos conceptos a la práctica con escenarios guiados de explotación y defensa.
🚀 Conoce CBHPX-NW
Leave a Reply