
Угроза заключается в возможности передачи нарушителем дискредитируемому браузеру запроса на доступ к файловой системе пользователя вместо URL-запроса. При этом браузер выполнит этот запрос с правами, которыми он был наделён при запуске, и передаст данные, полученные в результате выполнения этой операции, нарушителю. Данная угроза обусловлена слабостями механизма проверки вводимых пользователем запросов, который не делает различий между запросами на доступ к файловой системе и URL-запросами. Реализация данной угрозы возможна в случае наличия у нарушителя привилегий на отправку запросов браузеру, функционирующему в дискредитируемой системе.
ID угрозы: УБИ.016
Источник угрозы:
- Внешний нарушитель со средним потенциалом
Последствия реализации угрозы:
- Нарушение конфиденциальности
Необходимые меры:
Угроза доступа к локальным файлам сервера при помощи URL (Local File Inclusion - LFI) – это уязвимость, которая позволяет злоумышленнику включить и выполнить локальные файлы на сервере, используя URL-адрес. Это происходит, когда веб-приложение принимает пользовательский ввод (например, имя файла) через URL-параметр и использует его для включения файла с помощью таких функций, как include()
, require()
, include_once()
, require_once()
в PHP или аналогичных функций в других языках программирования.
Успешная атака LFI может привести к различным последствиям, включая:
- Раскрытие конфиденциальной информации: Злоумышленник может получить доступ к файлам конфигурации, файлам журналов, исходному коду приложения и другим конфиденциальным данным.
- Удаленное выполнение кода (RCE): Если злоумышленник может загрузить вредоносный код на сервер, он может использовать LFI для его выполнения.
- Несанкционированный доступ к системе: Злоумышленник может использовать LFI для получения доступа к учетным записям пользователей или другим ресурсам системы.
- Отказ в обслуживании (DoS): Злоумышленник может использовать LFI для перегрузки сервера, что приведет к отказу в обслуживании.
Для минимизации угрозы доступа к локальным файлам сервера при помощи URL необходимо принять следующие меры:
1. Валидация и санитаризация входных данных:
- Строгая проверка входных данных: Тщательно проверять все входные данные, которые используются для формирования путей к файлам, на соответствие ожидаемому формату и диапазону значений.
- Использовать “белые списки” (allowlists): Вместо того, чтобы пытаться заблокировать все известные вредоносные шаблоны (например, “..”, “/”, “"), лучше разрешать только те данные, которые соответствуют определенным критериям безопасности (например, разрешенные имена файлов из предопределенного списка).
- Ограничить доступ к файловой системе: Не разрешать пользователям указывать произвольные пути к файлам. Предоставлять доступ только к ограниченному набору файлов или директорий.
- Нормализация путей: Прежде чем использовать входные данные, нормализуйте пути к файлам, чтобы убедиться, что они находятся в пределах разрешенной директории. Удалите все относительные ссылки (например, “..”) и убедитесь, что путь является абсолютным или находится в пределах разрешенной директории.
- Экранирование и кодирование данных: Экранировать или кодировать специальные символы, которые могут быть использованы для внедрения кода.
2. Безопасное включение файлов:
- Не использовать входные данные напрямую для включения файлов: Никогда не использовать входные данные, полученные от пользователей, напрямую для включения файлов.
- Использовать предопределенные пути и имена файлов: Если необходимо включать файлы, используйте предопределенные пути и имена файлов, а не позволяйте пользователям указывать их напрямую.
- Использовать include/require только для доверенных файлов: Включайте файлы только из доверенных источников.
- Защита от многократного включения (include_once/require_once): Использовать
include_once()
илиrequire_once()
вместоinclude()
илиrequire()
, чтобы предотвратить многократное включение одного и того же файла.
3. Ограничение прав доступа к файловой системе:
- Принцип наименьших привилегий (Least Privilege Principle): Предоставлять процессу веб-сервера только те права доступа к файловой системе, которые необходимы для выполнения его задач.
- Ограничение доступа к каталогам: Ограничить доступ к каталогам, которые не должны быть доступны из веб-интерфейса.
- Использовать chroot или контейнеры: Использовать chroot (в Unix-подобных системах) или контейнеры (например, Docker) для создания изолированной среды, в которой приложение имеет доступ только к определенному подмножеству файловой системы.
4. Конфигурация веб-сервера:
- Отключить директиву
allow_url_include
(PHP): Отключить директивуallow_url_include
в конфигурации PHP, чтобы запретить включение файлов по URL. - Запретить доступ к чувствительным файлам и директориям: Настроить веб-сервер (например, Apache, Nginx) для запрета доступа к чувствительным файлам и директориям, таким как файлы конфигурации, системные файлы и директории с исходным кодом.
5. Мониторинг и аудит:
- Мониторинг доступа к файлам: Мониторить доступ к файлам и регистрировать все попытки доступа к защищаемым файлам.
- Системы обнаружения вторжений (IDS): Использовать IDS для обнаружения атак LFI.
- Анализ журналов: Регулярно анализировать журналы веб-сервера и операционной системы для выявления подозрительной активности.
6. Безопасное кодирование:
- Проверять входные данные: Всегда проверять входные данные.
- Использовать параметризованные запросы: Использовать параметризованные запросы для защиты от SQL-инъекций, которые часто используются в сочетании с LFI.
- Использовать безопасные библиотеки: Использовать безопасные библиотеки для работы с файлами.
- Проводить аудит кода: Регулярно проводить аудит кода для выявления уязвимостей.
- Тестирование безопасности: Проводить тестирование безопасности, включая ручные и автоматические тесты, чтобы проверить защиту от LFI.
7. Обновления безопасности:
- Своевременное обновление программного обеспечения: Своевременно устанавливать обновления безопасности для операционных систем, веб-серверов, интерпретаторов PHP и других компонентов системы.
8. Образование и осведомленность:
- Обучение разработчиков: Обучать разработчиков основам безопасного кодирования и мерам защиты от уязвимостей LFI.
- Обучение персонала: Обучать персонал основам безопасности и правилам защиты системы от атак.
Пример (PHP):
Уязвимый код:
<?php $file = $_GET['page']; include($file . ".php");?>
Злоумышленник может использовать URL:
?page=../../../../etc/passwd
Чтобы включить файл /etc/passwd
.
Защищенный код (пример):
<?php $allowed_pages = array('home', 'about', 'contact'); $page = $_GET['page']; if (in_array($page, $allowed_pages)) { include('pages/' . $page . '.php'); } else { echo "Page not found."; }?>
Внедрение этих мер позволит значительно снизить риск доступа к локальным файлам сервера при помощи URL и обеспечить более безопасную работу вашего веб-приложения.
Нет комментариев
Оставить комментарий