まえがき
この記事の例は、Apacheバージョン2およびPHP5、IP-192.168.0.100を使用したDebian Etch LAMPで作成されました。
Apacheのユーザーとグループはwww-dataです。 php.iniへのパスは/etc/php5/apache2/php.iniです。 仮想ホストのドキュメントルートは/ var / www / web1 / webでした
PHPIDSをインストールする
セキュリティイメージから、ドキュメントルートの外部にPHPIDSをインストールしたので、/ var / www / web1 / phpidsを作成しました。
次に、PHPIDSをインストールしました(インストール時の最新バージョンは0.4.7でした)。
cd / tmp
wget 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 /
cd / var / www / web1 / phpids / lib / IDS
chown -R www-data:www-data tmp /
次に、Config.iniを再構成しました。
cd Config /
vi Config.ini
デフォルトの設定を使用し、パスを変更するだけです
; PHPIDS Config.ini
; 一般的な構成設定
; !!!データベース接続データが追加された場合、このファイルをWEB-ROOT内に配置しないでください!!!
[全般]
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
例外[] = __utmz
例外[] = __utmc
; PHPIDSロガーを使用する場合、ここで特定の構成を定義できます。
[ロギング]
; ファイルロギング
パス= /var/www/web1/phpids/lib/IDS/tmp/phpids_log.txt
; メールログ
; セーフモードを有効にすると、スパムの試みを防ぐことができます。
; ドキュメントを参照
受信者[] = test@test.com.invalid
subject = "PHPIDSは侵入の試みを検出しました!"
header = "From:info@php-ids.org"
safemode = true
allowed_rate = 15
; データベースロギング
wrapper = "mysql:host = localhost; port = 3306; dbname = phpids"
ユーザー= phpids_user
パスワード= 123456
テーブル=侵入
; ファイルキャッシュ以外の方法を使用する場合は、ここで設定できます
[キャッシュ]
; キャッシング:セッション|ファイル|データベース| memcached |なし
キャッシング=ファイル
expiration_time = 600
; ファイルキャッシュ
パス= /var/www/web1/phpids/lib/IDS/tmp/default_filter.cache
; データベースキャッシュ
wrapper = "mysql:host = localhost; port = 3306; dbname = phpids"
ユーザー= phpids_user
パスワード= 123456
テーブル=キャッシュ
; memcached
; host = localhost
;ポート= 11211
; key_prefix = PHPIDS
; tmp_path = /var/www/web1/phpids/lib/IDS/tmp/memcache.timestamp
PHPIDSを使用する
次に、PHPIDSを使用する/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、
'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()){
//結果オブジェクトを見てください
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->実行($結果);
}
その後、ブラウザに192.168.0.100/phpids.phpと入力すると、空白のページが表示されます。
ただし、たとえば192.168.0.100/phpids.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C / script%3Eなどのさまざまなパラメーターを追加すると、PHPIDSはそれらを検出して結果をブラウザーに出力します
![]()
次に、各スクリプトでPHPIDSが使用されていることを確認します。 もちろん、システム上のすべてのphpファイルを変更する必要はありません。 スクリプトを開始するたびにPHPIDSを実行するようにphpに指示します。 auto_prepend_fileパラメーターを使用してこれを行います。 これを行うには、php.iniまたは.htaccessファイルに変更を加えます
auto_prepend_file = /var/www/web1/web/phpids.php
または.htaccessの場合
php_value auto_prepend_file /var/www/web1/web/phpids.php
Apacheを再起動します(php.iniを変更した場合)
内容を含むinfo.phpファイルを作成します
phpinfo();
ブラウザ192.168.0.100/info.phpに書き込むと、phpinfo()コマンドの通常の出力が表示されます。
192.168.0.100/info.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C / script%3Eのようなパラメーターを追加します
そして、あなたは表示されます
![]()
PHPIDSはこのデータを/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」
今、記録を見ることによって。 ハッカーがアプリケーションで何かを実行しようとしていたことがわかります。
アプリケーションに別のレベルのセキュリティを追加するには、PHPIDSが攻撃を検出した場合にスクリプトを停止できます。
このようなものを追加できます
死ぬ立ち去れ!
');
ファイル/var/www/web1/web/phpids.phpスクリプトのif(!$ result-> isEmpty())セクション{}へ
set_include_path(
get_include_path()
。 PATH_SEPARATOR
。 '/ var / www / web1 / phpids / lib'
);
require_once 'IDS / Init.php';
$リクエスト=配列(
'リクエスト' => $ _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()){
//結果オブジェクトを見てください
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->実行($結果);
死ぬ立ち去れ!
');
}
攻撃がない場合、スクリプトは実行を継続します。そうでない場合、ハッカーはこれを確認します
![]()
翻訳者のコメント
上記の例は、戦闘システムで使用できます。 ただし、これには何らかの変換が必要になります
$ init = IDS_Init :: init( '/ var / www / web1 / phpids / lib / IDS / Config / Config.ini');
毎回ファイルから設定ファイルをロードする必要はなく、以前に記述されたクラスで置き換える必要があるため