2013-02-09 15 views
7

Ich versuche, den Null Byte Injection Angriff auf ein Upload-Formular zu reproduzieren. Ich habe diesen Code:Null-Byte-Injektion in einem Upload-Formular

<?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>'; 
?> 

Ich versuche, eine Datei wie folgt benannt hochzuladen: file.php% 00jpg so wird es die substr umgehen() und wird als file.php seit move_uploaded_file hochgeladen werden () sollte beim Nullbyte (% 00) stehen bleiben.

Das Problem ist, dass die hochgeladene Datei nicht file.php auf dem Server aber file.php% 00jpg (die durch die Eingabe eines /file.php%2500jpg gestattet in der URL-Leiste zugegriffen werden kann).
Es scheint, dass move_uploaded_file() sich nicht um das Null-Byte kümmert. Wie funktioniert das? Ist es möglich, eine Datei mit der Erweiterung .php mit meinem Code zu laden?

Danke :).

+0

Es gibt einen viel einfacheren Exploit: Eine Datei kann mit einer anderen "aktiven" Erweiterung hochgeladen werden, wie '.cgi',' .asp' oder '.phtml' – duskwuff

+2

NULL-Byte-Poisoning wurde in PHP' 5.3 behoben. 4'. –

+3

** Verwenden Sie keine Blacklist für Dateiuploads **. Verwenden Sie eine Whitelist. Außerdem kann ich mir ein paar einfache Möglichkeiten vorstellen. Sie sollten sanieren. – Amelia

Antwort

7

Das HTML-Formular urlencodes den Dateinamen zu% 2500 und PHP dekodiert es wieder zu% 00 (Prozentzeichen, Null, Null). Es gibt kein Null-Byte in Ihrem Test irgendwo, Sie müssten die Datei mit einem tatsächlichen Null-Byte benennen (nicht möglich) oder manuell mit der HTTP-Anfrage fiedeln, anstatt das HTML-Formular zu verwenden. Dennoch sind aktuelle PHP-Versionen nicht anfällig für diesen Angriff, PHP intern Boxen Variablen in einem so genannten ZVal-Container und ermöglicht Null-Bytes in der Mitte eines Strings ohne jede Wirkung.

Verwandte Themen