Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Баги, связанные с включением файлов (File Inclusion) и обходом путей (Path Traversal), — одни из самых критических в веб‑безопасности, поскольку позволяют читать и выполнять файлы. В этой статье мы с самого начала рассмотрим, как они работают, и научимся их эксплуатировать в рамках лабораторных работ, а потом посмотрим на недавний пример — уже совершенно реальный. info
Эта статья ориентирована в первую очередь на новичков и рассказывает о двух простейших уязвимостях. Если этот уровень для тебя слишком легкий, не спеши уходить — пролистай до разбора бага в Bazarr в конце статьи.
Включение файлов (File Inclusion) — это тип уязвимости, который возникает, когда веб‑приложение позволяет пользователю загружать и исполнять файлы. Такие уязвимости особенно опасны, так как дают злоумышленнику возможность выполнить произвольный код на сервере.
Под включением файлов обычно подразумевают подключение внешних библиотек или модулей (на английском эта директива обычно называется include — «включать»). В разных языках программирования этот механизм реализован немного по‑разному. В этой статье мы будем рассматривать в основном примеры на PHP, поэтому давай подробно разберем реализацию в этом языке.
Вот что делает интерпретатор PHP, когда находит директиву include
:
PATH
.
Локальное включение файлов (Local File Inclusion, LFI) происходит, когда приложение загружает файлы с сервера, при этом в процессе выбора файла используются данные, которые ввел пользователь.
Эту уязвимость можно использовать для доступа к конфиденциальной информации — например, можно запросить файл с настройками или с паролями. А еще таким образом можно запустить размещенный на сервере скрипт.
Давай разберем простейший пример:
<?php$file = $_GET['file'];include($file);?>
Здесь злоумышленник может передать в параметре file
путь к любому файлу на сервере, например:
http://xakep.loc/index.php?file=/etc/passwd
Это приведет к включению содержимого файла /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 Security, выбираем там Low и нажимаем Submit. Затем нажимаем File Inclusion.
Наверху перечислены файлы: file1.php
, file2.php
, file3.php
. Если кликнуть на какой‑то из них, он откроется, и адрес страницы будет таким: {url}/?page=file1.php
.
Если нажать на кнопку View Source внизу справа, то откроется исходный код приложения.
Почему здесь нет 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
Правда, в реальной жизни дело почти никогда не в чтении /etc/passwd
— файла со списком пользователей ОС на веб‑сервере. Чаще всего развитием атаки становится либо RCE (удаленное выполнение кода на сервере), либо получение других чувствительных данных, хранящихся на сервере. Это могут быть бэкапы, конфиги и прочее. Например, в DVWA есть файл database/sqli.db.dist
с данными пользователей.
Большую помощь нам окажут фильтры PHP. В этом языке так называются обработчики потоков данных. Они позволяют читать, записывать и преобразовывать информацию.
Обертки потоков (wrappers) — это набор протоколов, которые PHP использует для обработки данных из разных источников и хранилищ. Эти обертки определяют, как данные будут доступны и как с ними взаимодействовать. Примеры оберток:
file://:
— дает доступ к файлам на локальной файловой системе; data://:
— позволяет PHP обрабатывать данные, закодированные непосредственно в URL. Поддерживает несколько схем:
data://text/plain
— позволяет включать данные в текстовом формате; data://image/png;base64
— позволяет включать данные изображения в формате Base64; php://:
— дает доступ к внутренним потокам PHP. Имеет несколько схем, но нас интересует только одна:
php://filter
— позволяет применять фильтры к потоку данных. Фильтры могут использоваться для преобразования данных по мере их чтения или записи для кодирования, декодирования, сжатия или распаковки. Популярные фильтры:
convert.base64-encode
— кодирует данные в Base64; convert.base64-decode
— декодирует данные, закодированные в Base64; string.rot13
— применяет к данным кодировку ROT13. После фильтра должен быть указан resource
— источник, к которому будет применяться действие.
Вот для примера самый простой фильтр:
http://xakep.loc/DVWA/vulnerabilities/fi/?page=file:///etc/passwd
Здесь в параметре page
указано file:///etc/passwd
, что заставляет сервер обрабатывать значение как абсолютный путь к файлу на локальной файловой системе.
Перейдем к более интересному фильтру — data://
. Внутри него мы можем написать код, который будет исполнен. Давай напишем однострочник, показывающий вывод функции phpinfo
. Это поможет узнать настройки интерпретатора PHP, который работает на сервере.
Можем отправить вот такой запрос:
http://xakep.loc/DVWA/vulnerabilities/fi/?page=data:text/plain,<?php phpinfo(); ?>
В ответ мы должны получить результат выполнения кода на PHP — как на скриншоте.
Источник: xakep.ru