La apariencia engañosa (300)
Hay un sistema de gestión de archivos en el servidor. Te permite ver el contenido de los archivos de una carpeta. Parece una herramienta simple, pero ¿qué pasa si el sistema confía demasiado en ti? Descubre cómo leer un archivo que no deberías poder ver y encuentra la flag oculta en algún lugar del sistema.
Descargar contenedor Docker del desafío
Análisis inicial

En la página principal, no tenemos nada de información sobre la flag. Solo una pantalla de bienvenida. Por suerte, para este reto contamos con el código fuente del servidor web.
Echando un vistazo a la estructura de archivos del contenedor, vemos que hay un fichero index.php en la carpeta html que es el que se sirve al usuario. También hay un fichero flag.txt que probablemente contenga la flag del reto.
.
├── docker-compose.yml
└── html
├── flag.txt
├── index.html
├── index.php
└── style.css
Vamos a ver el contenido del fichero index.php para entender cómo funciona la aplicación.
<?php
$page = $_GET['page'] ?? 'index.html';
if (file_exists($page)) {
include($page);
} else {
echo "<h1>404 Not Found</h1><p>La página no existe.</p>";
}
?>
Se trata de un código muy simple. La aplicación obtiene el parámetro page de la URL y lo utiliza para incluir un archivo en la respuesta. Si el archivo no existe, muestra un mensaje de error 404.
Explotación
El problema aquí es que la aplicación no valida el valor del parámetro page. Esto significa que podemos utilizar rutas relativas para acceder a archivos dentro del directorio del servidor. Vamos a intentar acceder al archivo flag.txt utilizando la siguiente URL:
http://localhost:80/?page=flag.txt
Tal y como esperábamos, la aplicación incluye el contenido de flag.txt en la respuesta:
ikerlan{lfilfilfilfilfilfi}
LFI son las siglas de Local File Inclusion, una vulnerabilidad que permite a un atacante incluir archivos locales en el servidor web.