SSRF (Server-Side Request Forgery)
🌐 Vulnerabilidad: Server-Side Request Forgery (SSRF)
🕵️♂️ ¿Qué es SSRF?
Server-Side Request Forgery (SSRF) es una vulnerabilidad que permite a un atacante manipular a un servidor para que realice solicitudes HTTP (o de otro protocolo) hacia recursos internos o externos. Esto puede permitir al atacante acceder a servicios internos, exfiltrar información sensible, o incluso ejecutar comandos en ciertos casos.
⚙️ ¿Cómo se produce?
SSRF ocurre cuando una aplicación web permite al usuario proporcionar una URL o dirección que el servidor utiliza para realizar solicitudes sin validar adecuadamente la entrada. Si el servidor tiene acceso a recursos internos o sensibles, el atacante puede aprovechar esto para acceder a ellos.

🛠️ Mecanismo de ataque
El atacante identifica un parámetro que realiza una solicitud externa:
http://victim.com/fetch?url=http://example.com
Manipula la URL para acceder a recursos internos o privados:
http://victim.com/fetch?url=http://127.0.0.1:80/admin
Resultados posibles:
Acceso a servicios internos.
Lectura de metadatos de infraestructura en servicios en la nube, como:
http://169.254.169.254/latest/meta-data/
Escaneo de puertos en la red interna:
http://victim.com/fetch?url=http://192.168.1.1:22
Uso avanzado: En algunos casos, el atacante puede combinar SSRF con vulnerabilidades adicionales (como RCE) para comprometer aún más el sistema.
🎯 Impacto
Acceso no autorizado: Exposición de servicios internos, como bases de datos o APIs privadas.
Exfiltración de datos: Robo de información sensible, como credenciales o configuraciones.
Escaneo interno: Identificación de hosts y servicios en la red interna.
Ejecución remota de comandos: En ciertos casos, puede derivar en RCE (Remote Code Execution).
📉 Puntaje CVSS v3
Vector de ataque: Red (Explotable remotamente)
Complejidad del ataque: Media
Impacto en confidencialidad: Alto
Impacto en integridad: Medio
Impacto en disponibilidad: Bajo a alto (dependiendo del ataque)
Puntaje CVSS v3: 8.0 - 9.5 (Crítico) 🔥
🧑💻 Ejemplo práctico
Código vulnerable:
<?php
$url = $_GET['url'];
$content = file_get_contents($url); // Solicitud sin validar
echo $content;
?>
Ataque: El atacante envía una URL maliciosa para acceder a metadatos del servidor en AWS:
http://victim.com/fetch?url=http://169.254.169.254/latest/meta-data/
📌 Esto puede devolver información sensible como claves de acceso de la instancia.
🛡️ ¿Cómo prevenir SSRF?
1️⃣ Validar y sanitizar entradas
Restringe las URLs que los usuarios pueden proporcionar:
<?php
$url = $_GET['url'];
$allowed_domains = ['example.com', 'api.example.com'];
$parsed_url = parse_url($url);
if (!in_array($parsed_url['host'], $allowed_domains)) {
die("URL no permitida.");
}
?>
2️⃣ Bloquear acceso a direcciones internas
Implementa reglas para evitar que las solicitudes accedan a direcciones IP privadas o localhost:
Rango IPv4 prohibido:
127.0.0.0/8 (localhost)
10.0.0.0/8 (redes privadas)
192.168.0.0/16 (redes privadas)
Rango IPv6 prohibido:
::1
3️⃣ Uso de listas blancas
Permite solo URLs específicas aprobadas:
$allowed_urls = ['https://example.com/api', 'https://trusted.com'];
if (!in_array($url, $allowed_urls)) {
die("URL no válida.");
}
4️⃣ Deshabilitar redirecciones
Evita que el servidor siga redirecciones en las solicitudes.
5️⃣ Uso de servicios proxy
Usa un proxy para manejar las solicitudes externas y controlar el acceso.
6️⃣ Configuración de cortafuegos
Configura un firewall para bloquear solicitudes desde el servidor hacia direcciones no autorizadas.
7️⃣ Límites de tiempo y tamaño
Aplica límites a las solicitudes realizadas para evitar abuso.
8️⃣ Monitoreo y auditoría
Implementa herramientas para detectar comportamientos anómalos en el servidor, como solicitudes a direcciones IP internas.
💡 Dato extra: SSRF es especialmente peligroso en entornos de nube, donde los metadatos de las instancias pueden ser explotados para obtener credenciales y comprometer más recursos.
🚨 Nota importante: Aunque SSRF afecta principalmente a HTTP, puede usarse en otros protocolos, como FTP o SMTP, dependiendo de las capacidades del servidor.
¿Te gustaría un ejemplo adaptado a otro lenguaje o un caso más específico? 😊
Última actualización
¿Te fue útil?