Prevenzione di reindirizzamenti e inoltro non convalidati

4

Supponiamo di avere una pagina di reindirizzamento in cui il client viene reindirizzato a un URL dalla stringa di query:

http://victim/redirect.aspx?url=http://evil/

Devi veramente essere in grado di reindirizzare a un'altra pagina o URL, come puoi evitare che questa funzionalità venga sfruttata?

OWASP dice:

It is recommended that any such destination input be mapped to a value, rather than the actual URL or portion of the URL, and that server side code translate this value to the target URL.

Qualcuno potrebbe spiegarlo con un esempio, per favore?

    
posta Awa 26.12.2015 - 14:24
fonte

2 risposte

4

Non fornire l'URL effettivo come argomento per lo script. Invece, fornire un ID che è possibile tradurre in un URL nello script di redirector.

Ad esempio, usa redirect.aspx?url=1 e, nello script, traduci l'ID 1 in un URL utilizzando una mappa, la ricerca nel database o qualsiasi altra cosa utile.

In questo modo, è possibile reindirizzare solo un set fisso di URL affidabili.

    
risposta data 26.12.2015 - 14:30
fonte
3

Un reindirizzamento aperto significa che il valore di reindirizzamento può essere determinato al volo.

Quello che si consiglia è di avere solo una lista consentita predefinita. Si dispone di un meccanismo per consentire a un utente autorizzato di inserire l'URL o forse questa è una funzione automatica di un CMS o di un'app Web che cerca i collegamenti in uscita e quindi crea la voce. Determinate quali sono i criteri necessari per una persona o un processo automatizzato per "aggiungere" un link, potete anche filtrare o inserire una blacklist nel momento in cui ciò accade.

Sul lato server, avresti quindi un database. Dovresti aggiungere al database almeno un ID e l'URL effettivo. Puoi decidere di fare qualcosa di diverso dai numeri di identificazione in ordine, magari usando qualche funzione per creare numeri semi-casuali al fine di prevenire l'enumerazione semplicemente incrementando il valore di id. Qualcosa come

| id | real_url    | shortcode |
--------------------------------
| 1  | example.com | X3DFE     |
| 2  | example.net | G4TG      |

Potresti avere un URL come: example.com/out?shortcode=X3DFE lo elabori dal lato server e poi emetti un reindirizzamento a real_url se lo shortcode non si trova nella tabella di ricerca, fornisci un messaggio di errore che dice che è non valido.

Quindi sul lato server qualcosa come:

$shortcode = filter_function($_GET['shortcode']);
$url = sql_select_function("SELECT 'real_url' FROM url_table WHERE shortcode ='" . $shortcode . "');

header("HTTP/1.1 301 Moved Permanently"); 
header("Location: " . $url . ""); 

Le specifiche dipenderanno ovviamente dalla tua lingua e dalle altre attività che desideri svolgere.

Il tuo database può anche includere altre informazioni, potresti richiedere moderazione per i link inviati dall'utente o potresti voler includere l'utente che ha creato i collegamenti. Puoi anche registrare i conteggi dei colpi, ecc.

Il concetto chiave è che si utilizza un meccanismo per predeterminare l'elenco e assicurarsi che la decisione di reindirizzamento sia presa sul lato server. L'idea è di creare una whitelist di consentire reindirizzamenti.

Ti consiglio di esaminare il modo in cui alcuni accorciatori di URL funzionano come il suo concetto simile e possono fornire un codice utile nella tua lingua di destinazione.

    
risposta data 26.12.2015 - 17:03
fonte

Leggi altre domande sui tag