Introduzione
Quanto detto al riguardo delle inclusioni dinamiche ha effetto anche per i rindirizzamenti dinamici via PHP. Si abbia l'istruzione seguente posta in un qualsiasi punto di uno script:
header("Location:".$_GET['GoTo']);
Non è necessario spiegare ulteriormente il possibile exploit: una query string ben studiata può rindirizzare il flusso della navigazione dove voluto. E sappiamo anche come difenderci.
Questa volta tuttavia non è finita qui: essendo eseguita lato server, l'istruzione header può indurre il browser a impostare un cookie (impostare un cookie infatti altro non vuol dire che inviare uno header opportuno) voluto dal cracker stesso, esattamente come se arrivasse, consciamente, dall'applicazione remota:
http://my_site/test.php?GoTo=http://remote_site/main.php%0D%0ASet-Cookie:%20PHPSESSID=12e6rv93ee5c9952
Il comando PHP header non vedrà solamente il rindirizzamento, ma anche una seconda riga (%0D%0 è la codifica per gli URL di rn) in cui si invia appunto al client (la richiesta di impostare) il cookie.
Molto, ma molto, importante è che questo exploit potrebbe portare ad un attacco di tipo "session fixation" in quanto induce il browser a impostare un cookie contenente dati di sessione (vedere più avanti).
Rimedio
Il rimedio è semplicissimo: evitare che il comando Set-Cookie possa esser inviato via query string, tramite la seguente riga di codice:
if (strpos(strtolower($_SERVER['REQUEST_URI']),"set-cookie:")!==false) exit;
Posta all'inizio di ogni script. Alternativamente - e più efficacemente - possiamo eliminare tutti i caratteri di CR+LF (ritorno a capo e nuova riga: rn). Da porre attenzione al fatto che Windows e Linux differiscono in tale codifica: la presente è quella usata dai sistemi operativi Windows.
Nota
Per visualizzare un cookie presente sulla nostra macchina utilizziamo, con Firefox, la seguente finestra: Strumenti / Opzioni / Privacy / Cookie.
I cookie standard usati da PHP per tener traccia dei dati di sessione (mantenendo cioè le impostazioni di default nel php.ini) scadono alla chiusura del browser: sono visualizzabili come sopra descritto ma non vengono salvati su filesystem locale, rimanendo in memoria per tutta la loro (in genere breve) vita.