Descripción
El ataque 'Server-Side Request Forgery' (SSRF) es un tipo de ataque en el que un atacante abusa de la funcionalidad de un servidor para realizar solicitudes HTTP a recursos internos o externos no autorizados. En esencia, se engaña al servidor para que realice acciones no deseadas en nombre del atacante.
Impacto
Este tipo de ataque puede tener graves consecuencias para la seguridad de una aplicación web y la infraestructura subyacente. Algunos de los impactos potenciales incluyen:
- Acceso no autorizado a recursos internos: El atacante puede acceder a sistemas y datos que normalmente están protegidos por firewalls o restricciones de red.
- Evasión de controles de seguridad: SSRF puede permitir a los atacantes eludir medidas de seguridad como firewalls y listas de control de acceso.
- Exfiltración de datos sensibles: Los atacantes pueden utilizar SSRF para extraer información confidencial de sistemas internos.
- Escaneo de puertos internos: SSRF puede ser utilizado para mapear la red interna y descubrir servicios vulnerables.
- Ejecución de código remoto: En casos extremos, SSRF puede llevar a la ejecución de código arbitrario en el servidor comprometido.
Dada la gravedad de estos impactos, es crucial que los desarrolladores implementen medidas de seguridad robustas para prevenir y mitigar los ataques SSRF en sus aplicaciones web.
Ejemplos Prácticos
1. Acceso a servicios internos
Esto puede permitir al atacante acceder a sistemas y datos normalmente protegidos por firewalls o restricciones de red, como bases de datos internas o paneles de administración.
http://vulnerable-app.com/fetch?url=http://localhost:8080/admin
En este ejemplo, si la aplicación no valida adecuadamente la URL proporcionada, podría realizar una solicitud al panel de administración interno en el puerto 8080.
Resumen
- Detectar alguna consulta que realice alguna petición a un recurso externo mediante HTTP.
- Modificar la petición para que el servidor web realice una petición a la interfaz loopback y así acceder a funciones o servicios no publicadas al exterior.
Ejemplo
Tras analizar el funcionamiento de la página web auditada, se puede observar que se realizan peticiones a recursos externos mediante HTTP.
Mitigaciones
- Validar y sanitizar todas las entradas de usuario, especialmente las URLs.
- Implementar listas blancas de dominios y direcciones IP permitidas.
- Utilizar firewalls de aplicaciones web (WAF) para filtrar solicitudes maliciosas.
- Configurar correctamente los firewalls de red para limitar el acceso a recursos internos.
- Implementar el principio de mínimo privilegio en los servidores y servicios.
- Usar VPNs o redes privadas virtuales para aislar recursos críticos.
- Deshabilitar redirecciones HTTP cuando no sean necesarias.
- Implementar autenticación y autorización robustas para todos los endpoints internos.
- Utilizar DNS interno para resolver nombres de host, evitando el uso de direcciones IP directas.
- Monitorear y registrar todas las solicitudes de red para detectar patrones sospechosos.
2. Escaneo de puertos internos
Resumen
- Detectar alguna consulta que realice alguna petición a un recurso externo mediante HTTP.
- Modificar la petición para que el servidor web realice una petición a direcciones IP y puertos internos que no se encuentran expuestos al exterior.
- Observar respuestas diferentes por el servidor para poder discernir cuando existe una dirección IP con algún puerto abierto de cuando no.
Ejemplo
Mitigaciones
- Implementar listas blancas de direcciones IP y rangos permitidos para las solicitudes internas.
- Utilizar firewalls de aplicaciones web (WAF) configurados para detectar y bloquear patrones de solicitudes sospechosas.
- Segmentar la red interna para limitar el alcance de posibles escaneos.
- Implementar el principio de mínimo privilegio en los servidores y servicios internos.
- Utilizar autenticación y autorización robustas para todos los endpoints internos.
- Monitorear y registrar todas las solicitudes de red para detectar patrones de escaneo.
- Implementar rate limiting para prevenir escaneos rápidos y automatizados.
- Utilizar Virtual Private Cloud (VPC) en entornos cloud para aislar recursos críticos.
- Configurar correctamente los grupos de seguridad y las listas de control de acceso (ACL) en la red.
- Educar a los desarrolladores sobre las mejores prácticas de seguridad y los riesgos asociados con SSRF.
3. Acceso a metadatos en entornos cloud
- Credenciales temporales de AWS
- Roles de IAM asociados con la instancia
- Datos de configuración de red
- Scripts de inicialización personalizados
Resumen
- Detectar alguna consulta que realice alguna petición a un recurso externo mediante HTTP.
- Modificar la petición original para que el servidor web realice una petición a recursos de servidores en cloud que puedan estar limitados mediante WhiteList para que solo pueda acceder el servidor.
- Observar respuestas diferentes por el servidor para poder discernir cuando ha sido posible acceder a recursos almacenados en Cloud y cuando no.
Ejemplo
Escenario
Pasos de la explotación
- El atacante descubre que la aplicación está alojada en Amazon Web Services (AWS).
- El atacante ingresa la siguiente URL en el campo de entrada de la aplicación: http://169.254.169.254/latest/meta-data/
- La aplicación realiza una solicitud a esta dirección IP interna de AWS, que es el endpoint de metadatos de instancias EC2.
- Como resultado, la aplicación devuelve información sensible sobre la instancia EC2, como:
1. ID de instancia2. Región3. Nombre de host interno4. Dirección MAC
5.El atacante puede profundizar más utilizando rutas específicas, como: http://169.254.169.254/latest/meta-data/iam/security-credentials/ para obtener las credenciales de seguridad temporales del rol IAM asociado a la instancia.
Mitigación
- Implementar una lista blanca de URLs permitidas
- Utilizar un proxy inverso para las solicitudes salientes
- Configurar firewalls para bloquear el tráfico a direcciones IP internas
- Implementar el principio de mínimo privilegio en los roles IAM
- Utilizar IMDSv2 (Instance Metadata Service version 2) que requiere tokens de sesión
4. Exfiltración de información (Cypher injection)
Resumen
- Detectar alguna consulta mediante la cual sea posible inyectar código en las consultas realizadas a la base de datos.
- Realizar consultas a la base de datos para obtener información almacenada en la misma.
- Exfiltrar la información obtenida mediante la función de carga de CSV por HTTP, realizando así una técnica de SSRF.
Ejemplo
Mitigación
- Usar parámetros: Prevenir la inyección de Cypher utilizando parámetros en lugar de concatenar directamente la entrada del usuario en las consultas.
- Parametrizar consultas: Compilar las consultas en planes ejecutables que no puedan ser modificados por los datos de los parámetros.
- Usar procedimientos APOC de forma segura: Al utilizar APOC, continuar pasando parámetros para evitar vulnerabilidades de concatenación de cadenas.
- Sanitizar entradas: Cuando la parametrización no es posible (por ejemplo, para etiquetas de nodos), sanitizar las entradas del usuario escapando caracteres especiales.
- Evitar devolver errores de base de datos: Usar mensajes de error genéricos para prevenir la divulgación de información a través de inyección basada en errores.
- Implementar escape adecuado: Utilizar secuencias de escape apropiadas para diferentes tipos de Cypher (literales de cadena, identificadores).
- Validar entradas: Comprobar las entradas del usuario contra criterios específicos, pero tener en cuenta las posibles técnicas de bypass.
- Tener cuidado con las inyecciones de segundo orden: Continuar sanitizando los datos almacenados cuando se utilicen en consultas posteriores.
- Aplicar el principio de mínimo privilegio: Utilizar control de acceso basado en roles para limitar el impacto potencial de inyecciones exitosas.
- Manejar cuidadosamente las importaciones de datos: Ser consciente de las vulnerabilidades potenciales al importar datos de fuentes externas como archivos CSV.