Prevenzione dei falsi delle richieste lato server in Java

11

L'applicazione consente agli utenti di specificare un URL per la loro immagine del profilo. Raccoglie i dati dall'URL e li salva sul server. Tuttavia, l'app è vulnerabile alla falsificazione delle richieste lato server (SSRF): puoi specificare URL come file:///etc/passwd e anche accedere ai servizi HTTP locali come http://localhost:8080/ .

Qual è il modo migliore per risolvere questo problema? Alcune idee che ho avuto:

  • Limita il protocollo URL a HTTP e HTTPS.
  • DNS cerca il nome host e verifica che non sia un indirizzo locale.
  • Disattiva reindirizzamenti.

Questo sembra un buon inizio - sebbene ci sia un problema di TOCTOU con la ricerca DNS (potrebbe andare bene nella pratica, dato che il DNS locale memorizzerà nella cache).

Un'idea alternativa che avevo era di posizionare un proxy in un segmento di rete limitato, dove può vedere solo Internet e inviare richieste attraverso questo.

Ho fatto ricerche online, ma non ci sono molte informazioni. Questo articolo è abbastanza buono.

    
posta paj28 18.05.2016 - 19:45
fonte

1 risposta

5

Questo è il codice attualmente in uso:

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);

Applica HTTP o HTTPS, vieta gli indirizzi locali e disabilita i reindirizzamenti. Tuttavia, ha ancora il difetto TOCTOU (tempo di controllo, tempo di utilizzo)

    
risposta data 15.06.2016 - 08:42
fonte

Leggi altre domande sui tag