Задать вопрос
@sr36

Уязвим ли этот участок кода PHP для загрузки произвольного файла?

Добрый день. Сейчас дорабатываю небольшой сайт, изначально код писал не я. Наткнулся на следующий участок кода
session_start();
if (0 < $_FILES['file']['error']) {
    echo 'Error into upload.php file.';
} else {
    $id = $_POST['user_id'];
    $type =  $_POST['type'];
    if (!file_exists('uploads/' . $id)) {
        mkdir('uploads/' . $id, 0777, true);
    }
    $infos = pathinfo($_FILES['file']['name']);
    if ($type == "attachments") {
        $allowed_extensions = array("psd","ai","eps","pptx","rtf","wma","odp","ods","sxw","sxi","sxc","dwg","xps","jpg","jpeg","png","gif","svg","pdf","doc","docx","key","ppt","odt","xls","xlsx","zip","rar","mp3","m4a","ogg","wav","mp4","mov","wmv","avi","mpg","ogv","3gp","3g2","mkv","txt","ico","exe","csv","java","js","xml","unx","ttf","font","css");
        if (in_array($infos['extension'], $allowed_extensions)) {
            $file_name = $_FILES['file']['name'];
            move_uploaded_file($_FILES['file']['tmp_name'], "uploads/" . $id . "/" . $file_name);
        }
    } else {
        if ($infos['extension'] == "jpg" || $infos['extension'] == "png") {
            $url = "uploads/" . $id . "/" . $id;
            move_uploaded_file($_FILES['file']['tmp_name'], $url . "." . $infos['extension']);
            if ($infos['extension'] == "png") {
                imagejpeg(imagecreatefrompng($url . "." . $infos['extension']), $url . ".jpg", 90);
                unlink($url . "." . $infos['extension']);
            }
        }
    }
}
?>


Стало интересно, уязвим ли этот участок кода для загрузки файла, с расширением php. С одной стороны, происходит фильтрация по расширениям только из "белого списка" С другой стороны, проверка in_array($infos['extension'], $allowed_extensions) не внушает доверия. Не хватает опыта разобраться, буду благодарен за помощь
  • Вопрос задан
  • 243 просмотра
Подписаться 2 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 4
@Nc_Soft
Как правило уязвимость больше определяется настройкой веб сервера. Какие файлы и как он может выполнять.
Ответ написан
Комментировать
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Вижу в коде возможность залить файл вне папки uploads/ подменив $_POST['user_id']
В зависимости от настроек сервера, потенциально в связке с остальным кодом можно перезаписать на сервере или добавить свои
  • robots.txt
  • sitemap.xml
  • любые JS используемые на сайте
  • любые CSS используемые на сайте
  • любые изображения используемые на сайте
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
$id = $_POST['user_id']; //тута опа!
$type =  $_POST['type'];
if (!file_exists('uploads/' . $id)) {
        mkdir('uploads/' . $id, 0777, true);
}

Обрабатывайте все входные параметры фильтром через регулярные выражения!
Ответ написан
@qdevelopment
Во-первых, такая информация как user_id, обычно хранится в сессии. В вашем случае получается, что пользователь может ввести user_id другого пользователя (да еще и не фильтруется значение) и загрузить файл в его папку.

Во-вторых, нельзя файл сохранять с тем названием, что указано в запросе от пользователя. Генерируйте уникальную строку и храните с этим названием и с расширением из белого списка.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы