OWASP Top 10 (2021)

Vulnerabilidades Web Críticas

Parte 1: A01-A05

El plan para hoy

  • Introducción a OWASP Top 10
  • WebGoat como plataforma de práctica
  • A01: Pérdida de Control de Acceso
  • A02: Fallos Criptográficos
  • A03: Inyección
  • A04: Diseño Inseguro
  • A05: Configuración de Seguridad Incorrecta
  • Ejercicios prácticos con WebGoat

Configuración del Laboratorio

Requisitos previos:

  • Docker instalado
  • Docker Compose instalado
  • Puertos 8080 y 9090 disponibles
  • ~2GB de espacio libre

Archivo de Configuración

# docker-compose.yml
version: '3.8'
services:
  webgoat:
    container_name: webgoat
    image: webgoat/webgoat
    ports:
      - "8080:8080"
      - "9090:9090"
    volumes:
      - ./webgoat_data:/home/webgoat/.webgoat

Despliegue y Acceso

Pasos de instalación:

# 1. Crear directorio y archivo
mkdir webgoat-lab && cd webgoat-lab
nano docker-compose.yml   # Pegar configuración

# 2. Iniciar servicios
docker-compose up -d

# 3. Verificar estado
docker-compose ps

Acceso a las aplicaciones:

  • WebGoat: http://localhost:8080/WebGoat
  • WebWolf: http://localhost:9090/WebWolf

Estructura de Lecciones

Cada vulnerabilidad incluye:

  • Explicación teórica
  • Ejemplos prácticos
  • Ejercicios guiados
  • Soluciones detalladas
  • Referencias adicionales

A01: Pérdida de Control de Acceso

Tipos principales:

  • IDOR (Insecure Direct Object References)
  • Elevación de privilegios
  • Bypass de autenticación
  • Manipulación de URLs
  • CORS mal configurado

Ejercicio: IDOR en WebGoat

# Request original
GET /WebGoat/users/details/1234

# Modificación para IDOR
GET /WebGoat/users/details/1235

# Verificar respuesta
{
  "userId": 1235,
  "username": "otro_usuario",
  "email": "privado@ejemplo.com"
}

A02: Fallos Criptográficos

Problemas comunes:

  • Datos sensibles en texto plano
  • Algoritmos débiles/obsoletos
  • Claves hardcodeadas
  • Certificados inválidos
  • Generación débil de claves

Ejercicio: Hashing en WebGoat

# Ejemplo de hash inseguro (MD5)
md5("password123") = "482c811da5d5b4bc6d497ffa98491e38"

# Hash seguro con salt (bcrypt)
bcrypt("password123", salt) = "$2a$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LcdYaM.ZK.4K3W"

A03: Inyección

Tipos principales:

  • SQL Injection
  • Command Injection
  • LDAP Injection
  • XML Injection
  • Template Injection

Ejercicio: SQL Injection

-- Query vulnerable
SELECT * FROM users WHERE username = '$user' AND password = '$pass'

-- Ataque básico
' OR '1'='1

-- Query resultante
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = ''

A04: Diseño Inseguro

Problemas comunes:

  • Falta de límites de uso
  • Validación cliente-side
  • Race conditions
  • Flujos inseguros
  • Exposición de información

Ejercicio: Race Conditions

// Código vulnerable
async function procesarCompra(userId, itemId) {
    let saldo = await getSaldo(userId);
    let precio = await getPrecio(itemId);
    
    if (saldo >= precio) {
        await realizarCompra(userId, itemId);
        await actualizarSaldo(userId, saldo - precio);
    }
}

A05: Configuración de Seguridad Incorrecta

Problemas típicos:

  • Servicios innecesarios
  • Cuentas por defecto
  • Errores detallados
  • HTTPS desactivado
  • Headers faltantes

Ejercicio: Headers de Seguridad

# Headers recomendados
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Content-Security-Policy: default-src 'self'
X-XSS-Protection: 1; mode=block

¿Preguntas?

Recursos adicionales:

  • owasp.org/Top10
  • github.com/WebGoat/WebGoat
  • portswigger.net/web-security