[rmb homelinux]


Detectando Intrusos Em Aplicações PHP com o PHPIDS
Agosto 13, 2008, 6:33 pm
Arquivado em: HowTo, Ubuntu | Tags: , , , ,

O PHPIDS é um sistema de Detecção de Intrusos baseado em assinaturas por expressão regular, e impede que scripts maliciosos sejam executados no servidor.
Segue abaixo o guia de instalação e configuração.
Boa Sorte!

Por razões de segurança, vou instalar PHPIDS fora do DocumentRoot e, por isso, criar o diretório / var/www/web1/phpids:

mkdir /var/www/web1/phpids

Baixe a ultima versão do PHPIDS e extraia – vamos precisar apenas do diretório LIB:

cd /tmp
wget http://php-ids.org/files/phpids-0.5.tar.gz
tar xvfz phpids-0.5.tar.gz
cd phpids-0.5
mv lib/ /var/www/web1/phpids/

Entre no diretório IDS…

cd /var/www/web1/phpids/lib/IDS

…e de permissão de escrita para o apache na pasta tmp:

chown -R www-data:www-data tmp/

Agora vamos configurar o Config.ini do PHPIDS.

cd Config/
vi Config.ini

Usei a config default, alterando apenas os paths:

; 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/web1/phpids/lib/IDS/default_filter.xml
tmp_path = /var/www/web1/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/web1/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/web1/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/web1/p

Vamos agora criar o arquivo /var/www/web1/web/phpids.php que irá chamar o PHPIDS (mais tarde, vamos colocar este arquivo para todos os nossos arquivos PHP automaticamente):

vi /var/www/web1/web/phpids.php

set_include_path(
get_include_path()
. PATH_SEPARATOR
. ‘/var/www/web1/phpids/lib’
);

require_once ‘IDS/Init.php’;
$request = array(
‘REQUEST’ => $_REQUEST,
‘GET’ => $_GET,
‘POST’ => $_POST,
‘COOKIE’ => $_COOKIE
);
$init = IDS_Init::init(’/var/www/web1/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);
}
?>

Agora, quando você chamar o arquivo em um navegador, (por exemplo, http://192.168.0.100/phpids.php), você verá uma página em branco. Mas se você tentar anexar alguns parâmetros maliciosos para a URL (por exemplo, http://192.168.0.100/phpids.php?test =% 22% 3EXXX% 3Cscript% 3Ealert (1)% 3C/script% 3E), o PHPIDS irá detectar presente e imprimir as suas conclusões no navegador:

Agora temos de encontrar uma maneira de chamar o PHPIDS antes dos sites em PHP.Há duas maneiras de fazer isso.Por exemplo, se nós chamamos o script info.php em um navegador, o PHP iria executar o phpids.php primeiro e, depois, o info.php, (sem modificar o info.php).
Podemos fazer isso usando o parâmetro PHP’s auto_prepend_file no nosso php.ini (esta é uma definição global que é válido para todos os web sites PHP no servidor), ou em um .htaccess (esta é uma configuração válida apenas para o web site em questão):

php.ini
Abra o seu php.ini…

vi /etc/php5/apache2/php.ini

…e procure pela string “prepend_file”.Altere para:

[...]
auto_prepend_file = /var/www/web1/web/phpids.php
[...]

Restarte o apache:

/etc/init.d/apache2 restart

.htaccess
Em vez de alterar o php.ini (que é uma mudança global, ou seja, a mudança é válida para todos os sites que utilizam PHP no servidor), você pode usar o arquivo .htaccess (dessa forma apenas os sites que tiverem esse arquivo e uma configuração no apache chamarão o PHPIDS antes):

Crie um arquivo .htaccess…

vi /var/www/web1/web/.htaccess

…e adicione nele:

php_value auto_prepend_file /var/www/web1/web/phpids.php

Certifique-se que o vhost para o site em /var/www/web1/web contenha a string (caso contrário, o .htaccess será ignorado):

AllowOverride All

Crie o arquivo info.php…

vi /var/www/web1/web/info.php

…com este conteúdo:

phpinfo();
?>

Chame esse arquivo em um navegador (http://192.168.0.100/info.php), e você verá a saída normal do phpinfo ().

Agora se anexarmos alguns parâmetros maliciosos para a URL (por exemplo, http://192.168.0.100/info.php?test =% 22% 3EXXX% 3Cscript% 3Ealert (1)% 3C/script% 3E), você deverá encontrar um relatório PHPIDS antes do phpinfo () (porque o PHP /var/www/web1/web/phpids.php foi executado antes do /var/www/web1/web/info.php):

Cheque os logs em/var/www/web1/phpids/lib/IDS/tmp/phpids_log.txt, você deve ver algo nele:

cat /var/www/web1/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”

Era isso!

*Traduzido originalmente de http://www.howtoforge.com/intrusion-detection-for-php-applications-with-phpids


Sem comentários ainda até o momento
Deixe um comentário



Deixe um comentário
Linhas e parágrafos quebram automaticamente, endereços de email não serão mostrados, HTML permitido: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>