[Linux]Phát hiện xâm nhập cho ứng dụng PHP với PHPIDS

alt
Bài viết này hướng dẫn cách cài đặt PHPIDS trên hệ thống máy chủ web với apache2 và PHP5. PHPIDS(PHP-Intrusion Detection System) sử dụng rất đơn giản, cấu trúc chặt chẽ, nhanh và là lớp bảo mật cho ứng dụng web trên nền PHP. Đã được kiểm tra trên hệ thống Debian Etch LAMP với apache2 và PHP5 với địa chỉ IP 192.168.0.100. Apache user và group trên Debian Etch là www-data, nên nếu bạn có một distro khác, Apache user và group có thể khác. Vị trí của tập tin php.ini (/etc/php5/apache2/php.ini trên Debian Etch) cũng có thể khác.

Sử dụng virtual host với document root /var/www/web1/web trong ví dụ.

Cài đặt PHPIDS

Vì lí do bảo mật tôi muốn cài đặt PHPIDS bên ngoài document root, do đó tôi tạo thư mục /var/www/web1/phpids:

$ mkdir /var/www/web1/phpids

Sau đó cài PHPIDS như sau (tại thời điểm viết bài này phiên bản mới nhất là 0.4.7) – của tất cả nội dung của phpids-0.4.7.tar.gz file, chúng ta chỉ cần thư mục 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/

Bây giờ ta chuyển tới thư mục /var/www/web1/phpids/lib/IDS…

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

… và tạo thư mục tmp/ (nơi lưu tập tin log của PHPIDS) có quyền ghi với Apache user và group:

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

Tiếp đó cấu hình cho PHPIDS (Config.ini):

$cd Config/
$ vi Config.ini

Sử dụng cấu hình mặc định, tất cả những gì tôi làm là điều chỉnh đường dẫn:

; 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/phpids/lib/IDS/tmp/memcache.timestamp

Sử dụng PHPIDS

Bây giờ chúng ta sẽ tạo tập tin /var/www/web1/web/phpids.php mà sẽ gọi PHPIDS cho ta (ta sẽ đặt tập tin này cho tất cả các tập tin PHP để PHPIDS được sử dụng tự động):

$ 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);
}
?>

Bây giờ khi bạn truy cập tới tập tin này từ trình duyệt (ví dụ: http://192.168.0.100/phpids.php), bạn sẽ thấy một trang trắng. Nhưng nếu bạn sử dụng một vài tham số nguy hiểm trên URL (ví dụ: http://192.168.0.100/phpids.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C/script%3E), PHPIDS sẽ phát hiện nó và in ra kết quả trên trình duyệt:

alt

Bây giờ ta cần tìm cách làm cho mã PHP sử dụng PHPIDS. Tất nhiên bạn không muốn sửa tất cả các mã PHP. May mắn là có cách tốt hơn: chúng ta có thể nói cho PHP để gọi một mã PHP mỗi khi được gọi. Ví dụ: nếu ta gọi info.php trên trình duyệt, PHP sẽ thực thi phpids.php trước và sau đó mới đến info.php, và ta thậm chí không phải chỉnh sửa info.php.

Ta có thể làm việc đó bằng cách sử dụng tham số auto_prepend của PHP. Chúng ta cũng thể đặt nó trong php.ini (thiết lập toàn cục này sẽ được dùng cho tất cả các website sử dụng PHP trên server), hoặc ở tập tin .htaccess (thiết lập này sẽ chỉ dùng cho website nơi đặt tập tin .htaccess đó):

php.ini
Mở tập tin php.ini (ví dụ : /etc/php5/apache2/php.ini), và đặt auto_prepend_file thành /var/www/web1/web/phpids.php:

$ vi /etc/php5/apache2/php.ini

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

Sau đó khởi động lại Apache:

$ /etc/init.d/apache2 restart

.htaccess
Thay vì chỉnh sửa php.ini (mà thay đổi toàn cục, ví dụ : thay đổi cho tất cả website sử dụng PHP trên server), bạn có thể sử dụng tập tin .htaccess (vì thế thiết lập chỉ áp dụng cho chính website có chứa tập tin .htaccess đó):

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

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

Hãy chắc chắn rằng vhost cho website ở /var/www/web1/web có chứa thứ gì đó dạng như sau(nếu không dòng php_value trong tập tin .htaccess sẽ bị bỏ qua) (nếu bạn phải thay đổi vhost, đừng quên khởi động lại Apache):

AllowOverride All

Bây giờ tạo một tập tin PHP đơn giản /var/www/web1/web/info.php:

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

phpinfo();
?>

Truy cập tới nó bằng trình duyệt (http://192.168.0.100/info.php), và bạn sẽ thấy kết quả của phpinfo().

Bây giờ hãy sử dụng thử vài tham số nguy hiểm trên URL (ví dụ: http://192.168.0.100/info.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C/script%3E), và bạn sẽ thấy PHPIDS thông báo trước khi phpinfo()

Viết bởi whatvn site:opensource.com.vn

Advertisements

Trả lời

Please log in using one of these methods to post your comment:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s