Lo scopo di questo articolo è aiutare penetration tester, bug hunter e studenti ad identificare le vulnerabilità di tipo LFI nei loro futuri lavori e studi. Andremo ad esaminare casi reali che sono anche comunemente utilizzati in competizioni di tipo CTF.

Andremo dapprima a comprendere cos’è una vulnerabilità di tipo Local File Inclusion (LFI) ed infine vedremo i metodi principali per identificarla.

Cos’è un Local File Inclusion(LFI)?

Una vulnerabilità di tipo Local File Inclusion consente ad un utente malintenzionato di uploadare file qualsiasi su un server tramite il browser web. Questa vulnerabilità si verifica quando un’applicazione web include un file senza sanitizzare correttamente l’input, consentendo all’attaccante di manipolare l’input e iniettare caratteri di path traversal e includere altri file malevoli dal server Web.

L’esempio seguente è il classico codice PHP vulnerabile a LFI:

<?php
$file = $_GET[‘file’];
if(isset($file))
{
include(“pages/$file”);
}
else
{
include(“index.php”);
}
?>

In questo estratto di codice l’attaccante potrebbe cercare di manipolare il parametro file per richiamare un file in locale oppure riuscire ad iniettare uno script dannoso. Il server web dunque elaborerà la richiesta e potrebbe portare a molteplici tipi di vulnerabilità come Code Execution, DOS oppure – come accade molto spesso in uno scenario reale – Information Disclosure.

Identificare LFI nelle applicazioni Web

Le vulnerabilità LFI, nei loro casi più semplici, sono facili da identificare ed exploitare. Infatti qualsiasi script che includa un file da un server web è un ottimo candidato per ulteriori test specifici.
Ad esempio potremmo trovare un endpoint del genere:

/script.php?page=carlino.html

In questo caso è buona norma provare la classica injection LFI, ovvero:

/script.php?page=../../../../../../../../etc/passwd

Quest’ultimo endpoint infatti ci permetterebbe di visualizzare il contenuto del file /etc/passwd su un sistema Linux!

Prima di guardare nello specifico come viene sfruttata la vulnerabilità di tipo LFI diamo un’occhiata ad alcune funzioni PHP interessanti.

PHP include()

Possiamo inserire il contenuto di un file PHP in un altro file PHP prima che il server lo esegua grazie alla funzione include(). La funzione viene normalmente utilizzata per creare funzioni, headers, footers o elementi che verranno riutilizzati su più pagine.

Questa funzione per gli sviluppatori è utilissima poichè ti permette di costruire e modificare il layout delle pagine in maniera omogenea e rapida.

Supponiamo di voler creare un footer chiamato “footer.php” simile a questo:

<?php
echo "<p>Copyright &copy; 2021-" . date("Y") ."pentestingmadesimple.it</p>";
?>

Per includere queste linee di codice nella nostra pagina vittima possiamo proseguire in questo modo:

<body>
<h1>Welcome to PMS Security</h1>
<p>Ethical hacking, Pentesting, Bug Bounty e molto altro ..</p>
<?php include 'footer.php';?>
</body>
</html>

In questo modo, il file “footer.php” viene correttamente incluso nella pagina principale.

PHP require()

Simile alla funzione include(), la funzione require() viene utilizzata per includere un file nel codice PHP. Tuttavia, c’è una grande differenza tra le due funzioni. Quando un file è incluso con l’istruzione include e PHP non riesce a trovarlo o caricarlo correttamente, PHP genera un avviso, ma lo script continuerà ad essere eseguito.

<html>
<body>
<h1>Welcome to PMS!</h1>
<?php include 'fileCheNonEsiste.php';
echo "I have a $Bob $Alice.";
?>
</body>
</html>

In questo caso specifico verrà stampato l’echo con il contenuto delle variabili.

Invece, se proviamo ad eseguire lo stesso codice ma usando la funzione require(), l’istruzione echo non verrà eseguita poiché l’esecuzione dell’istruzione muore non appena l’istruzione require restituisce “fatal error“.

<html>
<body>
<h1>Welcome to PMS!</h1>
<?php require 'fileCheNonEsiste.php';
echo "I have a $Bob $Alice.";
?>
</body>
</html>

Infine un’altra funzione di cui vale la pena parlare è require_once(). Viene utilizzata per accedere ai dati di un’altra pagina nella nostra pagina, ma solo una volta. Funziona in modo molto simile alla funzione require(). L’unica differenza è che se viene rilevato che il file è già stato incluso nella pagina, lo script chiamante ignorerà ulteriori inclusioni.

Quindi, le vulnerabilità di tipo Local File Inclusion avvengono quando un utente malintenzionato tenta di ingannare l’applicazione Web includendo i file che sono già presenti localmente nel server. Si verifica quando un file PHP contiene alcune funzioni PHP come “include” , “include_once”, “require_once”.

Laboratori ed esercizi

Per esercizi pratici e laboratori puoi seguirci sui nostri canali social come Youtube e Twitch,
dove h4t4way svolgerà esercizi e caricherà i laboratori su GitHub.
Non esitare a lasciare feedback, domande o precisazioni nei commenti o entrando nelle nostre community di Telegram e Discord!

Donato Di Pasquale
Donato Di Pasquale
@dipa996 | eWPT | CyberSecurity Enthusiast | Blog writer per PentestingMadeSimple

Lascia un commento