Come correggere la vulnerabilità LFI

1

Sono abbastanza sicuro che tutti voi siete a conoscenza di questa vulnerabilità, ma mi chiedo come correggerla? Ho visto questo codice in un tutorial che è il modo di correggere questo problema, ma l'utente può comunque accedere a tutti i file della directory corrente:

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

Per favore suggerisci un buon metodo per correggere questa vulnerabilità.

    
posta Rehan Manzoor 14.09.2014 - 12:59
fonte

2 risposte

4

La mitigazione presentata è assolutamente insufficiente. Non è solo possibile includere qualsiasi file dalla directory corrente ma anche da qualsiasi directory a seconda del file system (cioè, \.. funziona ancora su Windows) o utilizzando un percorso assoluto (ad esempio /… su sistemi Unix-like , o \… su Windows) anche con diversi protocolli / wrapper (ad esempio, http://… , file://… , ftp://… , ecc.), consentendo l'esecuzione di codice PHP arbitrario.

Se non vuoi questo, devi convalidare il valore del parametro. Ad esempio, se si desidera solo consentire determinati valori, utilizzare una matrice e verificare se il valore indicato è in esso:

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

Se si desidera consentire qualsiasi file all'interno di una determinata directory, è possibile verificare se il percorso assoluto risultante sta ancora puntando a un file all'interno di tale directory utilizzando la tecnica descritta in Prevenire l'attraversamento di directory in PHP ma consentendo percorsi .

    
risposta data 14.09.2014 - 15:10
fonte
0

Limita l'input. Potresti farlo usando una serie di nomi di file che potrebbero essere inclusi o semplicemente usare quel singolo nome e limitarti ad esso. il codice patch è simile a questo (non l'ho ancora testato)

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

(in_array ($ _ GET ['file'], $ allowed_includes))  {// se il file fornito dall'utente esiste nell'array
include_once ($ _ GET ['file']. '.php');  // includi il nome e aggiungi l'estensione .php, includi il file. }

    
risposta data 14.09.2014 - 13:32
fonte

Leggi altre domande sui tag