Содержание статьи
- Включение файлов (File Inclusion)
- Типы включения файлов
- DVWA Level Low
- Как узнать, где какие файлы? Как получить RCE?
- Удаленное включение файлов (Remote File Inclusion, RFI)
- Уязвимости, связанные с символом null byte (PHP 5)
- Обход путей (Path Traversal)
- Защита от уязвимостей
- Валидация и фильтрация пользовательских данных
- Использование функции realpath
- Bazarr
- Неизвестный баг
- Анализ без установки
- Поднимаем Bazarr
- Отладка
- Анализ CVE-2024-40348
- Что интересного можно прочесть?
- Выводы
info
Эта статья ориентирована в первую очередь на новичков и рассказывает о двух простейших уязвимостях. Если этот уровень для тебя слишком легкий, не спеши уходить — пролистай до разбора бага в Bazarr в конце статьи.
Включение файлов (File Inclusion)
Включение файлов (File Inclusion) — это тип уязвимости, который возникает, когда веб‑приложение позволяет пользователю загружать и исполнять файлы. Такие уязвимости особенно опасны, так как дают злоумышленнику возможность выполнить произвольный код на сервере.
Под включением файлов обычно подразумевают подключение внешних библиотек или модулей (на английском эта директива обычно называется include — «включать»). В разных языках программирования этот механизм реализован немного по‑разному. В этой статье мы будем рассматривать в основном примеры на PHP, поэтому давай подробно разберем реализацию в этом языке.
Вот что делает интерпретатор PHP, когда находит директиву include
:
-
Ищет файл в файловой системе: либо указанный файл должен найтись в том же каталоге, что и основная программа, либо каталог с подключаемым модулем должен быть перечислен в переменной окружения
PATH
. - Читает файл: PHP считывает содержимое файла. Обычно это HTML, CSS, JavaScript или код на PHP.
- Включение: PHP берет содержимое файла и буквально помещает его в текущий скрипт прямо в том месте, где находится оператор включения.
- Выполнение кода: как только код из включенного файла будет помещен на место, PHP продолжит обработку сценария, как если бы весь этот код был изначально в том же файле.
Типы включения файлов
Локальное включение файлов (Local File Inclusion, LFI) происходит, когда приложение загружает файлы с сервера, при этом в процессе выбора файла используются данные, которые ввел пользователь.
Эту уязвимость можно использовать для доступа к конфиденциальной информации — например, можно запросить файл с настройками или с паролями. А еще таким образом можно запустить размещенный на сервере скрипт.
Давай разберем простейший пример:
<?php$file = $_GET['file'];include($file);?>
Здесь злоумышленник может передать в параметре file
путь к любому файлу на сервере, например:
http://xakep.loc/index.php?file=/etc/passwd
Это приведет к включению содержимого файла /
в ответ, который отобразится в браузере.
Дальше для демонстрации уязвимости я буду использовать DVWA — «чертовски уязвимое веб‑приложение». Это написанный на PHP тренировочный стенд с разными видами уязвимостей. Скачиваем его:
sudo bash -c "$(curl --fail --show-error --silent --location https://raw.githubusercontent.com/IamCarron/DVWA-Script/main/Install-DVWA.sh)"
DVWA Level Low
Сперва нам нужно выбрать уровень, для этого заходим в DVWA Security, выбираем там Low и нажимаем Submit. Затем нажимаем File Inclusion.
![](https://static.xakep.ru/images/24b8d26f700447d6415c2356194cf6f0/40438/1.png)
Наверху перечислены файлы: file1.
, file2.
, file3.
. Если кликнуть на какой‑то из них, он откроется, и адрес страницы будет таким: {
.
![](https://static.xakep.ru/images/24b8d26f700447d6415c2356194cf6f0/40437/2.png)
Если нажать на кнопку View Source внизу справа, то откроется исходный код приложения.
![](https://static.xakep.ru/images/24b8d26f700447d6415c2356194cf6f0/40436/3.png)
Почему здесь нет include
? Исходник, который мы видим, принимает имя файла через URL, и в коде приложения оно добавляется как параметр для include
, выглядит это так:
file: vulnerabilities/fi/index.php:if( isset( $file ) ) include( $file );else { header( 'Location:?page=include.php' ); exit;}
Уязвимость здесь в том, что в качестве имени файла без всякой проверки берется переданный браузером параметр. Мы можем вписать в page
название другого файла на сервере и таким образом посмотреть его содержимое.
http://xakep.loc/DVWA/vulnerabilities/fi/?page=/etc/passwd
![](https://static.xakep.ru/images/24b8d26f700447d6415c2356194cf6f0/40435/4.png)
Правда, в реальной жизни дело почти никогда не в чтении /
— файла со списком пользователей ОС на веб‑сервере. Чаще всего развитием атаки становится либо RCE (удаленное выполнение кода на сервере), либо получение других чувствительных данных, хранящихся на сервере. Это могут быть бэкапы, конфиги и прочее. Например, в DVWA есть файл database/
с данными пользователей.
![](https://static.xakep.ru/images/24b8d26f700447d6415c2356194cf6f0/40433/5.png)
Как узнать, где какие файлы? Как получить RCE?
Большую помощь нам окажут фильтры PHP. В этом языке так называются обработчики потоков данных. Они позволяют читать, записывать и преобразовывать информацию.
Обертки потоков (wrappers) — это набор протоколов, которые PHP использует для обработки данных из разных источников и хранилищ. Эти обертки определяют, как данные будут доступны и как с ними взаимодействовать. Примеры оберток:
-
file://
— дает доступ к файлам на локальной файловой системе;: -
data://
— позволяет PHP обрабатывать данные, закодированные непосредственно в URL. Поддерживает несколько схем:: -
data://
— позволяет включать данные в текстовом формате;text/ plain -
data://
— позволяет включать данные изображения в формате Base64;image/ png; base64
-
-
php://
— дает доступ к внутренним потокам PHP. Имеет несколько схем, но нас интересует только одна:: -
php://
— позволяет применять фильтры к потоку данных. Фильтры могут использоваться для преобразования данных по мере их чтения или записи для кодирования, декодирования, сжатия или распаковки.filter
-
Популярные фильтры:
-
convert.
— кодирует данные в Base64;base64-encode -
convert.
— декодирует данные, закодированные в Base64;base64-decode -
string.
— применяет к данным кодировку ROT13.rot13
После фильтра должен быть указан resource
— источник, к которому будет применяться действие.
Вот для примера самый простой фильтр:
http://xakep.loc/DVWA/vulnerabilities/fi/?page=file:///etc/passwd
Здесь в параметре page
указано file:///
, что заставляет сервер обрабатывать значение как абсолютный путь к файлу на локальной файловой системе.
![](https://static.xakep.ru/images/24b8d26f700447d6415c2356194cf6f0/40434/6.png)
Перейдем к более интересному фильтру — data:/
. Внутри него мы можем написать код, который будет исполнен. Давай напишем однострочник, показывающий вывод функции phpinfo
. Это поможет узнать настройки интерпретатора PHP, который работает на сервере.
Можем отправить вот такой запрос:
http://xakep.loc/DVWA/vulnerabilities/fi/?page=data:text/plain,<?php phpinfo(); ?>
![](https://static.xakep.ru/images/24b8d26f700447d6415c2356194cf6f0/40432/7.png)
В ответ мы должны получить результат выполнения кода на PHP — как на скриншоте.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее