PHP应用程序的入侵检测

使用PHPIDS进行PHP应用入侵检测

版本1.0
作者:Falko Timme

本教程将介绍如何在具有Apache2和PHP5的Web服务器上设置PHPIDS 。 PHPIDS(PHP入侵检测系统)是基于PHP的Web应用程序的简单易用,结构化,快速和最先进的安全层。 IDS既不剥离,消毒也不过滤任何恶意输入,它只是识别攻击者何时尝试破坏您的网站,并按照您想要的方式做出反应。 基于一套经过批准和经过严格测试的过滤器规则,任何攻击都将获得数字影响等级,可以轻松决定黑客尝试应采取什么样的行动。 这可以从简单的日志记录到发送紧急邮件到开发团队,为攻击者显示警告消息,甚至结束用户的会话。

我不会保证这将为您工作!

1初步说明

我已经在Debian Etch LAMP系统上使用Apache2和PHP5以及IP地址192.168.0.100进行了测试 。 Debian Etch上的Apache用户和组是www数据 ,因此如果您使用的是不同的发行版,则Apache用户和组可能不同。 php.ini的位置(Debian Etch上的/etc/php5/apache2/php.ini )也可能不同。

在这个例子中,我使用的文件是root / var / www / web1 / web的虚拟主机。

2安装PHPIDS

为安全起见,我想在文档根目录下安装PHPIDS,所以我创建目录/ var / www / web1 / phpids

mkdir /var/www/web1/phpids

然后我安装PHPIDS,如下(在撰写本文时,最新版本为0.4.7) - 所有phpids-0.4.7.ta​​r.gz文件的内容,我们只需要lib /目录:

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

现在我转到目录/ var / www / web1 / phpids / lib / IDS ...

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

...并使可写入Apache用户和组的tmp /目录(将保存PHPIDS日志文件):

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

接下来我们配置PHPIDS配置文件( 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/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: <PHPIDS> 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/phpids/lib/IDS/tmp/memcache.timestamp

3使用PHPIDS

我们现在将创建一个文件/var/www/web1/web/phpids.php ,它将为我们调用PHPIDS(稍后将文件添加到所有PHP文件中,以便我们的PHP文件可以自动使用PHPIDS):

vi /var/www/web1/web/phpids.php
<?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);
  }
?>

现在当您在浏览器中调用该文件(例如http://192.168.0.100/phpids.php )时,您将看到一个空白页面。 但是,如果您尝试将一些恶意参数附加到URL(例如http://192.168.0.100/phpids.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C/script%3E ),则PHPIDS将检测到并在浏览器中打印其发现:

现在我们必须找到一种方法来使我们的PHP脚本使用PHPIDS。 当然,你不想修改所有的PHP脚本(你可以有数百个...)。 幸运的是,有一个更好的方法:每当调用PHP脚本时,我们可以让PHP预先添加一个PHP脚本。 例如,如果我们在浏览器中调用脚本info.php ,PHP将首先执行phpids.php ,然后再执行info.php ,甚至不需要修改info.php

我们可以通过使用PHP的auto_prepend_file参数来实现。 我们可以在我们的php.ini中设置 (这是一个全局设置,适用于服务器上的所有PHP网站) .htaccess文件(这是一个设置仅对所涉及的网站有效):

php.ini

打开您的php.ini(例如/etc/php5/apache2/php.ini ),并将auto_prepend_file设置为/var/www/web1/web/phpids.php

vi /etc/php5/apache2/php.ini
[...]
auto_prepend_file = /var/www/web1/web/phpids.php
[...]

之后重新启动Apache:

/etc/init.d/apache2 restart

.htaccess

而不是修改php.ini (这是全局更改,即更改对于在服务器上使用PHP的所有网站都有效),您可以改为使用.htaccess文件(因此该设置仅对网络有效创建.htaccess文件的站点):

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

请确保/ var / www / web1 / web中的网站的vhost包含这样的内容(否则.htaccess文件中的php_value行将被忽略)(如果您必须修改vhost,请不要忘了重新启动Apache):

<Directory /var/www/web1/web/>
AllowOverride All
</Directory>

现在我们创建一个简单的PHP文件,/ var/www/web1/web/info.php

vi /var/www/web1/web/info.php
<?php
phpinfo();
?>

在浏览器中调用该文件( http://192.168.0.100/info.php ),您应该看到正常的phpinfo()输出。

现在在URL附加一些恶意参数(例如http://192.168.0.100/info.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C/script%3E ),你应该找到一个PHPIDS报告之前phpinfo()输出(因为/var/www/web1/web/phpids.php/var/www/web1/web/info.php之前执行):

PHPIDS登录到/var/www/web1/phpids/lib/IDS/tmp/phpids_log.txt ,所以你应该在日志中看到一些东西:

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"

现在,通过观察该日志,您可以了解黑客尝试为您的PHP应用程序做什么,您可以尝试加固您的应用程序。

为了增加另一个级别的安全性,如果PHPIDS发现它们受到攻击,我们可以阻止我们的PHP脚本执行:我们只是添加一些像“ die”(“<h1> Go away!</ h1>”);/var/www/web1/web/phpids.php脚本的if(!$ result-> isEmpty()){}部分:

vi /var/www/web1/web/phpids.php
<?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);

   die('<h1>Go away!</h1>');
  }
?>

如果没有攻击,脚本将被执行,但如果PHPIDS发现攻击,则会阻止脚本执行,并向黑客显示消息:

4链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏