Понимание включения файлов
Давайте разберёмся в концепции "включения файлов" и его потенциальных уязвимостях, особенно для начинающих.
Включение файлов - это распространенная практика в программировании, особенно в контексте повторного использования кода. Разработчики часто помещают часто используемые функции или модули в отдельные файлы. Когда эти функции или модули нужны, они просто включают эти файлы в свой код, избавляясь от необходимости повторно писать один и тот же код.
В PHP есть четыре основные функции для включения файлов:
include()
require()
include_once()
require_once()
Вот краткое описание каждой из них:
include()
: Эта функция включает файл при вызове. Если файл не найден, PHP выдаёт предупреждение, но скрипт продолжает работу.
require()
: Эта функция включает файл до запуска скрипта. Если файл не найден, PHP выдаёт фатальную ошибку и останавливает выполнение скрипта.
include_once()
и require_once()
: Эти функции работают аналогично include()
и require()
, но они гарантируют, что файл будет включен только один раз, даже если функция вызывается несколько раз.
Методы включения файлов можно разделить на два широких типа:
- Статическое включение
- Динамическое включение
Различие между этими двумя типами будет объяснено на примере в следующих разделах.
В нашем курсе мы будем изучать три файла .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, эти принципы применимы и к другим языкам программирования, даже если используемые функции могут отличаться.