📂 Local File Inclusion (LFI)

Explicación acerca del Local File Inclusion (LFI)

Copyright © 2010-2025 Freepik Company S.L.

📋 Índice de Contenido

📋 Índice

💡¿Qué es el LFI?

Local File Inclusion (LFI) es una vulnerabilidad en la que un atacante logra incluir archivos locales del servidor dentro de la aplicación web.

Normalmente ocurre cuando el servidor construye rutas de archivos basándose en entradas proporcionadas por el usuario sin realizar la validación adecuada.


🧪Laboratorios

En caso de que queráis ver la resolución directa de algún laboratorio, podéis utilizar el siguiente índice:

  • Lab 1: File path traversal, simple case
  • Lab 2: File path traversal, traversal sequences blocked with absolute path bypass
  • Lab 3: File path traversal, traversal sequences stripped non-recursively
  • Lab 4: File path traversal, traversal sequences stripped with superfluous URL-decode
  • Lab 5: File path traversal, validation of start of path
  • Lab 6: File path traversal, validation of file extension with null byte bypass

Dado el LFI no se clasifica estrictamente en grupos, sino más bien en diferentes formas de enfoque, abordaremos la resolución de los laboratorios de manera progresiva.


Lab 1

LFI caso sencillo

Para todos los laboratorios, utilizaremos una vulnerabilidad presente en la ruta de las imágenes que se encuentran dentro de los posts.

Si abrimos una imagen en una nueva pestaña e interceptamos la solicitud con BurpSuite, se observa la siguiente ruta:

https://0a7c002504a034be80ee26c900c400cf.web-security-academy.net/image?filename=53.jpg

En este caso, nos llama la atención el parámetro filename.

Aplicaremos la técnica más básica, que consiste en realizar un directory path traversal, es decir, retroceder directorios hasta acceder al archivo /etc/passwd. Todo esto se realiza de la siguiente manera:


Lab 2

LFI con secuencias de recorrido bloqueadas con omisión de ruta absoluta

Una vez más, contamos con la ruta del laboratorio anterior y el parámetro filename.

Sin embargo, para resolver este laboratorio, en lugar de realizar un directory path traversal, utilizaremos la ruta absoluta al archivo /etc/passwd.

https://0a7c002504a034be80ee26c900c400cf.web-security-academy.net/image?filename=/etc/passwd

Lab 3

LFI con secuencias de recorrido eliminadas de forma no recursiva

Una vez más, contamos con la ruta del laboratorio anterior y el parámetro filename.

Sin embargo, al intentar aplicar los métodos de los laboratorios anteriores, comprobamos que no funcionan.

Existen diferentes tipos de sanitización que impiden la inclusión de cadenas como ../../../ y las eliminan. No obstante, si utilizamos una cadena como ....//....//....//, puede ocurrir que el sistema elimine únicamente el primer ../ de cada bloque ....//, dejando un ../ restante.

En el payload, esto se vería de la siguiente manera:

https://0a7c002504a034be80ee26c900c400cf.web-security-academy.net/image?filename=....//....//....//....//etc/passwd

Lab 4

LFI con secuencias de recorrido eliminadas con decodificación URL superflua

Una vez más, contamos con la ruta del laboratorio anterior y el parámetro filename.

Sin embargo, al intentar aplicar los métodos de los laboratorios anteriores, comprobamos que no funcionan.

Al igual que hemos hecho en otros laboratorios con diferentes vulnerabilidades, podemos url-encodear ciertos caracteres especiales para evadir los mecanismos de validación del programa.

En este caso, podemos probar a url-encodear la barra / y, a su vez, el carácter % resultante de este url-encode.

GET /image?filename=..%252f..%252f..%252f..%252f..%252fetc/passwd

Lab 5

LFI con validación del inicio de la ruta

Una vez más, contamos con la ruta del laboratorio anterior y el parámetro filename.

Sin embargo, al intentar aplicar los métodos de los laboratorios anteriores, comprobamos que no funcionan.

Además, se puede observar en la URL que no partimos desde la raíz ni desde un directorio oculto, sino que la imagen se está buscando en /var/www/images.

Sin embargo, esto no garantiza nada, ya que todavía podemos utilizar ../../../ para acceder al archivo /etc/passwd.

Esto se realizaría de la siguiente manera:

GET /image?filename=/var/www/images/../../../../../../etc/passwd HTTP/2

Lab 6

LFI con validación de extensiones de archivos con omisión de bytes nulos

Una vez más, contamos con la ruta del laboratorio anterior y el parámetro filename.

Sin embargo, al intentar aplicar los métodos de los laboratorios anteriores, comprobamos que no funcionan.

Para resolver este laboratorio, vamos a trabajar con un concepto interesante llamado null byte.

Este se utiliza en ocasiones para engañar a los programas de validación, especialmente aquellos que verifican la extensión de un archivo. Por ejemplo, si enviamos la cadena /etc/passwd%00.jpg, el programa de validación detecta que la extensión .jpg está presente y permite la solicitud.

Sin embargo, al ser interpretada por el servidor, el null byte (%00) indica el final de la cadena, por lo que todo lo que esté detrás se ignora. Es decir, para la validación el archivo parece un .jpg, pero el servidor procesa únicamente /etc/passwd.

Todo esto se representaría de la siguiente manera:

GET /image?filename=../../../../../../../etc/passwd%00.jpg HTTP/2

Copyright © 2025 Mario Ramos. Distribuido bajo Licencia MIT.