Comprender las vulnerabilidades de inclusión de archivos en aplicaciones web

Beginner

Introducción

Bienvenidos a nuestro curso para principiantes sobre vulnerabilidades en aplicaciones web, centrándonos específicamente en las vulnerabilidades de inclusión de archivos (file inclusion), que se encuentran entre los problemas más prevalentes en las aplicaciones web.

En este módulo, comenzaremos diseccionando el concepto de 'inclusión de archivos' en el contexto de las aplicaciones web. Luego, construiremos sobre esa base para dilucidar qué constituye una 'vulnerabilidad de inclusión de archivos'. Finalmente, profundizaremos en las dos categorías principales de vulnerabilidades de inclusión de archivos.

En la siguiente sección de este módulo, exploraremos en detalle las 'Vulnerabilidades de Inclusión de Archivos Locales' (Local File Inclusion Vulnerabilities) y las 'Vulnerabilidades de Inclusión de Archivos Remotos' (Remote File Inclusion Vulnerabilities), proporcionándoles una comprensión exhaustiva de estos problemas críticos de seguridad.

Resultados Clave del Aprendizaje
  • Comprender el concepto fundamental de inclusión de archivos en aplicaciones web.
  • Captar los principios subyacentes de las vulnerabilidades de inclusión de archivos.
  • Aprender sobre los dos tipos principales de vulnerabilidades de inclusión de archivos: Local y Remota.
Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 96%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Comprensión de la inclusión de archivos

Profundicemos en el concepto de "inclusión de archivos" (file inclusion) y sus vulnerabilidades potenciales, especialmente adaptado para principiantes.

La inclusión de archivos es una práctica común en la programación, particularmente en el contexto de la reutilización de código. Los desarrolladores a menudo encapsulan funciones o módulos de uso frecuente en archivos separados. Cuando se requieren estas funciones o módulos, simplemente incluyen estos archivos en su código, eliminando la necesidad de escribir el mismo código repetidamente.

En PHP, existen cuatro funciones principales para la inclusión de archivos:

  1. include()
  2. require()
  3. include_once()
  4. require_once()

Aquí hay una breve descripción de cada una:

  • include(): Esta función incluye un archivo cuando se invoca. Si el archivo no se encuentra, PHP emite una advertencia (warning), pero el script continúa ejecutándose.
  • require(): Esta función incluye un archivo antes de que el script comience a ejecutarse. Si el archivo no se encuentra, PHP emite un error fatal y detiene el script.
  • include_once() y require_once(): Estas funciones funcionan de manera similar a include() y require(), pero aseguran que el archivo se incluya solo una vez, incluso si la función se llama varias veces.

Los métodos de inclusión de archivos se pueden categorizar ampliamente en dos tipos:

  1. Inclusión estática (Static inclusion)
  2. Inclusión dinámica (Dynamic inclusion)

La distinción entre estos dos tipos se aclarará con un ejemplo en las siguientes secciones.

En nuestro curso, exploraremos tres archivos .php ubicados en el directorio /home/labex/project/. Estos son:

  • lfi_static.php
  • lfi_dynamic.php
  • echo.php

Entendamos qué hace cada archivo:

  • lfi_static.php: Este archivo incluye el archivo echo.php de manera estática. En otras palabras, la ruta al archivo echo.php está codificada (hard-coded) y no cambia. Este método es seguro y no expone ninguna vulnerabilidad.

    <?php
    include("./echo.php");
    ?>
  • lfi_dynamic.php: Este archivo incluye otros archivos basándose en un parámetro 'file' en la URL. Si este parámetro no se proporciona, simplemente ofrece una pista sobre cómo usarlo. Sin embargo, este método puede ser riesgoso si el parámetro es controlado por un atacante.

    <?php
    if (isset($_GET['file'])) {
        include($_GET['file']);
    }
    else{
        echo "You can use the 'file' parameter to include files";
    }
    ?>
  • echo.php: Este archivo simplemente muestra un mensaje de éxito cuando se incluye.

    <?php
    echo 'Great, now you have successfully included the content of echo.php!'
    ?>

Utilice los siguientes comandos en la terminal para preparar la imagen para la prueba de lfi:

cd ~/projects
docker build -t lfi-image .

Cuando la construcción de la imagen haya finalizado, puede usar la imagen para iniciar un contenedor y probar la vulnerabilidad lfi:

docker run -d --name lfi -p 80:80 lfi-image

Ahora puede probar estos archivos en su navegador. Por ejemplo, para acceder al archivo lfi_static.php, deberá ingresar la siguiente URL:

http://127.0.0.1/LFI/lfi_static.php

Verá que el archivo lfi_static.php incluye con éxito el contenido de echo.php. Recuerde que este método estático de inclusión de archivos es seguro.

Ahora, veamos el archivo lfi_dynamic.php. Accédalo usando esta URL:

http://127.0.0.1/LFI/lfi_dynamic.php

Verá una indicación que le sugiere usar el parámetro 'file'. Hagamos eso e incluyamos echo.php:

http://127.0.0.1/LFI/lfi_dynamic.php?file=./echo.php

Verá que echo.php se incluye con éxito. Esto demuestra cómo funciona la inclusión de archivos. Es importante recordar que, si bien este es un ejemplo en PHP, los principios se aplican a otros lenguajes de programación, aunque las funciones específicas utilizadas puedan ser diferentes.

Comprender la vulnerabilidad de inclusión de archivos

Recientemente aprendimos cómo incluir el archivo echo.php usando el parámetro file en lfi_dynamic.php. Pero surge una pregunta:

¿Es posible incluir otros archivos usando el parámetro file?

¡La respuesta es un rotundo sí!

Si el desarrollador web descuida la validación del parámetro file, potencialmente podría ser explotado para incluir archivos sensibles ubicados en el servidor.

Aquí hay algunos ejemplos:

  • En un sistema Linux, es posible que pueda incluir el archivo /etc/passwd.
  • En un sistema Windows, podría incluir potencialmente el archivo C:\Windows\System32\drivers\etc\hosts.

Ilustremos esto con un ejemplo. Supongamos que establecemos el parámetro file a /etc/passwd:

http://127.0.0.1/LFI/lfi_dynamic.php?file=/etc/passwd

Abra la URL en el navegador y verá que hemos incluido y mostrado con éxito el contenido del archivo /etc/passwd. Esto indica la presencia de una vulnerabilidad de Inclusión de Archivos Locales (Local File Inclusion o LFI), que es un problema de seguridad grave.

Recuerde, comprender estas vulnerabilidades es el primer paso para prevenirlas. Asegúrese siempre de validar y sanear (sanitize) todas las entradas del usuario en sus aplicaciones web.

Tipos de vulnerabilidades de inclusión de archivos

Las vulnerabilidades de inclusión de archivos, un problema crítico en la seguridad web, generalmente se dividen en dos tipos principales:

  1. Inclusión de Archivos Locales (Local File Inclusion o LFI): Este tipo de vulnerabilidad ocurre cuando se incluyen archivos locales en el servidor objetivo.

  2. Inclusión de Archivos Remotos (Remote File Inclusion o RFI): Este tipo de vulnerabilidad sucede cuando se incluyen archivos ubicados en un servidor diferente y remoto.

En el ejemplo que discutimos anteriormente, la inclusión del archivo local /etc/passwd es un caso clásico de una vulnerabilidad de Inclusión de Archivos Locales (LFI). Comprender la distinción entre estos dos tipos de vulnerabilidades es crucial para asegurar eficazmente sus aplicaciones web.

Resumen

En este laboratorio, ha aprendido el método y el proceso para iniciar un ataque a través de la funcionalidad de inclusión de archivos. Repasemos los puntos importantes cubiertos en esta sección:

  • ¿Qué es la inclusión de archivos?
  • ¿Qué es una vulnerabilidad de inclusión de archivos?
  • ¿Cuáles son los dos tipos de vulnerabilidades de inclusión de archivos?