filthyHacker@home:~$

Local File Inclusion (LFI)

La vulnerabilidad Local File Inclusion, LFI por sus siglas en inglés, permite a un atacante leer archivos del servidor vulnerable. Esta afección se produce debido a malas prácticas durante la programación de una página web.

Dependiendo de la gravedad, esta vulnerabilidad puede llevar al atacante a:

  • RCE (Remote Code Execution)
  • XSS (Cross-Site Scripting)
  • DoS (Denial of Service)

Un ejemplo muy básico sería el siguiente script en PHP.

<?php
	$file = $_GET['filename'];
	include($file);
?>

Script, del que podemos abusar para leer cualquier archivo del sistema, en este caso el /etc/passwd.

localhost/lfi.php?filename=/etc/passwd

1

Es importante aclarar que esta no es solo una vulnerabilidad de PHP, también está presente en otros lenguajes como lo es JSP o ASP.

Directory Path Traversal

Es posible que en el código, se nos limite a acceder a archivos que se ubican únicamente en una ruta preestablecida en el script, en este caso /var/www/html/.

<?php
	$file = $_GET['filename'];
	include("/var/www/html/" . $file);
?>

Sin embargo, podemos “escaparnos” de la ruta preestablecida si añadimos ../ en nuestra cadena de ataque, pudiendo así listar contenido más allá de /var/www/html/.

localhost/lfi.php?filename=../../../etc/passwd

2

Null Byte

De igual manera, es posible que en el código se nos limite a acceder a archivos de determinada extensión, en este caso archivos de extensión .php.

<?php
	$file = $_GET['filename'];
        include($file . ".php");
?>

De modo que cuando intentemos leer el archivo /etc/passwd, o cualquier otro archivo del sistema, lo que estaríamos leyendo en realidad sería el archivo /etc/passwd.php, el cual no existe.

Sin embargo, si añadimos el nullbyte %00 al final de nuestra cadena de ataque, el .php no será tenido en cuenta, pudiendo así leer con normalidad el /etc/passwd, o cualquier otro archivo del sistema.

localhost/lfi.php?filename=/etc/passwd%00

3

Wrappers

PHP cuenta con una serie de wrappers, los cuales a menudo pueden ser abusados; por mencionar algunos tenemos:

expect://

Nos permite una ejecución remota de comandos (RCE); cabe aclarar que este wrapper no está activado por defecto, por lo que no siempre será posible utilizarlo.

localhost/lfi.php?filename=expect://whoami

4

filter://

Nos permite codificar archivos del sistema a través de diferentes métodos como podría ser Base64 o ROT13.

Este wrapper resulta bastante útil si necesitamos leer un archivo en PHP, ya que recordemos, este es un lenguaje interpretado, por lo que, si intentáramos leer un archivo PHP del servidor vulnerable, lo que veríamos sería simplemente el output del script.

5

localhost/lfi.php?filename=php://filter/convert.base64-encode/resource=filterWrapper.php

6

7