Понять уязвимости, связанные с включением файлов в веб - приложениях

Beginner

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

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

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

Основные цели обучения
  • Понять основную концепцию включения файлов в веб-приложениях.
  • Сосвоить основные принципы уязвимостей, связанных с включением файлов.
  • Узнать о двух основных типах уязвимостей, связанных с включением файлов: локальных и удаленных.

Skills Graph

Понимание включения файлов

Давайте разберёмся в концепции "включения файлов" и его потенциальных уязвимостях, особенно для начинающих.

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

В PHP есть четыре основные функции для включения файлов:

  1. include()
  2. require()
  3. include_once()
  4. require_once()

Вот краткое описание каждой из них:

  • include(): Эта функция включает файл при вызове. Если файл не найден, PHP выдаёт предупреждение, но скрипт продолжает работу.
  • require(): Эта функция включает файл до запуска скрипта. Если файл не найден, PHP выдаёт фатальную ошибку и останавливает выполнение скрипта.
  • include_once() и require_once(): Эти функции работают аналогично include() и require(), но они гарантируют, что файл будет включен только один раз, даже если функция вызывается несколько раз.

Методы включения файлов можно разделить на два широких типа:

  1. Статическое включение
  2. Динамическое включение

Различие между этими двумя типами будет объяснено на примере в следующих разделах.

В нашем курсе мы будем изучать три файла .php, расположенные в директории /home/labex/project/. Это:

  • lfi_static.php
  • lfi_dynamic.php
  • echo.php

Давайте разберем, что делает каждый файл:

  • lfi_static.php: Этот файл включает файл echo.php статически. Другими словами, путь к файлу echo.php жестко закодирован и не меняется. Этот метод безопасен и не представляет никаких уязвимостей.

    <?php
    include("./echo.php");
    ?>
  • lfi_dynamic.php: Этот файл включает другие файлы на основе параметра 'file' в URL. Если этот параметр не указан, он просто даёт подсказку о том, как его использовать. Однако этот метод может быть опасен, если параметр контролируется злоумышленником.

    <?php
    if (isset($_GET['file'])) {
        include($_GET['file']);
    }
    else{
        echo "You can use the 'file' parameter to include files";
    }
    ?>
  • echo.php: Этот файл просто выводит сообщение об успехе при включении.

    <?php
    echo 'Great, now you have successfully included the content of echo.php!'
    ?>

Используйте следующие команды в терминале, чтобы подготовить образ для теста lfi:

cd ~/projects
docker build -t lfi-image.

После завершения сборки образа вы можете использовать его для запуска контейнера для тестирования уязвимости lfi:

docker run -d --name lfi -p 80:80 lfi-image

Теперь вы можете протестировать эти файлы в браузере. Например, чтобы открыть файл lfi_static.php, вы должны ввести следующий URL:

http://127.0.0.1/LFI/lfi_static.php

Вы увидите, что файл lfi_static.php успешно включает содержимое файла echo.php. Помните, что этот статический метод включения файлов безопасен.

Теперь давайте посмотрим на файл lfi_dynamic.php. Откройте его по следующему URL:

http://127.0.0.1/LFI/lfi_dynamic.php

Вы увидите подсказку о том, что нужно использовать параметр 'file'. Давайте сделаем это и включим файл echo.php:

http://127.0.0.1/LFI/lfi_dynamic.php?file=./echo.php

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

Понимание уязвимости, связанной с включением файлов

Недавно мы узнали, как включить файл echo.php, используя параметр file в файле lfi_dynamic.php. Но возникает вопрос:

Можно ли включить другие файлы с помощью параметра file?

Ответ - однозначно да!

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

Вот несколько примеров:

  • В системе Linux можно попробовать включить файл /etc/passwd.
  • В системе Windows можно попробовать включить файл C:\Windows\System32\drivers\etc\hosts.

Давайте рассмотрим пример. Предположим, мы устанавливаем параметр file равным /etc/passwd:

http://127.0.0.1/LFI/lfi_dynamic.php?file=/etc/passwd

Откройте этот URL в браузере, и вы увидите, что мы успешно включили и отобразили содержимое файла /etc/passwd. Это свидетельствует о наличии уязвимости локального включения файлов (Local File Inclusion - LFI), которая представляет серьезную угрозу безопасности.

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

Типы уязвимостей, связанных с включением файлов

Уязвимости, связанные с включением файлов, являются важной проблемой в веб-безопасности и обычно делятся на два основных типа:

  1. Локальное включение файлов (Local File Inclusion - LFI): Этот тип уязвимости возникает, когда включаются локальные файлы на целевом сервере.

  2. Удаленное включение файлов (Remote File Inclusion - RFI): Этот тип уязвимости возникает, когда включаются файлы, расположенные на другом, удаленном сервере.

В примере, который мы обсуждали ранее, включение локального файла /etc/passwd является типичным примером уязвимости локального включения файлов (LFI). Понимание различий между этими двумя типами уязвимостей является ключевым моментом для эффективной защиты ваших веб-приложений.

Резюме

В этом практическом занятии вы узнали метод и процесс проведения атаки с использованием функции включения файлов. Давайте повторим важные моменты, рассмотренные в этом разделе:

  • Что такое включение файлов?
  • Что такое уязвимость, связанная с включением файлов?
  • Какие два типа уязвимостей, связанных с включением файлов, существуют?