Код-ревью Junior SSRF, файлы и редиректы обновлено

Ревью: скачивание и загрузка файлов на PHP

Вопрос

Найдите уязвимости в работе с файлами.

<?php
if (isset($_GET['file'])) {
    $path = '/var/www/uploads/' . $_GET['file'];
    header('Content-Type: ' . mime_content_type($path));
    readfile($path);
    exit;
}
$name = $_FILES['doc']['name'];
if (str_ends_with($name, '.pdf')) {
    move_uploaded_file($_FILES['doc']['tmp_name'], '/var/www/html/uploads/' . $name);
}

Коротко

Работа с файлами сочетает path traversal, отсутствие авторизации и XSS через загрузку. Надёжная схема: хранение под сгенерированным id вне веб-корня, проверка прав, отдача с attachment.

Что должен найти ревьюер

  1. Безопасностьстрока 3
    Path traversal: file=../../../etc/passwd прочитает любой файл, доступный процессу. Нужна нормализация realpath и проверка вхождения в папку, а лучше id вместо имени.
  2. Безопасностьстрока 4
    Файл отдаётся inline с типом по содержимому: загруженный HTML откроется как страница сайта (хранимый XSS). Нужны attachment и nosniff.
  3. Безопасностьстрока 5
    Нет проверки прав: любой скачает чужой документ.
  4. Безопасностьстрока 9
    Тип проверяется только по расширению, которое задаёт клиент.
  5. Безопасностьстрока 10
    Файл сохраняется в веб-корень под именем пользователя: можно перезаписать чужие файлы, а при неправильной настройке сервера выполнить загруженный скрипт. Имя должен генерировать сервер, хранить вне веб-корня.

Разбор

Работа с файлами сочетает path traversal, отсутствие авторизации и XSS через загрузку. Надёжная схема: хранение под сгенерированным id вне веб-корня, проверка прав, отдача с attachment.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.