Trang

Thứ Tư, 6 tháng 4, 2011

Installation Mod Security on DirectAdmin

Bản này mình hướng dẫn cách cài đặt và config Mod Security trên server đang sử dụng DirectAdmin nhằm phòng chống và đảm bảo một phần an toàn cho server (Hạn chế localatack, hạn chế sql...)




Bước 1. Cài đặt Mod Security
1. cd /usr/local/src
2. mkdir modsecurity2
3. cd modsecurity2
4. wget http://www.modsecurity.org/download/modsecurity-apache_2.5.12.tar.gz
5. perl -pi -e 's/ServerTokens Major/ServerTokens Full/' /etc/httpd/conf/extra/httpd-default.conf
6. perl -pi -e 's/ServerSignature Off/ServerSignature On/' /etc/httpd/conf/extra/httpd-default.conf
7. perl -pi -e 's/ServerSignature EMail/ServerSignature On/' /etc/httpd/conf/extra/httpd-default.conf
8. tar xzf modsecurity-apache_2.5.12.tar.gz
9. cd modsecurity-apache_2.5.12
10. cd apache2
11. ./configure
12. make
13. make test 
14. make install





  Bước 2: Cấu hình rulers



vi /etc/httpd/conf/httpd.conf
A. Tìm phần Load Module, ví dụ:
Include    /etc/httpd/conf/extra/httpd-phpmodules.conf
Thêm vào bên dưới (Dùng cho bản 32bit):
LoadFile /usr/lib/libxml2.so
LoadModule security2_module     /usr/lib/apache/mod_security2.so
 nếu như bạn dùng bản 64bit thì thêm bằng đoạn sau:
LoadFile /usr/lib64/libxml2.so
LoadModule security2_module     /usr/lib/apache/mod_security2.so
 B. Tải rules cho mod security về TẠI ĐÂY, ví dụ mình đặt trong /etc/httpd/conf  Thêm vào dưới cùng file httpd.conf nội dung

# duong dan den file rules cua mod security.
Include /etc/httpd/conf/modsec.v2.rules.conf
 Bước 3: Restart lại dịch vụ httpd
/etc/init.d/httpd restart

Sau khi cài đặt, bạn có thể viết rules riêng cho mod security để chống chạy shell hoặc hạn chế một số method attack!



===End===

Installation Mod Security on Kloxo (CentOS5)

1. Validate the packages by installing the GPG key:
rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
2. Add the following to your '/etc/sysconfig/rhn/sources' file:
yum utterramblings http://www.jasonlitka.com/media/EL5/$ARCH
3. Create new file :
vi /etc/yum.repos.d/utterramblings.repo
... and then paste the following into the editor:
[utterramblings]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
4. Install modsecurity by typing: 
yum install mod_security
5. Restart the Apache webserver:
service httpd restart
All done!
 
 
 
 
 
Note that a default ruleset is included and activated during the installation. If you want to edit the configuration, the following can be useful:

/etc/httpd/conf.d: all files in this directory are loaded during Apache startup.
/etc/httpd/conf.d/mod_security.conf: default configuration loading the mod_security module and the default rule set.
/etc/httpd/modsecurity.d: default rule set.

Thứ Ba, 5 tháng 4, 2011

Đối phó với các cuộc tấn công SQL Injection



Trước khi trao đổi về các biện pháp ngăn chặn, xử lý các cuộc tấn công SQL Injection một cách hiệu quả, chúng ta hãy cùng nhau tìm hiểu rõ khái niệm về SQL Injection.
SQL Injection là gì?

SQL Injection hiểu đơn giản là một kiểu tấn công mà mục tiêu chủ yếu là các website. Trong đó, hacker sẽ “tiêm” các câu truy vấn SQL (Structured Query Language) độc hại vào website. Hậu quả của các cuộc tấn công SQL Injection có thể khiến cho cơ sở dữ liệu (CSDL) của các website bị thay đổi, bị xóa hoặc bị đánh cắp. Nguy hiểm hơn, hacker có thể lợi dụng lỗ hổng SQL Injection để chiếm quyền kiểm soát của toàn bộ máy chủ.
Để hiểu rõ hơn về SQL Injection, chúng ta cùng xem một ví dụ minh họa sau đây.
Khi người sử dụng truy cập vào một website tin tức và bấm vào một tin có mã số là 1 thì đường dẫn gửi tới máy chủ web sẽ có nội dung như sau:



Khi đó, để cung cấp nội dung tin số 1 trả về cho người sử dụng, website sẽ truy vấn tới cơ sở dữ liệu để lấy tin. Câu truy vấn SQL do người lập trình viết sẽ có cấu trúc như sau:
SELECT * FROM News WHERE NewsId = " + N_ID + "
Trong trường hợp này với yêu cầu lấy tin số 1 thì biến N_ID = 1. Kết quả là câu truy vấn SQL thật tới CSDL sẽ là: SELECT * FROM News WHERE NewsId = 1
Do sơ xuất của lập trình viên trong khi lập trình, không kiểm tra tính hợp lệ của N_ID trước khi thực thi câu truy vấn SQL, hacker có thể lợi dụng để chèn các câu truy vấn nguy hiểm tới CSDL.



Chúng ta có thể thấy phần bội đậm trong hình minh họa trên là một câu truy vấn độc hại do hacker chèn vào. Câu truy vấn này cũng sẽ được thực thi cùng với câu truy vấn của người lập trình viết và sẽ khiến thông tin trong CSDL bị xóa.

SELECT * FROM News WHERE NewsId = 1; DELETE FROM NEWS WHERE NewsId=2

Dưới đây sẽ là các sơ đồ kết nối trong ví dụ ở trên:

Minh họa cho một truy vấn thông thường tới website.


Minh họa cho hệ thống tồn tại lỗ hổng SQL Injection.


Minh họa cho hệ thống không tồn tại lỗ hổng SQL Injection.

Như vậy có thể thấy, lỗi SQL Injection xảy ra khi website không được lập trình tốt hoặc cấu hình máy chủ tốt. Vì vậy, hệ thống không kiểm soát được chặt chẽ các tham số đầu vào cho các câu truy vấn SQL, dẫn đến bị hacker lợi dụng để chèn vào các câu truy vấn nguy hiểm đối với CSDL.

Tấn công SQL Injection vào các website đang là hình thức tấn công rất phổ biến trên thế giới hiện nay.

Phòng chống SQL Injection

Các biện pháp phòng chống tấn công SQL Injection cho website phụ thuộc rất nhiều vào nền tảng (platform) xây dựng web. Ví dụ, website của bạn được xây dựng trên platform nào (Joomla, Wordpress hay DotNetNuke …) và sử dụng ngôn ngữ lập trình gì (ASP, PHP, .Net hay Java …). Website đó đang chạy trên Web Server (IIS, Apache…) nào, hệ quản trị CSDL của website là gì (Oracle, MySQL…)?

Dưới đây là một số quy tắc chung trong việc phòng chống SQL Injection:

1. Đối với website (dành cho lập trình viên): Cần kiểm tra tính đúng đắn của tất cả dữ liệu đầu vào. Dữ liệu đầu vào không chỉ là các tham số, mà bao gồm cả cookie, user agent, referer …
Việc kiểm tra tính đúng đắn của dữ liệu có thể dựa trên các phương pháp sau:

- Kiểm tra dựa vào kiểu dữ liệu (số, ngày tháng …)
- Kiểm tra, giới hạn độ dài đầu vào
- Loại bỏ các ký tự đặc biệt như: ‘ % ” ? # @ & …
- Loại bỏ các từ đặc biệt: select, drop, delete, information_schemal, insert, union, xp_ …

2. Đối với web server (dành cho quản trị mạng): Hầu hết các máy chủ web (web server) hiện nay đều có các module hỗ trợ việc phòng chống SQL Injection, ví dụ, Apache có modsecurity, IIS có URLScan. Bạn chỉ cần bật tính năng này và cấu hình cho phù hợp. Nếu website của bạn là dạng trang tin tức thì rất phù hợp để triển khai. Trong một số trường hợp khác, các module này có thể chặn nhầm, dẫn tới website hoạt động không chính xác.

3. Đối với database server (dành cho quản trị mạng): Bạn cần thực hiện việc cấu hình phân quyền chặt chẽ đối với các tài khoản. Khi đó, dù tồn tại lỗi SQL Injection, thiệt hại cũng sẽ được hạn chế. Ngoài ra, bạn cần loại bỏ các bảng, thành phần và tài khoản không cần thiết trong hệ thống.

4. Một số lời khuyên khác:

- Bạn cần tắt tất cả các thông báo lỗi không cần thiết của web server. Hacker có thể lợi dụng chính các thông báo lỗi này để khai thác thông tin của hệ thống, phục vụ cho một cuộc tấn công SQL Injection.
- Bạn cần bật các chế độ ghi log đầy đủ để phục vụ việc điều tra phát hiện cuộc tấn công và giải quyết sự cố.
- Bạn cần thường xuyên theo dõi và cập nhật phiên bản cho platform của website (hệ điều hành, web server, database server…).

Part 1: Các dạng lỗi thường gặp

SQL injection là một kỹ thuật điền vào những đoạn mã SQL bất hợp pháp cho phép khai thác một lỗ hổng bảo mật tồn tại trong cơ sở dữa liệu của một ứng dụng. Lỗ hổng bảo mật này có thể xuất hiện khi ứng dụng không có đoạn mã kiểm tra chuỗi ký tự thoát nhúng trong câu truy vấn SQL hoặc do sự định kiểu đầu vào không rõ ràng hay do lỗi cú pháp SQL của lập trình viên khiến cho một đoạn mã ngoại lai có thể được sử lý ngoài ý muốn. Nó là một ví dụ của sự rủi ro khi một ngôn ngữ lập trình hay ngôn ngữ kịch bản được nhúng trong một ngôn ngữ khác. Tấn công SQL injection còn có thể hiểu là hình thức tấn công chèn bất hợp pháp các đoạn mã SQL.

1. Các dạng lỗi thường gặp
1.1/ Không kiểm tra ký tự thoát truy vấn

Đây là dạng lỗi SQL injection xảy ra khi thiếu đoạn mã kiểm tra dữ liệu đầu vào trong câu truy vấn SQL. Kết quả là người dùng cuối có thể thực hiện một số truy vấn không mong muốn đối với cơ sở dữ liệu của ứng dụng. Dòng mã sau sẽ minh họa lỗi này:

statement = "SELECT * FROM users WHERE name = '" + userName + "';"

Câu lệnh này được thiết kế để trả về các bản ghi tên người dùng cụ thể từ bảng những người dùng. Tuy nhiên, nếu biến "userName" được nhập chính xác theo một cách nào đó bởi người dùng ác ý, nó có thể trở thành một câu truy vấn SQL với mục đích khác hẳn so với mong muốn của tác giả đoạn mã trên. Ví dụ, ta nhập vào giá trị của biến userName như sau:

a' or 't'='t

Khiến câu truy vấn có thể được hiểu như sau:

SELECT * FROM users WHERE name = 'a' OR 't'='t';

Nếu đoạn mã trên được sử dụng trong một thủ tục xác thực thì ví dụ trên có thể được sử dụng để bắt buộc lựa chọn một tên người dùng hợp lệ bởi 't'='t' luôn đúng. Trong khi hầu hết các SQL server cho phép thực hiện nhiều truy vấn cùng lúc chỉ với một lần gọi, tuy nhiên một số SQL API như mysql_query của php lại không cho phép điều đó vì lý do bảo mật. Điều này chỉ ngăn cản tin tặc tấn công bằng cách sử dụng các câu lệnh riêng rẽ mà không ngăn cản tin tặc thay đổi các từ trong cú pháp truy vấn. Các giá trị của biến "userName" trong câu truy vấn dưới đây sẽ gây ra việc xoá những người dùng từ bảng người dùng cũng tương tự như việc xóa tất cả các dữ liệu được từ bảng dữ liệu (về bản chất là tiết lộ các thông tin của mọi người dùng), ví dụ này minh họa bằng một API cho phéo thực hiện nhiều truy vấn cùng lúc:

a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't

Điều này đưa tới cú pháp cuối cùng của câu truy vấn trên như sau:

SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM DATA WHERE 't' = 't';

1.2/ Xử lý không đúng kiểu

Lỗi SQL injection dạng này thường xảy ra do lập trình viên hay người dùng định nghĩa đầu vào dữ liệu không rõ ràng hoặc thiếu bước kiểm tra và lọc kiểu dữ liệu đầu vào. Điều này có thể xảy ra khi một trường số được sử dụng trong truy vấn SQL nhưng lập trình viên lại thiếu bước kiểm tra dữ liệu đầu vào để xác minh kiểu của dữ liệu mà người dùng nhập vào có phải là số hay không. Ví dụ như sau:

statement := "SELECT * FROM data WHERE id = " + a_variable + ";"

Ta có thể nhận thấy một cách rõ ràng ý định của tác giả đoạn mã trên là nhập vào một số tương ứng với trường id - trường số. Tuy nhiên, người dùng cuối, thay vì nhập vào một số, họ có thể nhập vào một chuỗi ký tự, và do vậy có thể trở thành một câu truy vấn SQL hoàn chỉnh mới mà bỏ qua ký tự thoát. Ví dụ, ta thiết lập giá trị của biến a_variable là:

1;DROP TABLE users

khi đó, nó sẽ thực hiện thao tác xóa người dùng có id tương ứng khỏi cơ sở dữ liệu, vì câu truy vấn hoàn chỉnh đã được hiểu là:

SELECT * FROM DATA WHERE id=1;DROP TABLE users;

1.3/ Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu

Đôi khi lỗ hổng có thể tồn tại chính trong phần mềm máy chủ cơ sở dữ liệu, như là trường hợp hàm mysql_real_escape_string() của các máy chủ MySQL. Điều này sẽ cho phép kẻ tấn công có thể thực hiện một cuộc tấn công SQL injection thành công dựa trên những ký tự Unicode không thông thường ngay cả khi đầu nhập vào đang được thoát.

1.4/ Blind SQL injection

Lỗi SQL injection dạng này là dạng lỗi tồn tại ngay trong ứng dụng web nhưng hậu quả của chúng lại không hiển thị trực quan cho những kẻ tấn công. Nó có thể gây ra sự sai khác khi hiển thị nội dung của một trang chứa lỗi bảo mật này, hậu quả của sự tấn công SQL injection dạng này khiến cho lập trình viên hay người dùng phải mất rất nhiều thời gian để phục hồi chính xác từng bit sữ liệu. Những kẻ tấn công còn có thể sử dụng một số công cụ để dò tìm lỗi dạng này và tấn công với những thông tin đã được thiết lập sẵn.

1.4.1/ Thay đổi giá trị điều kiện truy vấn

Dạng lỗi này khiến cho kẻ tấn công có thể thay đổi giá trị điều kiện trong câu truy vấn, làm sai lệch sự hiển thị của một ứng dụng chứa lỗi này.

SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=1;

Sẽ hiển thị một trang một cách bình thường, trong khi:

SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2;

sẽ hiển thị một nội dung khác, hoặc không hiển thị gì nếu ứng dụng web có chứa lỗi SQL injection dạng này. Lỗ hổng dạng này còn cho phé tin tặc không chỉ gây ảnh hưởng tới bảng hay dữ liệu hiện tại mà còn ảnh hưởng tới những dữ liệu hay bảng khác phụ thuộc vào nội dung của dữ liệu hay bảng hiện tại.

1.4.2/ Điều kiện lỗi

Lỗi SQL injection dạng này dẫn tới việc buộc cơ sở dữ liệu chỉ được phép đánh giá khi mà giá trị của câu lệnh WHERE là đúng. Ví dụ:

SELECT 1/0 FROM users WHERE username='Ralph';

Phép chia cho 0 chỉ được đánh giá là lỗi khi mà người dùng có tên "Ralph" tồn tại trong cơ sở dữ liệu.

1.4.3/ Thời gian trễ

Lỗi SQL injection dạng này tồn tại khi thời gian xử lý của một hay nhiều truy vấn SQL phụ thuộc vào dữ liệu logic được nhập vào hoặc quá trình xử lý truy vấn của SQL engine cần nhiều thời gian. Tin tặc có thể sử dụng lỗi SQL injection dạng này để xác định thời gian chính xác mà trang cần tải khi giá trị nhập vào là đúng.