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:
include()
require()
include_once()
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:
- Inclusión estática (Static inclusion)
- 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.