
Il reindirizzamento aperto è un tipo di problema di sicurezza delle applicazioni web. Infatti, consente un reindirizzamento dal sito originale a uno dannoso da parte di cyber criminali. Gli aggressori utilizzano la reputazione aziendale per rendere più efficaci gli attacchi di phishing attraverso redirect di cui l’utente non si accorge. Se consenti i reindirizzamenti aperti, un utente malintenzionato può inviare un'e-mail di phishing contenente un collegamento con il tuo nome di dominio. La vittima verrà reindirizzata dal tuo server web al sito dell'aggressore.
Si noti che i reindirizzamenti aperti sono stati inclusi come vulnerabilità nell'elenco OWASP Top 10 nel 2013 (reindirizzamenti e inoltri non convalidati A10).
Reindirizzamento o redirect: che cos’è e cosa significa
Il reindirizzamento in inglese è chiamato “redirect”, una parola molto usata in informatica. Vediamo che cosa vuol dire. Un reindirizzamento si verifica quando il sito web, o l'applicazione web, cambia l'URL a cui si accede nel client (di solito esterno - i reindirizzamenti interni vengono solitamente chiamati in avanti). Ci sono diversi modi per reindirizzare una pagina web dal back-end. Di solito, i reindirizzamenti vengono effettuati inviando intestazioni HTTP specifiche al client, ma puoi anche creare reindirizzamenti, ad esempio, utilizzando il codice JavaScript.
Reindirizzamento del sito: redirect 301 o 302
Il reindirizzamento viene normalmente gestito dal server quando riceve una richiesta che ha per oggetto un contenuto che è stato spostato su una nuova URL. Un redirect è utile anche nei casi in cui una pagina del sito sia stata eliminata. Sia nel caso di risorse spostate, sia in quello dell’eliminazione di una risorsa, il reindirizzamento garantisce all’utente un’esperienza di navigazione piacevole, priva di errori 404. Infatti, il redirect porta l’utente alla nuova URL senza che se ne avveda. Dunque, l’operazione del reindirizzare una pagina web non viene percepita dall’utente, che procede veloce tra un luogo e l’altro del web. Ci sono due tipi di redirect: il redirect 301 corrisponde a un reindirizzamento permanente, il redirect 302 a un reindirizzamento temporaneo.
Reindirizzare una pagina web con il meta refresh
Esiste anche la possibilità di reindirizzare una pagina web attraverso il cosiddetto “meta refresh”. Si tratta di una modalità del redirect che non coinvolge il server, ma è effettuata a livello della pagina web. È più lenta perché prevede che la pagina di origine sia caricata e richiede l’inserimento di una meta tag HTML.
Che cos'è il reindirizzamento aperto
Esiste una vulnerabilità di reindirizzamento aperto quando la destinazione del reindirizzamento è fornita dal client e non viene filtrata o convalidata. Di seguito sono riportati alcuni esempi di reindirizzamenti sicuri e reindirizzamenti non sicuri:
- Se il sito web legittimo reindirizza il client a un URL fisso, si tratta di un reindirizzamento sicuro.
- Se il sito web legittimo costruisce in modo sicuro l'URL di reindirizzamento in base ai parametri forniti dall'utente, si tratta di un reindirizzamento sicuro.
- Se il sito web legittimo costruisce l'URL di reindirizzamento in base ai parametri forniti dall'utente ma non convalida / filtra sufficientemente l'input, si tratta di un reindirizzamento non sicuro (l'autore dell'attacco potrebbe manipolare l'input).
- Se il sito web legittimo consente all'utente di specificare l'URL di reindirizzamento di destinazione, si tratta di un reindirizzamento non sicuro (reindirizzamento aperto).
Reindirizzare un sito per un cyber criminale è un attimo
La possibilità di reindirizzare un sito a un omologo truffaldino è un’occasione ghiotta per i malintenzionati del web. Gli sviluppatori che utilizzano reindirizzamenti dinamici (basati sui dati del client) dovrebbero trattare tali dati come input non attendibili. In caso contrario, il cyber criminale trova la falla per sferrare un attacco: con poco sforzo, può reindirizzare il browser a un sito dannoso utilizzando il tuo nome di dominio per ingannare la vittima.
Ad esempio, se il tuo dominio è example.com , l'autore dell'attacco potrebbe creare il seguente URL:
https://example.com/redirect.php?url=http://attacker.com
L'autore dell'attacco può quindi inviare questo URL come parte di un tentativo di phishing per reindirizzare la vittima a un sito Web dannoso attacker.com . L'aggressore spera che example.com all'inizio abbia un aspetto affidabile e lo faccia cadere nella truffa di phishing.
Un esempio di reindirizzamento aperto
Il seguente semplice codice PHP crea un reindirizzamento aperto:
$redirect = $_GET['url']; header("Location: " . $redirect);
È una vulnerabilità di reindirizzamento aperta perché l'autore dell'attacco potrebbe fornire l’URL di un sito web dannoso nel valore del parametro URL della richiesta GET. Così l’URL di destinazione verrà inviato come intestazione della posizione , reindirizzando il client a una pagina web dannosa.
Reindirizzamento aperto: conseguenze della vulnerabilità
Una vulnerabilità di reindirizzamento aperta rende possibili molti attacchi informatici:
- Phishing: il modo più ovvio di utilizzare un reindirizzamento aperto è portare l’utente verso un sito con lo stesso aspetto dell’originale, rubare le credenziali e tornare al sito vulnerabile come se niente fosse.
- Cross-site Scripting (XSS): se il reindirizzamento consente l'uso di protocolli data: o javascript: e il client supporta tali protocolli nei reindirizzamenti, rende possibile all'aggressore eseguire un attacco XSS.
- Server-Side Request Forgery (SSRF): i reindirizzamenti aperti possono essere utilizzati per eludere i filtri SSRF.
- Bypassare i criteri di sicurezza dei contenuti: se utilizzi CSP per la protezione da XSS e uno dei domini autorizzati ha un reindirizzamento aperto, questa vulnerabilità può essere utilizzata per aggirare CSP.
- Iniezione CRLF: se il parametro di reindirizzamento consente interruzioni di riga, l'aggressore potrebbe tentare di eseguire la suddivisione dell'intestazione della risposta.
Come prevenire i reindirizzamenti aperti
Il modo più sicuro per prevenire le vulnerabilità di reindirizzamento aperto è non utilizzare reindirizzamenti nelle applicazioni web. Se ciò non è possibile, puoi provare i seguenti approcci:
- Utilizza un elenco di pagine di destinazione fissa. Memorizza gli URL completi in una tabella di database e chiamali utilizzando identificatori come parametri di richiesta, non gli URL stessi. Ad esempio, memorizza http://example2.com nella tabella del database con l'identificatore 42 e quindi utilizza la seguente chiamata per reindirizzare a example2.com: https://example.com / redirect. php ? redir_id = 42 .
- Se non puoi utilizzare un elenco fisso di destinazioni di reindirizzamento, filtra gli input non attendibili (se puoi, utilizzando una whitelist, non una blacklist). Assicurati di verificare la presenza di stringhe parziali, ad esempio, http: // example.com .evil.com è un URL valido. Inoltre, non consentire tutti i protocolli tranne HTTP e HTTPS. Tieni inoltre presente che, nonostante i tuoi migliori sforzi, è possibile che gli aggressori possano trovare un modo per aggirare i tuoi filtri.