четверг, 25 марта 2010 г.

Intrusion Detection For PHP Applications With PHPIDS

Эта статья покажет как настроить PHPIDS. PHPIDS (PHP-Intrusion Detection System) - это легко используемая, хорошо структурированная, быстрая прослойка для анализа безопасности ваших приложений. IDS - не является прослойкой для анализа данных, введенных пользователем, он только распознает, когда пытаются атаковать ваш сайт. на основе набора проверенных и оттестированных правил каждой атаке сопоставлен рейтинг ее опасности. Это позволит легко сохранять статистику по атакам или отсылать уведомления для команды разработчиков.

Apache версии 2 и PHP5, IP - мой. Пользователь и группа Apache - apache. Путь к php.ini - etc/php.ini. В качестве document root использовался /var/www/html/

Установка PHPIDS
Из изображений безопасности я установил PHPIDS вне document root, поэтому я создал /var/www/phpids:

Затем я установил PHPIDS (на момент установки последняя версия была 0.5).

cd /tmp
wget http://php-ids.org/files/phpids-0.4.7.ta…
tar xvfz phpids-0.4.7.tar.gz
cd phpids-0.4.7
mv lib/ /var/www/web1/phpids/
cd /var/www/web1/phpids/lib/IDS
chown -R apache:apache tmp/

Далее я переконфигурировал Config.ini:

cd Config/
vi Config.ini


Я использую конфигурацию по умолчанию, и все что надо сделать - это поменять пути

; PHPIDS Config.ini

; General configuration settings

; !!!DO NOT PLACE THIS FILE INSIDE THE WEB-ROOT IF DATABASE CONNECTION DATA WAS ADDED!!!

[General]

filter_type = xml
filter_path = /var/www/phpids/lib/IDS/default_filter.xml
tmp_path = /var/www/phpids/lib/IDS/tmp
scan_keys = false

exceptions[] = __utmz
exceptions[] = __utmc

; If you use the PHPIDS logger you can define specific configuration here

[Logging]

; file logging
path = /var/www/phpids/lib/IDS/tmp/phpids_log.txt

; email logging

; note that enabling safemode you can prevent spam attempts,
; see documentation
recipients[] = test@test.com.invalid
subject = "PHPIDS detected an intrusion attempt!"
header = "From: info@php-ids.org"
safemode = true
allowed_rate = 15

; database logging

wrapper = "mysql:host=localhost;port=3306;dbname=phpids"
user = phpids_user
password = 123456
table = intrusions

; If you would like to use other methods than file caching you can configure them here

[Caching]

; caching: session|file|database|memcached|none
caching = file
expiration_time = 600

; file cache
path = /var/www/phpids/lib/IDS/tmp/default_filter.cache

; database cache
wrapper = "mysql:host=localhost;port=3306;dbname=phpids"
user = phpids_user
password = 123456
table = cache

; memcached
;host = localhost
;port = 11211
;key_prefix = PHPIDS
;tmp_path = /var/www/phpids/lib/IDS/tmp/memcache.timestamp

Использование PHPIDS

Сейчас мы создадим /var/www/html/phpids.php, который будет использовать PHPIDS

set_include_path(
get_include_path()
. PATH_SEPARATOR
. '/var/www/phpids/lib'
);

require_once 'IDS/Init.php';
$request = array(
'REQUEST' => $_REQUEST,
'GET' => $_GET,
'POST' => $_POST,
'COOKIE' => $_COOKIE
);
$init = IDS_Init::init('/var/www/phpids/lib/IDS/Config/Config.ini');
$ids = new IDS_Monitor($request, $init);
$result = $ids->run();

if (!$result->isEmpty()) {
// Take a look at the result object
echo $result;
require_once 'IDS/Log/File.php';
require_once 'IDS/Log/Composite.php';

$compositeLog = new IDS_Log_Composite();
$compositeLog->addLogger(IDS_Log_File::getInstance($init));
$compositeLog->execute($result);
}

После этого введите в своем браузере http://192.168.0.100/phpids.php, и вы увидите пустую страницу.
Однако если вы добавите различные параметры, например http://192.168.0.100/phpids.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C/script%3E, PHPIDS определит их и напечатает результат в браузер

otal impact: 54
Affected tags: xss, csrf, id, rfe, lfi, sqli

Variable: REQUEST.test | Value: ">XXX
и т.д.

Сейчас мы сделаем так, чтобы PHPIDS тиспользовался в каждом вашем скрипте. Конечно, вам не придется модифицировать каждый файл php в вашей системе. Мы скажем php, чтобы он запускал PHPIDS при каждом старте скрипта. Мы сделаем это используя auto_prepend_file параметр. Для этого сделаем модификацию в php.ini или .htaccess file

auto_prepend_file = /var/www/html/phpids.php
или для .htaccess
php_value auto_prepend_file /var/www/html/phpids.php

Перепустите ваш Apache (для случая с модификацией php.ini)

Создайте файл info.php с содержимым

phpinfo();

Напишите в браузере http://192.168.0.100/info.php и вы увидите нормальный вывод команды phpinfo()
теперь добавьте параметры, например http://192.168.0.100/info.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C/script%3E и вы увидите

PHPIDS запишет эти данные в /var/www/phpids/lib/IDS/tmp/phpids_log.txt

"192.168.0.200",2008-06-04T17:36:08+02:00,54,"xss csrf id rfe lfi","REQUEST.test=%5C%22%3EXXX%3Cscript%3Ealert%281%29%3C%2Fscript%3E GET.test=%5C%22%3EXXX%3Cscript%3Ealert%281%29%3C%2Fscript%3E",
"%2Finfo.php%3Ftest%3D%2522%253EXXX%253Cscript%253Ealert%281%29%253C%2Fscript%253E"

Теперь, просмотрев записи. вы увидите, что хакер пытался что-то сделать с вашим приложением.

Для добавления другого уровня безопасности для вашего приложения вы можете остановить скрипт, если PHPIDS обнаружил атаку:
мы можем добавить что-то похожее на это
die('
Go away!
');
в секцию if (!$result->isEmpty()) {} в файле /var/www/html/phpids.php script

set_include_path(
get_include_path()
. PATH_SEPARATOR
. '/var/www/phpids/lib'
);

require_once 'IDS/Init.php';
$request = array(
'REQUEST' => $_REQUEST,
'GET' => $_GET,
'POST' => $_POST,
'COOKIE' => $_COOKIE
);
$init = IDS_Init::init('/var/www/phpids/lib/IDS/Config/Config.ini');
$ids = new IDS_Monitor($request, $init);
$result = $ids->run();

if (!$result->isEmpty()) {
// Take a look at the result object
echo $result;
require_once 'IDS/Log/File.php';
require_once 'IDS/Log/Composite.php';

$compositeLog = new IDS_Log_Composite();
$compositeLog->addLogger(IDS_Log_File::getInstance($init));
$compositeLog->execute($result);

die('
Go away!
');
}

Если нет атаки скрипт продолжит выполнение, иначе хакер увидит это

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

$init = IDS_Init::init('/var/www/phpids/lib/IDS/Config/Config.ini');


так как каждый раз незачем загружать файл настроек из файла, а заменить его написанным заранее классом

источник http://habrahabr.ru/blogs/php/31617/

Комментариев нет:

Отправить комментарий