Local File Inclusion (LFI)

Es una vulnerabilidad web que permite a un atacante la lectura de archivos locales de un servidor web. Esto ocurre cuando un sitio web no filtra correctamente las entradas del usuario y permite que un atacante incluya archivos locales. La causa principal de esta vulnerabilidad es la falta de validación o filtrado adecuado de las entradas del usuario.

LFI suele ir muy de la mano de la vulnerabilidad Directory Traversal, debido a que las explotaciones se realizan en parámetros de la URL sobre los ficheros propios del sistema.

En el OWASP Top 10 de 2021, no figura como un elemento específico en la lista principal. Sin embargo, sigue siendo una preocupación de seguridad importante para las aplicaciones web y puede estar cubierta de manera indirecta por otras categorías.

PoC

En este apartado veremos una pequeña demostración de una explotación LFI. En este caso hemos montado un pequeño laboratorio en un docker.

Crearemos un fichero PHP con el siguiente código dónde se espera lo siguiente:

  1. Entrada no validada: El script PHP toma el valor de $_GET['file'] sin realizar ninguna validación o sanitización. Esto significa que cualquier usuario puede proporcionar cualquier ruta de archivo a través de la URL.

  2. Inclusión de archivos dinámicos: La función include() se utiliza para incluir archivos en el script. En este caso, el nombre del archivo a incluir proviene de la entrada del usuario ($_GET['file']), lo que permite que un atacante controle qué archivo se incluye.

  3. Potencial ejecución de código arbitrario: Dado que no hay restricciones sobre qué archivos se pueden incluir, un atacante podría proporcionar una ruta a un archivo malicioso que contenga código PHP. Si el servidor está configurado para ejecutar PHP en archivos incluidos (*.php), este código malicioso se ejecutará en el contexto del servidor, lo que podría llevar a la ejecución de código arbitrario.

Código vulnerable a LFI

Como hemos comentado anteriormente, al no haber una validación o sanitización es posible listar archivos de sistema críticos como /etc/shadow o /etc/passwd.

Visualizando el código fuente de la página podremos ver mucho mejor el formato del archivo /etc/passwd.

Vulnerabilidad LFI

Mitigación

Para evitar ser vulnerables a LFI es posible implementar una serie de medidas de seguridad:

  1. Validar la entrada del usuario: Antes de incluir el archivo, debes validar la entrada del usuario para asegurarte de que solo se permitan ciertos archivos.

  2. Restringir las extensiones de archivo: Incluir solo aquellas extensiones que quieran ser permitidas, validando siempre las extensiones facilitadas en una entrada de datos antes de ser incluidas.

  3. Utilizar rutas absolutas: En lugar de incluir archivos basados en rutas relativas proporcionadas por el usuario, se recomienda usar rutas absolutas para los archivos que se desea incluir. Esto evitará que un atacante se aproveche de las rutas relativas para acceder a archivos fuera del directorio deseado.

Tomando como partida el código vulnerable utilizado en la PoC, un ejemplo de cómo se podría modificar para implementar las medidas de seguridad adecuadas:

<?php
$file = $_GET['file'];

$allowed_dir = '/ruta/a/tu/directorio/permitido/';
$allowed_ext = array('.php', '.html', '.txt'); // Extensiones permitidas

// Verificar si se proporciona un nombre de archivo
if(isset($file)) {
    // Construir la ruta completa del archivo
    $full_path = $allowed_dir . $file;

    // Verificar si la ruta está dentro del directorio permitido
    if(strpos(realpath($full_path), $allowed_dir) === 0) {
        // Verificar si la extensión del archivo es permitida
        $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
        if(in_array('.' . $ext, $allowed_ext)) {
            // Incluir el archivo si todas las verificaciones pasan
            include($full_path);
        } else {
            echo "Extensión de archivo no permitida.";
        }
    } else {
        echo "Intento de acceso a un directorio no permitido.";
    }
}
?>

Última actualización