Код-ревью 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.
Что должен найти ревьюер
- Безопасностьстрока 3Path traversal:
file=../../../etc/passwdпрочитает любой файл, доступный процессу. Нужна нормализацияrealpathи проверка вхождения в папку, а лучше id вместо имени. - Безопасностьстрока 4Файл отдаётся inline с типом по содержимому: загруженный HTML откроется как страница сайта (хранимый XSS). Нужны
attachmentиnosniff. - Безопасностьстрока 5Нет проверки прав: любой скачает чужой документ.
- Безопасностьстрока 9Тип проверяется только по расширению, которое задаёт клиент.
- Безопасностьстрока 10Файл сохраняется в веб-корень под именем пользователя: можно перезаписать чужие файлы, а при неправильной настройке сервера выполнить загруженный скрипт. Имя должен генерировать сервер, хранить вне веб-корня.
Разбор
Работа с файлами сочетает path traversal, отсутствие авторизации и XSS через загрузку. Надёжная схема: хранение под сгенерированным id вне веб-корня, проверка прав, отдача с attachment.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.