LFI (Local File Inclusion)

🌐 Vulnerabilidad: Local File Inclusion (LFI)


🕵️‍♂️ ¿Qué es LFI?

Local File Inclusion (LFI) es una vulnerabilidad que permite a un atacante incluir archivos locales del servidor en la ejecución de una aplicación web. Esto ocurre debido a una falta de validación en las entradas del usuario al manejar rutas de archivos.


⚙️ ¿Cómo se produce?

El problema surge cuando la aplicación permite que un usuario especifique la ruta de un archivo, y esta ruta no es validada o restringida correctamente. El atacante puede manipular la entrada para leer archivos confidenciales o ejecutar scripts no autorizados.


🛠️ Mecanismo de ataque

  1. Identificación del parámetro vulnerable: Una URL como esta puede indicar una posible vulnerabilidad LFI:

    http://victim.com/index.php?page=about
  2. Explotación del parámetro: El atacante manipula el parámetro para incluir archivos sensibles del servidor:

    http://victim.com/index.php?page=../../../../etc/passwd

    Si el servidor es vulnerable, mostrará el contenido del archivo /etc/passwd.

  3. Ejecución de código (en algunos casos): Si el atacante encuentra un archivo que contiene código PHP, puede ejecutarlo utilizando LFI combinado con otros métodos, como la inyección de logs o la carga de archivos maliciosos.


🎯 Impacto

  • Acceso a archivos sensibles: Contraseñas, configuraciones de bases de datos, claves API.

  • Ejecución de código: En algunos casos, puede usarse para ejecutar scripts maliciosos.

  • Exposición de información interna: Revela la estructura y configuración del sistema.

  • Escalada de privilegios: Si el atacante accede a archivos críticos.


📉 Puntaje CVSS v3

  • Vector de ataque: Red (Explotable remotamente)

  • Complejidad del ataque: Media (requiere manipulación específica de rutas)

  • Impacto en la confidencialidad: Alto

  • Impacto en la integridad: Medio

  • Impacto en la disponibilidad: Bajo a medio

  • Puntaje CVSS v3: 7.0 - 8.0 (Alto) ⚠️


🧑‍💻 Ejemplo práctico

Código vulnerable en PHP:

<?php
    $page = $_GET['page'];
    include($page . '.php'); // No se valida la entrada
?>

Ataque: El atacante puede manipular la ruta del archivo utilizando una técnica conocida como traversal directory:

http://victim.com/index.php?page=../../../../etc/passwd

Si el archivo existe, el servidor mostrará su contenido. Para entornos Windows, podrían acceder a:

http://victim.com/index.php?page=../../../../windows/system32/drivers/etc/hosts

🛡️ ¿Cómo prevenir LFI?

1️⃣ Validación estricta de las entradas

Asegúrate de que las entradas del usuario sean seguras y no permitan rutas personalizadas:

<?php
    $allowed_pages = ['home', 'about', 'contact'];
    $page = $_GET['page'];
    
    if (in_array($page, $allowed_pages)) {
        include($page . '.php');
    } else {
        echo "Página no encontrada.";
    }
?>

2️⃣ Uso de rutas absolutas

Evita usar rutas relativas y utiliza rutas absolutas definidas en el código.

3️⃣ Evitar include dinámico

Si es posible, evita usar include, require o funciones similares con entradas de usuario.

4️⃣ Deshabilitar el acceso a directorios sensibles

Asegúrate de que los directorios críticos no sean accesibles desde la web mediante la configuración del servidor.

Ejemplo en Apache (archivo .htaccess):

<FilesMatch "\.(env|log|ini|conf|sql)$">
    Require all denied
</FilesMatch>

5️⃣ Aplicar un WAF

Un Web Application Firewall puede bloquear solicitudes maliciosas que intenten explotar LFI.


💡 Dato extra: LFI suele combinarse con vulnerabilidades como RCE (Remote Code Execution) o RFI (Remote File Inclusion), aumentando el impacto del ataque.

🚨 Nota importante: En servidores con registros de acceso o error mal configurados, los atacantes pueden inyectar código malicioso en los logs y luego usar LFI para ejecutarlo.

Última actualización

¿Te fue útil?