Este es un seguimiento de otro tema ( ¿Es una vulnerabilidad permitir la solicitud de rizos sin filtrar desde un sitio web? ) en el que estoy haciendo una investigación privada.
Dado:
Un servicio web accesible públicamente que acepta cualquier URL y realiza una solicitud de obtención de rizo en él. El servicio funciona sin autenticación.
El tema vinculado ya establece que el acceso sin filtro es un problema de seguridad. Pero algo sobre este tema emerge periódicamente en mis pensamientos y me tomó un tiempo pensar: ¿Puede este servicio ser lo suficientemente seguro contra SSRF y por igual?
Pasos obvios:
- cURL es poderoso, restringe los esquemas permitidos a http (s) y ftp (resuelve archivos, gopher, dict, etc. problemas)
- impide el acceso a todo el bucle de retorno: localhost , 127.0.0.1-127.0.0.255 (no estaba totalmente consciente de que toda la red de 127.x.x.x apunta a su máquina 0_o)
- impide el acceso a 0.0.0.0
- no permitir la transmisión IP 255.255.255.255 (aunque es poco probable que algo sirva para algo en los esquemas permitidos arriba)
- evitar que las direcciones IP privadas eviten el acceso a las redes internas (impersonalización de un servidor, ¿qué es parte de la red privada?) - > 10.0.0.0/8, 172.16.0.0/12 y 192.168.0.0/16 (gracias wiki )
Pero hay más, ¿verdad?
- si cURL está configurado para seguir las redirecciones, la redirección debe validarse de la misma manera que la IP original, ya que forjar una redirección es trivial
- IPv6: todo para el bonito y antiguo espacio de direcciones IPv4 también debe volver a realizarse allí, ¿no?
- ¿Hay algunos puertos para filtrar por? Recuerde que los esquemas están restringidos a http (s) y ftp. Esto puede ser técnicamente un escáner de puertos pero no es malicioso, pero obtener un sitio web desde el puerto 675 podría estar bien.
- Impedir direcciones URL remotas DoS: implemente algún tipo de token (token CSRF por igual), introduzca tiempos de espera entre solicitudes múltiples, diga 1 segundo o prohíba las direcciones IP que continúan golpeando. (Por supuesto, no resuelve DDoS, pero la prevención de DDoS probablemente esté fuera del alcance aquí)
Una última cosa que no puedo entender completamente:
¿Qué pasa con DNS ? ¿Es posible registrar una entrada de DNS para apuntar a redes locales o privadas?
Técnicamente, en mi máquina puedo realizar un GET de http://my.box
y obtener mi enrutador.
Ahora, ¿cómo puede alguien mitigar ese riesgo?
¿Está realizando un nslookup
una solución? Si obtengo una IP, valide la IP.
Si no, puede ser cualquier cosa, negarlo.
Sigo olvidando lo que hace mi NAS para poder acceder a él a través del nombre de host en mi red local, pero ser paranoico es probablemente una buena manera aquí.