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 \r\n) 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).
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: \r\n). Da porre attenzione al fatto che Windows e Linux differiscono in tale codifica: la presente è quella usata dai sistemi operativi Windows.
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.
Sessioni PHP: cosa sono, come si usanoDalla configurazione di PHP, alla gestione delle sessioni in un... |
Continuous Integration: automatizziamo i client con PhingContinuous Integration: automatizziamo i client con Phing. Esempi... |
Archiviazione delle applicazioni PHP con PharCome incorporare intere applicazioni PHP all'interno di un singolo... |
I traits in PHP 5.4Cosa sono, a cosa servono e come si unsano i traits, la novità per... |
PHP 5.4: il web server integratoImpara ad usare il web server integrato nella versione 5.4 di PHP:... |
Guida Yii FrameworkCome creare applicazioni Web in modo semplice e veloce con il... |
Guida Applicazioni Facebook con PHPCome realizzare un'applicazione per Facebook. Dalle basi della... |
Guida PHP con Windows e IISInstallare ambienti per lo sviluppo e la produzione di applicazioni... |
Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.
Iscriviti alla newsletter
|
|
Corso PHP per Webmaster11 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base25 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base05 Giugno 2012 a Roma |