Введение
Добро пожаловать на наш вводный курс по уязвимостям веб-приложений, с особым акцентом на уязвимости, связанные с включением файлов (file inclusion vulnerabilities), которые являются одними из наиболее распространенных проблем в веб-приложениях.
В этом модуле мы начнем с детального рассмотрения концепции «включения файлов» (file inclusion) в контексте веб-приложений. Затем мы разовьем это понимание, чтобы объяснить, что представляет собой «уязвимость включения файлов». Наконец, мы углубимся в две основные категории уязвимостей включения файлов.
В следующем разделе этого модуля мы более подробно рассмотрим уязвимости «Локального включения файлов» (Local File Inclusion Vulnerabilities) и «Удаленного включения файлов» (Remote File Inclusion Vulnerabilities), чтобы дать вам всестороннее представление об этих критических проблемах безопасности.
Ключевые результаты обучения
- Понять фундаментальную концепцию включения файлов в веб-приложениях.
- Освоить основные принципы уязвимостей включения файлов.
- Узнать о двух основных типах уязвимостей включения файлов: Локальном (Local) и Удаленном (Remote).
Понимание включения файлов
Давайте углубимся в концепцию «включения файлов» (file inclusion) и связанные с ней потенциальные уязвимости, специально для начинающих.
Включение файлов — это распространенная практика в программировании, особенно в контексте повторного использования кода. Разработчики часто инкапсулируют часто используемые функции или модули в отдельные файлы. Когда эти функции или модули необходимы, они просто включают эти файлы в свой код, устраняя необходимость многократного написания одного и того же кода.
В PHP существует четыре основные функции для включения файлов:
include()require()include_once()require_once()
Вот краткий обзор каждой из них:
include(): Эта функция включает файл при ее вызове. Если файл не найден, PHP выдает предупреждение (warning), но выполнение скрипта продолжается.require(): Эта функция включает файл до начала выполнения скрипта. Если файл не найден, PHP выдает фатальную ошибку (fatal error) и останавливает выполнение скрипта.include_once()иrequire_once(): Эти функции работают аналогичноinclude()иrequire(), но гарантируют, что файл будет включен только один раз, даже если функция вызывается несколько раз.
Методы включения файлов можно условно разделить на две категории:
- Статическое включение (Static inclusion)
- Динамическое включение (Dynamic inclusion)
Различие между этими двумя типами будет прояснено на примере в следующих разделах.
В нашем курсе мы будем изучать три .php файла, расположенных в директории /home/labex/project/:
lfi_static.phplfi_dynamic.phpecho.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), являющиеся критической проблемой в веб-безопасности, как правило, делятся на два основных типа:
Локальное Включение Файлов (Local File Inclusion, LFI): Этот тип уязвимости возникает, когда включаются локальные файлы на целевом сервере.
Удаленное Включение Файлов (Remote File Inclusion, RFI): Этот тип уязвимости возникает, когда включаются файлы, расположенные на другом, удаленном сервере.
В примере, который мы обсуждали ранее, включение локального файла /etc/passwd является классическим примером уязвимости Локального Включения Файлов (LFI). Понимание различий между этими двумя типами уязвимостей имеет решающее значение для эффективной защиты ваших веб-приложений.
Резюме
В этой лаборатории вы изучили метод и процесс инициирования атаки посредством функциональности включения файлов (file inclusion). Давайте повторим важные моменты, рассмотренные в этом разделе:
- Что такое включение файлов?
- Что такое уязвимость включения файлов?
- Каковы два типа уязвимостей включения файлов?