使用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.tar.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链接
- PHPIDS: http : //php-ids.org
- PHP: http : //www.php.net
- Apache: http : //httpd.apache.org