Imagina que tu servidor es un asistente de confianza que realiza tareas por ti. Ahora, piensa qué pasaría si un atacante te engaña para que le des a tu asistente una dirección falsa, no para contactar a un proveedor, sino para abrir la puerta a un ladrón. En esencia, así funciona un ataque de server-side request forgery (SSRF). Esta guía te explicará, con un caso práctico, cómo detectar y solucionar esta peligrosa vulnerabilidad para proteger tus activos digitales.
Resumen del caso: Ataque SSRF a un e-commerce
Un conocido e-commerce, que permite a sus vendedores importar imágenes de productos desde URLs externas, sufrió un ataque SSRF. Los ciberdelincuentes explotaron esta funcionalidad para engañar al servidor de la tienda y hacer que realizara peticiones a su propia red interna.
¿Qué ocurrió? En lugar de proporcionar la URL de una imagen, un atacante introdujo direcciones IP locales (127.0.0.1 y rangos 192.168.x.x). El servidor, al no validar el destino de la URL, intentó conectarse a estos recursos internos. Esto permitió al atacante escanear la red, descubrir servicios no expuestos a internet (como un panel de administración sin protección) y acceder al servicio de metadatos de la nube (AWS), logrando filtrar claves de API y obteniendo control sobre parte de la infraestructura cloud.

Análisis técnico paso a paso: ¿Cómo se explotó la vulnerabilidad?
La mecánica de un ataque SSRF se apoya en funcionalidades comunes, como la importación de recursos desde URLs. El problema surge cuando la aplicación no valida correctamente lo que el usuario le proporciona, abriendo una vulnerabilidad en aplicaciones críticas.
1. Inyección en el formulario de importación
El punto de entrada fue la función de "importar imagen desde URL". El código vulnerable en el backend era tan simple como esto:
<?php
// Ejemplo de código vulnerable
if (isset($_POST['image_url'])) {
$imageUrl = $_POST['image_url'];
// El servidor lee el contenido de CUALQUIER URL sin validarla. ¡Peligro!
$imageData = file_get_contents($imageUrl);
// ...después, procesa y guarda la imagen.
}
?>
Este código confiaba ciegamente en el parámetro image_url, permitiendo que un atacante inyectara cualquier dirección.
2. Escaneo y movimiento lateral
Una vez descubierto el fallo, el atacante ejecutó los siguientes pasos:
- Confirmación de la vulnerabilidad: Envió la URL
http://127.0.0.1/. La respuesta del servidor (un error de conexión diferente al habitual o un mayor tiempo de espera) confirmó que el servidor intentaba conectar consigo mismo. - Escaneo de la red interna: El atacante probó IPs comunes en redes locales (
http://192.168.1.1,http://10.0.0.5) y puertos específicos (:8080,:3306) para mapear la infraestructura y descubrir servicios internos como bases de datos o paneles de administración. - Compromiso de credenciales cloud: El objetivo final fue el servicio de metadatos de AWS, accesible solo desde la red interna a través de la IP
http://169.254.169.254/latest/meta-data/. Al forzar al servidor a acceder a esta URL, el atacante pudo leer y robar las claves de API temporales asociadas a la instancia, obteniendo acceso a otros servicios de la cuenta en la nube.
Este tipo de ataque es sutil porque, para los sistemas de monitorización, la petición maliciosa se origina desde una IP de confianza: la del propio servidor.
Remediación inmediata: Plan de contención en 3 pasos
Cuando detectas un ataque SSRF, cada segundo cuenta. La prioridad es contener el daño y cortar el acceso del atacante.
1. Aislar el servidor comprometido
La primera acción es sacar el servidor de la red de producción. Aplica reglas de firewall para bloquear todo el tráfico saliente, excepto el necesario para la investigación. Si el aislamiento total no es posible, deshabilita inmediatamente la funcionalidad vulnerable (en este caso, la importación de imágenes).
2. Analizar el alcance y preservar evidencias
Antes de limpiar nada, crea una instantánea (snapshot) del disco del servidor para el análisis forense. A continuación, analiza los logs del servidor web, firewall y aplicaciones en busca de peticiones anómalas originadas desde el servidor afectado hacia IPs internas.
Usa comandos como grep para filtrar los logs y encontrar rastros del ataque:
# Busca peticiones a rangos de IP privadas en los logs de Nginx
grep -E '127.0.0.1|192.168.|10.|169.254.169.254' /var/log/nginx/access.log
Este comando te ayudará a identificar qué sistemas internos fueron objetivo del atacante.
3. Erradicar la amenaza y restaurar
Una vez contenido y analizado el ataque:
- Restaurar desde un backup seguro: No te fíes del servidor comprometido. Restáuralo desde una copia de seguridad limpia, creada antes del incidente.
- Rotar todas las credenciales: Da por hecho que cualquier clave de API, contraseña o secreto almacenado en el servidor ha sido robado. Rota todas las credenciales inmediatamente.
- Parchear la vulnerabilidad: Asegúrate de que el equipo de desarrollo corrige el código vulnerable antes de volver a poner el servidor en producción.
Prevención: Controles concretos para blindar tu aplicación
La mejor defensa contra SSRF es la proactividad. Implementar controles de seguridad durante el desarrollo es mucho más eficaz y económico que gestionar una crisis.

1. Implementar listas blancas (Allow Lists)
No uses listas negras para bloquear IPs maliciosas; los atacantes siempre encuentran formas de saltárselas. La estrategia correcta es usar una lista blanca para definir explícitamente qué es lo único permitido.
- Valida el protocolo: Permite solo
httpyhttpsy bloqueafile://,ftp://, etc. - Valida el dominio: Crea una lista de dominios autorizados y rechaza cualquier otro.
- Resuelve la IP: Antes de conectar, resuelve el dominio a su dirección IP y comprueba que no pertenece a un rango privado o de loopback.
Este ejemplo en Python muestra una implementación segura:
import requests
from urllib.parse import urlparse
import socket
ALLOWED_DOMAINS = ['cdn.proveedor-imagenes.com', 'static.mi-dominio.com']
def fetch_url_safely(url):
parsed_url = urlparse(url)
# 1. Validar protocolo y dominio
if parsed_url.scheme not in ['http', 'https']:
raise ValueError("Protocolo no permitido")
if parsed_url.hostname not in ALLOWED_DOMAINS:
raise ValueError("Dominio no autorizado")
# 2. Validar que la IP resuelta no sea interna
ip_address = socket.gethostbyname(parsed_url.hostname)
if ip_address.startswith(('127.', '192.168.', '10.', '172.16.')):
raise ValueError("La IP de destino es interna")
# 3. Proceder con la petición
response = requests.get(url, timeout=5)
return response.content
2. Usar un Firewall de Aplicaciones Web (WAF)
Un WAF actúa como primera línea de defensa, bloqueando patrones de ataque SSRF conocidos antes de que lleguen a tu aplicación. Configúralo con reglas que detecten y bloqueen peticiones con IPs internas o protocolos sospechosos.
3. Segmentar la red y aplicar el mínimo privilegio
Tu servidor web no debería poder comunicarse libremente con toda tu red interna. Aplica el principio de mínimo privilegio: si solo necesita hablar con una base de datos, crea reglas de firewall que bloqueen cualquier otra comunicación saliente hacia otros sistemas.
4. Realizar escaneos de vulnerabilidades programados
La SSRF ocupa el puesto número 10 en el ranking OWASP Top 10 2021, lo que demuestra su criticidad. Implementa pruebas de penetración automatizadas y un escaneo de vulnerabilidades en tus APIs de forma regular para detectar estos fallos antes de que sean explotados.

Resultados y lecciones aprendidas
El impacto del ataque al e-commerce fue significativo. El coste estimado, sumando las horas de respuesta al incidente, la pérdida de ingresos por la desactivación de la funcionalidad y el coste de la auditoría externa, superó los 50.000€. La mayor lección fue que la seguridad no es un gasto, sino una inversión.
Acciones implementadas para evitar la repetición:
- Revisión completa del código: Se auditó todo el código en busca de patrones similares de confianza en las entradas del usuario.
- Formación en desarrollo seguro: Se implantó un programa de formación obligatoria para desarrolladores centrado en el OWASP Top 10.
- Inversión en monitorización: Se mejoraron las herramientas de monitorización de red para detectar y alertar sobre tráfico interno anómalo.
Un incidente de seguridad, gestionado correctamente, es una oportunidad para fortalecer las defensas y crear una cultura de seguridad robusta en toda la organización.
Proteger tu infraestructura de amenazas como SSRF exige una vigilancia constante. DragonSec te ofrece una plataforma de monitorización continua y escaneo de vulnerabilidades para que descubras exposiciones críticas antes de que se conviertan en un verdadero dolor de cabeza.
