2013-02-09 14 views
7

Sto tentando di riprodurre l'attacco di Iniezione Byte Null su un modulo di caricamento. Ho questo codice:Iniezione byte nulli in un modulo di caricamento

<?php 
if(substr($_FILES['file']['name'], -3) != "php") { 
    if(move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name'])) 
    echo '<b>File uploaded</b>'; 
    else 
    echo '<b>Can not upload</b>'; 
} 
else 
    echo '<b>This is not a valid file/b>'; 
?> 

Sto cercando di caricare un file denominato come questo: file.php% 00jpg Così sarà bypassare il substr() e saranno caricati come file.php dal move_uploaded_file () dovrebbe fermarsi al byte null (% 00).

Il problema è che il file caricato non è nominato file.php sul server ma file.php% 00jpg (cui si può accedere digitando /file.php%2500jpg nella barra degli indirizzi).
Sembra che move_uploaded_file() non si preoccupi del byte null, quindi come funziona? È possibile caricare un file con estensione .php con il mio pezzo di codice?

Grazie :).

+0

C'è un exploit molto più semplice: un file può essere caricato con una diversa estensione "attiva", come '.cgi', o' .asp' o '.phtml' – duskwuff

+2

L'avvelenamento da byte NULL è stato corretto in PHP' 5.3. 4'. –

+3

** Non utilizzare una lista nera per i caricamenti di file **. Utilizza una whitelist. Inoltre, posso pensare ad alcuni semplici modi per aggirare ciò. Dovresti disinfettare. – Amelia

risposta

7

Il modulo HTML urlencodes il nome del file in% 2500 e PHP lo decodifica nuovamente a% 00 (segno di percentuale, zero, zero). Non esiste alcun byte nullo nel test, dovresti assegnare un nome al file con un byte null effettivo (non possibile) o riprodurre manualmente la richiesta HTTP invece di utilizzare il modulo HTML. Tuttavia, le attuali versioni di PHP sono non vulnerabili a questo attacco, PHP inserisce internamente le variabili in un cosiddetto contenitore ZVal e consente byte null nel mezzo di una stringa senza alcun effetto.