Skip to main content

LFI

Low​

Este tipo de ataque consiste en cargar archivos locales a través de la aplicación. Para realizar pruebas, se puede acceder a la URL principal y buscar archivos como robots.txt. Si existe, es necesario averiguar su ubicación, lo que se logra navegando por los directorios. Por ejemplo, utilizando el siguiente código:

../../robots.txt

Se puede observar que se carga el archivo con los permisos correspondientes.

Basic attack robots file

A continuación, se puede seguir explorando diferentes niveles de carpetas hasta llegar a información sensible, como el archivo /etc/passwd:

../../../../../etc/passwd

Low Attack passwd file

Medium​

En el siguiente nivel, si se vuelve a probar la ruta de robots.txt, se observa que esta vez no funciona.

Fail medium attack

Al revisar el código, se observa que se realiza una sustitución con str_replace, impidiendo el uso de ../ para moverse entre directorios:

$file = str_replace( array( "../", "..\"" ), "", $file );

Sin embargo, como str_replace no es recursivo, es posible evadir esta restricción utilizando variantes como:

....//

Esto elimina el ../ pero deja el resto, permitiendo que el ataque funcione nuevamente.

Attack medium

High​

En el nivel más alto, al intentar los ataques anteriores, no se obtiene el resultado esperado.

High level basic attack failure

Medium attack failure at high level](/img/attacks/file-inclusion/LFI/attack-high-fail-medium.png)

Al revisar el código, se observa la siguiente validación:

if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}

Aquí se utiliza la función fnmatch para comprobar si la ruta contiene la palabra "file". Por lo tanto, se puede emplear el esquema file://, que da acceso al sistema de archivos local en PHP y cumple con la condición de contener "file":

file:///var/www/html/robots.txt

Attack-high-robots

file:///etc/passwd

Attack-high-passwd