Saltar al contenido principal

LFI

Bajo

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.

Ataque básico fichero robots

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

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

Ataque básico fichero passwd

Medio

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

Fallo ataque medio

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.

Ataque medio

Alto

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

Fallo ataque basico en nivel alto

Fallo ataque medio en nivel alto

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

Ataque alto robots

file:///etc/passwd

Ataque alto passwd