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

Beginner

Введение

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

В этом модуле мы начнем с детального рассмотрения концепции «включения файлов» (file inclusion) в контексте веб-приложений. Затем мы разовьем это понимание, чтобы объяснить, что представляет собой «уязвимость включения файлов». Наконец, мы углубимся в две основные категории уязвимостей включения файлов.

В следующем разделе этого модуля мы более подробно рассмотрим уязвимости «Локального включения файлов» (Local File Inclusion Vulnerabilities) и «Удаленного включения файлов» (Remote File Inclusion Vulnerabilities), чтобы дать вам всестороннее представление об этих критических проблемах безопасности.

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

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

Давайте углубимся в концепцию «включения файлов» (file inclusion) и связанные с ней потенциальные уязвимости, специально для начинающих.

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

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

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

Вот краткий обзор каждой из них:

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

Методы включения файлов можно условно разделить на две категории:

  1. Статическое включение (Static inclusion)
  2. Динамическое включение (Dynamic inclusion)

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

В нашем курсе мы будем изучать три .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. Если этот параметр не указан, он просто дает подсказку о том, как его использовать. Однако этот метод может быть рискованным, если параметром управляет злоумышленник (attacker).

    <?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?

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

Если веб-разработчик пренебрегает проверкой (validation) параметра 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), что является серьезной проблемой безопасности.

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

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

Уязвимости включения файлов (File Inclusion vulnerabilities), являющиеся критической проблемой в веб-безопасности, как правило, делятся на два основных типа:

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

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

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

Резюме

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

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