Cómo reparar la vulnerabilidad de LFI

1

Estoy bastante seguro de que todos ustedes están conscientes de esta vulnerabilidad, pero me pregunto cómo parchear esto. He visto este código en un tutorial que es la manera de parchear esto pero el usuario todavía puede acceder a todos los archivos del directorio actual:

<?php
$page = $_GET['page'];
if(@strstr($page,'../')){
    die('LFI Attempt Detected');
}
include($page);
?>

Por favor, sugiera una buena manera de parchar esta vulnerabilidad.

    
pregunta Rehan Manzoor 14.09.2014 - 12:59
fuente

2 respuestas

4

La mitigación presentada es absolutamente insuficiente. No solo es posible incluir ningún archivo del directorio actual sino también de cualquier directorio dependiendo del sistema de archivos (es decir, \.. todavía funciona en Windows) o usando una ruta absoluta (por ejemplo, /… en sistemas similares a Unix) , o \… en Windows) también a través de diferentes protocolos / envoltorios (por ejemplo, http://… , file://… , ftp://… , etc.), permitiendo la ejecución de código PHP arbitrario.

Si no quieres esto, debes validar el valor del parámetro. Por ejemplo, si solo desea permitir ciertos valores, use una matriz y verifique si el valor dado está en ella:

$validValues = array();
if (!in_array($page, $validValues, true)) {
    die("invalid 'page' value");
}

Si desea permitir cualquier archivo dentro de un determinado directorio, puede verificar si la ruta absoluta resultante aún apunta a un archivo dentro de ese directorio usando la técnica descrita en Impedir el cruce de directorios en PHP pero permitiendo rutas .

    
respondido por el Gumbo 14.09.2014 - 15:10
fuente
0

Restrinja la entrada. Puede hacerlo utilizando una matriz de nombres de archivos que podrían incluirse o simplemente usar ese nombre único y restringirlo. el código del parche se ve así (aún no lo he probado)

 $allowed_includes = array('config', 'index','register'); //list of files that are allowed to be included if //

(in_array ($ _ GET ['file'], $ allowed_includes))  {// si el archivo proporcionado por el usuario existe en la matriz
include_once ($ _ GET ['file']. '.php');  // incluye el nombre y agrega la extensión .php, incluye el archivo. }

    
respondido por el Haider Qureshi 14.09.2014 - 13:32
fuente

Lea otras preguntas en las etiquetas