Инъекция нулевого байта в форму загрузки



Я пытаюсь воспроизвести атаку внедрения нулевого байта в форму загрузки. У меня есть такой код:



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


Я пытаюсь загрузить файл с таким именем : file.php%00jpg таким образом, он обойдет substr() и будет загружен в виде файла.php начиная с move_uploaded_file () должен остановиться на нулевом байте (%00).



Проблема в том, что загруженный файл не называется файл.php на сервере, но файл.php%00jpg (доступ к которому можно получить, набрав / файл.php%2500jpg в строке url).

Похоже, что move_uploaded_file () не заботится о нулевом байте, так как же это работает? Можно ли загрузить файл с помощью .расширение php с моим куском кода?



Спасибо :).

621   1  

1 ответ:

URL-адрес HTML-формы кодирует имя файла в %2500, а PHP снова декодирует его в %00 (знак процента, ноль, ноль). В вашем тесте нигде нет нулевого байта, вам придется назвать файл фактическим нулевым байтом (это невозможно) или вручную выполнить HTTP-запрос вместо использования HTML-формы. Тем не менее, текущие версии PHP Не уязвимы для этой атаки, PHP внутренне помещает переменные в так называемый контейнер ZVal и позволяет нулевые байты в середине строки без каких-либо эффект.

Comments

    Ничего не найдено.