Prevención de falsificaciones de solicitudes del lado del servidor en Java

12

La aplicación permite a los usuarios especificar una URL para su imagen de perfil. Obtiene los datos de la URL y los guarda en el servidor. Sin embargo, la aplicación es vulnerable a la falsificación de solicitudes del lado del servidor (SSRF): puede especificar direcciones URL como file:///etc/passwd y también acceder a servicios HTTP locales como http://localhost:8080/ .

¿Cuál es la mejor manera de solucionar esto? Algunas ideas que tuve:

  • Restrinja el protocolo de URL a HTTP y HTTPS.
  • DNS busca el nombre del host y comprueba que no sea una dirección local.
  • Deshabilitar redirecciones.

Esto parece un buen comienzo, aunque hay un problema de TOCTOU con la búsqueda de DNS (puede que esté bien en la práctica, ya que el DNS local se almacenará en la memoria caché).

Una idea alternativa que tuve fue colocar un proxy en un segmento de red restringido, donde solo puede ver Internet, y enviar solicitudes a través de eso.

Investigué esto en línea, pero no hay mucha información. Este artículo es bastante bueno.

    
pregunta paj28 18.05.2016 - 19:45
fuente

1 respuesta

5

Este es el código que estoy usando actualmente:

if(!url.getProtocol().startsWith("http"))
    throw new Exception();
InetAddress inetAddress = InetAddress.getByName(url.getHost());
if(inetAddress.isAnyLocalAddress() || inetAddress.isLoopbackAddress() || inetAddress.isLinkLocalAddress())
    throw new Exception();
HttpURLConnection conn = (HttpURLConnection)(url.openConnection());
conn.setInstanceFollowRedirects(false);
conn.connect();
IOUtils.copy(conn.getInputStream(), out);

Aplica HTTP o HTTPS, prohíbe las direcciones locales y deshabilita las redirecciones. Sin embargo, todavía tiene el defecto TOCTOU (tiempo de verificación, tiempo de uso).

    
respondido por el paj28 15.06.2016 - 08:42
fuente

Lea otras preguntas en las etiquetas