PDA

View Full Version : Nghiên cứu về bảo mật


nhtuong
29-05-2007, 10:36
Chào các bạn,

Theo nhận định của các chuyên gia trong lĩnh vực IT, hiện nay bảo mật là một mảnh đất rất lý tưởng để các bạn có thể đào sâu nghiên cứu.

Topic này dành riêng cho các bạn có am hiểu và muốn học hỏi về lĩnh vực đang rất "nhạy cảm" này!

Các bạn có thể thể hiện khả năng hiểu biết của mình bằng việc phân tích các kỹ thuật tấn công sau: Cross-Site Scripting (XSS), Cross-Site Request Forgeries (CSRF), Code Injection Vulnerabilities,...

Xin mời tất cả các bạn....!

nhtuong
29-05-2007, 10:42
Đây là vấn đề đầu tiên và rất nhẹ nhàng để các bạn có thể bắt đầu thảo luận.

Bạn hãy đề xuất một cách cải tiến lại đoạn code sau đây để có thể nâng cao được tính bảo mật hoặc đơn giản theo bạn là đẹp (BETTER-CODE) hơn:

<?
echo("<p>Lấy kết quả trả về của câu truy vấn: " .
$_GET['query'] . ".</p>");
?>

tumickey
29-05-2007, 10:51
em xin làm trước:
Nhìn sơ code trên có nhiều cái :
Đầu tiên <? ?> ko phải server nào của allow cái này nên chuyển về <?php như thê ok hơn

$_GET['query'] không nên làm thế ta cần phải kiểm tra lại dữ liệu xem thế nào

tố nhất là gán nó vào 1 biến
$query = $_GET['query'] ; Vì là câu lệnh truy vấn nên rất dễ bi SQL Injection cho nên phải loại nó ra = rất nhiều các dơn giản nhất là dùng hàm mysql_escape_string có sẳn của php hay addslashes() ; tuy nhiên có thể còn lỗi khác nữa.
Túm lại

<?php

$query = mysql_escape_string($_GET['query']) ;

echo("<p>Lấy kết quả trả về của câu truy vấn: " . $query . "</p>");

?>

nhtuong
29-05-2007, 10:56
Cách của tumickey cũng khá đấy! Tuy nhiên bản thân tác giả cũng chưa hài lòng lắm phải không?

Các bạn tiếp tục cho ý kiến đi!

tumickey
29-05-2007, 11:07
em chưa hài long vi cách đó chỉ cơ bản chống SQL Injection . ngoài ra còn XSS

săn nhắc dên XSS gởi tăng nọi người thu viên này chống XSS khá tốt
http://www.divshare.com/download/768173-f1f

trang chủ http://www.phpclasses.org/browse/package/2189.html

Nếu thêm cái này thì câu SQL bạn khá an toàn rồi . TMK còn 1 cách nữa.

Đó là Stored Procedure . Nếu bạn đã học SQL server hay có lập trình asp.net thì cái này ko có gì lạ . Nhưng với mysql thì từ phiên bản 5.0 đã dưa cái này vào . TMK cũng chi mới coi sơ wa mà thui thế nhưng có thể hiểu là nó cho phép tạo 1 hàm bằng sql rồi gọi nó . khả năng chống SQL rất cao . Nếu bạn làm trên hệ thống mới (mysql 5.x hay sql sever ) thì ban nên bỏ tí time với nó .

zeroonea
29-05-2007, 19:38
{@:

- Dùng store procedure cũng phải đưa giá trị đầu vào thui, ko parse kĩ giá trị đầu vào thì kiểu gì cũng bị.

- store procedure giúp thực hiện query nhanh hơn với những query dài dòng, tránh việc php send 1 đống hàng query cho mysql -> chậm

- trong sql, store procedure, function, view, khác nhau về cách gọi cũng như chức năng.

- làm ASP.NET + MSSQL thì dù là 1 câu select 1 hàng thì cũng nên đưa vào sp (tất cả câu query đều đưa vào sp) -> tổng quan, có gì dễ sửa.

- Típ theo cái đoạn code của anh nhtuong:


<?
define('MAGIC_QUOTE', get_magic_quotes_gpc());

if(MAGIC_QUOTE == 0){

$query = mysql_escape_string($_GET['query']);
}

echo '<p>Lấy kết quả trả về của câu truy vấn: ' . $query . '</p>';
?>


- Thứ nhất, phải kiểm tra xem cấu hình PHP có bật magic quotes ko

+ Vì magic quotes sẽ tự động chạy addslashes trên các giá trị từ GET, POST và COOKIE -> nếu addslashes 1 lần nữa sẽ là double escape -> tốn công

+ ví dụ: nếu vừa bật magic quote vừa escape 1 lần nữa thì 1 biến GET test = "I can't" >>>> "I can\\\'t"

- Thứ hai, nếu trong 1 chuỗi ko cần parse escaped character (\n \r \t) hay in giá trị 1 biến nào đó ($test = "$a yeah!!"), thì ta nên dùng single quoted (') thay cho double quoted (").

- Thứ ba, ko dùng addslashes cho dữ liệu đưa vào 1 câu query của mysql, vì nó sẽ escape dư và thiếu, có những character ko cần escape -> ko gây nguy hiểm, mysql_escape_string đã có sự chọn lựa trong đó -> đủ.

- Thứ tư, ko dùng () khi xài echo, giống như return ko dùng return (a*b); recommended: return a*b;

//--------------
- XSS chẳng liên quan gì đến tấn công database, chỉ dùng để trộm cookie thui, bên php mà có cookie của PHP SESSION ID của admin 1 trang nào đó thì he he he.

- Chỉ chống XSS khi nào mình có 1 form cho người ta gửi dữ liệu và show nó ra trên web (shout box, guest book, feed back....)

:@}

nhtuong
29-05-2007, 20:45
Thảo luận của chúng ta bắt đầu sôi nổi rồi đấy!

Các cách tiền xử lý luôn được đặt lên trước nhất. Nhưng có vẻ như các bạn chưa quan tâm đúng mức với việc bảo mật từ DBMS thì phải?

Bảo mật CSDL sẽ bàn sau, nhưng anh thấy các bạn có nhắc nhiều đến XSS. Vì vậy, các bạn cho anh hỏi theo nghiên cứu của các bạn thì có bao nhiêu thẻ có thể tìm ẩn XSS? Cách phòng tránh cho mỗi thẻ như thế nào?

nhtuong
30-05-2007, 09:52
Có nhiều thảo luận xung quanh đoạn này, mời các bạn phân tích tiếp! Theo các bạn có cần kiểm tra isset không? zeroonea có đề cập tới không dùng () cho echo, em giải thích sâu hơn nguyên nhân nhé!

<?php
if (isset($_GET['query']))
{
echo '<p>Lấy kết quả trả về của câu truy vấn: ',
htmlspecialchars($_GET['query'], ENT_QUOTES), '.</p>';
}
?>

zeroonea
30-05-2007, 20:04
{@:

- Chài, quên mất phần isset X_X.

- Việc ko dùng parentheses: trong manual có nói echo ko thực sự là 1 function nó là language construct, vì thế ko cần xài parentheses, mà ko cần xài thì nên bớt ra cho đỡ rối.

- Với lại có lúc ta cần pass nhiều param vào echo mà nếu kèm theo parentheses sẽ báo lỗi syntax


echo 'show ', 'me ', 'the ', 'money ', $a, $b;
//echo ('show ', 'me ', 'the ', 'money ', $a, $b); << error


- >> Qui về 1 chuẩn chung cho echo là ko dùng parentheses

:@}

thinhgr
30-05-2007, 23:55
Em cũng muốn theo nữa nhưng mấy anh có tài liệu cơ bản về bảo mật ko? Cho em xin. Thanks.
Ebook càng tốt he he.

nhtuong
31-05-2007, 09:06
Tất nhiên rồi!
Welcome em!
Em xem về XSS ở đây (http://www.divshare.com/download/787153-2d8).
Em xem về SQL Injection ở đây (http://www.divshare.com/download/787169-ba7).

Miracle
05-06-2007, 12:51
Có một cái mod_security, nó chặn xss ở mức server cũng khá hay đấy

nhtuong
05-06-2007, 17:28
Vầy hả! Mình chưa biết anh mod_sercurity này! CED giới thiệu kỹ hơn xí nhé! Mình có thể ứng dụng nó như thế nào? Và trong trường hợp nào?

Miracle
05-06-2007, 23:20
mod_security sẽ lọc hết các ký tự đặc biệt <(.|\n)+> khi vừa được gửi lên server

Mod_security là một module dùng với Apache cho việc ngăn chặn người dùng *exploit* lỗ hổng của web applications như thực hiện các lệnh thường dùng ở command line ngay trên trang web, chạy shell code để làm tràn bộ đệm (buffer overflow), lấy cookie của browser hay re-direct người thăm trang web sang một trang khác. Dĩ nhiên mod_security không phải là một biện pháp tối ưu nhưng ít nhất nó cũng giúp administrator đỡ phải lo lắng với những lỗi căn bản hay thấy trong các web applications được viết không hoàn hảo.

Bài viết sẽ không giải thích việc cài đặt mod_security mà sẽ đi thằng vào các chức năng mod_security hiện có và cách sử dụng.

Bạn sẽ cần điều chỉnh tập tin apache.conf để báo cho Apache biết bạn muốn dùng mod_security. Sau khi cài đặt, mod_security sẽ tự thêm vào LoadModule và AddModule cần thiết trong apache.conf, tuy nhiên muốn thật sự sử dụng nó, bạn phải *turn on* và khai báo các param cần thiết.

Để bật mod_security lên, bạn chỉ thêm SecFilterEngine On vô apache.conf. Cũng có thể dùng DynamicOnly nếu bạn chỉ muốn mod_security phân tích dynamic content. Nhưng như vậy vẫn chưa đủ. Sau đây là các param ví dụ, bạn có thể bỏ vào apache.conf.

1. Phòng ngừa characters hay dùng trong shell code để tạo lỗi tràn bộ đệm, dùng:

SecFilterForceByteRange 32 126

Để biết những ký tự tương ứng trong khoảng 32 và 126, bạn có thể tham khảo http://www.asciitable.com

2. Phòng ngừa kiểu tấn công XSS (Cross-site scripting) sử dụng HTML và Java script, dùng:

SecFilter "<(.|\n)+>"
SecFilter "<[[:space:]]*script"

3. Yêu cầu connection đến cổng web server phải có USER_AGENT và HOST headers, dùng:

SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"

Cái dòng trên sẽ yêu cần mọi connection đến web server phải có thông tin về browser và host. Nếu bạn sử dụng telnet đến cổng web server, bạn sẽ nhận ErrorDocument 500 của Apache (Internal Server Error) sau lệnh GET.

4. Phòng ngừa SQL-injection, dùng:

SecFilter "delete[[:space:]]+from"

SecFilter "insert[[:space:]]+into"

SecFilter "drop[[:space:]]table"

SecFilter "select.+from"

5. Phòng ngừa sử dụng "../" (path traversal), dùng:

SecFilter "\.\./"

7. Muốn mod_security phân tích POST request, dùng:
SecFilterScanPOST On

Bạn cũng có thể dùng SecFilterCheckURLEncoding On và SecFilterCheckUnicodeEncoding On để mod_security *kiểm tra* URL encoding và UTF-8. Lưu ý:nếu bạn dùng SecFilterCheckUnicodeEncoding On, một số bộ gõ hay input tiếng Việt sẽ không hoạt động

Nếu bạn chạy web với nhiều virtualhost và muốn một site trong 10 sites không dùng mod_security, bạn có thể dùng:

SecFilterSelective SERVERNAME "^tên_của_web_site$" nolog,allow

Những parameters trên chỉ là ví dụ một vài chức năng của mod_security. Bạn có thể tìm thấy các ví dụ trên trong gói mod_security. Ngoài các chức năng phòng chống, bạn có thể dùng mod_security cho việc chạy Apache trong chroot. Chưa hết đâu, bạn có thể dùng snort rules với mod_security. Đã chưa? !!!

Có lẽ bạn cũng đã nhận ra, vừa rồi mình mới hướng dẫn cách sử dụng một intrusion prevention system (IPS) sử dụng Apache và mod_security. Bạn còn ngồi đó làm gì? Đến web site http://www.modsecurity.org rồi tải về mà sử dụng. Sau khi có mod_security chạy rồi, báo cho boss biết là "Tôi mới cài đặt instrusion prevention system mà không tốn đồng nào hết! Vậy thì lên lương đi chứ!" :)

References:

. Giới thiệu về mod_security: http://www.onlamp.com/pub/a/apache/2003/11/26/mod_security.html

. mod_security web site: http://www.modsecurity.org

nhtuong
07-06-2007, 08:06
Sau thời gian xem về Mod_sercurity của CED mình thấy đúng là một giải pháp tốt cho các Admin. Mặc dù theo nhận định là chưa tối ưu nhưng dù sao có vẫn tốt hơn phải không?

Cái mình quan tâm đúng ngay chổ CED tô đỏ. Nó chặn bằng cách nào nhỉ? Tất cả các request gởi lên nó đều cắt? Mình lấy thí dụ vì một lý do nào đó mình muốn gởi lên một trong số những ký tự bị chặn đó thì sao?

Ngoài ra IPS cũng đáng được chúng ta quan tâm đấy! Bạn nào có tìm hiểu về nó cho ý kiến để mọi người tham khảo nhé!

Miracle
07-06-2007, 08:48
mod này dùng cho các nhà cung cấp host, không cần can thiệp vào code của khách hàng mà vẫn tăng được mức độ bảo mật

Việc báo lỗi như thế nào thì tùy vào việc cấu hình (http://www.onlamp.com/pub/a/apache/2003/11/26/mod_security.html)

# Action to take by default
SecFilterDefaultAction "deny,log,status:500"

- Từ chối yêu cầu, ghi vào file log và thông báo lỗi
"HTTP/1.1 500 Internal Server Error" đến máy khách

rcrackvn
07-06-2007, 10:58
Cái mình quan tâm đúng ngay chổ CED tô đỏ. Nó chặn bằng cách nào nhỉ? Tất cả các request gởi lên nó đều cắt? Mình lấy thí dụ vì một lý do nào đó mình muốn gởi lên một trong số những ký tự bị chặn đó thì sao?



2. Phòng ngừa kiểu tấn công XSS (Cross-site scripting) sử dụng HTML và Java script, dùng:

SecFilter "<(.|\n)+>"
SecFilter "<[[:space:]]*script"


chào bạn,
mấy cái đó là regex, nên nó được regex engine của modsecurity parse, chứ không phải là ký tự thông thường.
ví dụ như cái trên: regex pattern bao gồm các phần:
- match dấu '<'
- match tiếp 1 ký tự, hoặc 1 newline, từ 1 đến nhiều lần (.|\n)+
- match dấu '>'

do đó để 1 url request send từ client match và bị drop bởi rule này, thì url đó phải chứa các cụm từ như:
<script> hoặc <a> hoặc <font size="5"> ...
rule chỉ match khi đúng loại như vậy, chứ không phải match từng ký tự đơn lẻ

trong cái thứ 2 có sử dụng 1 cụm [:space:], cụm này không phải là standard regex nên tui đoán nó là 1 directive riêng quy định bởi mod_security, dùng để match 1 SPACE, nếu như vậy, rule thứ 2 sẽ match các url:
- có dấu '<'
- kế tiếp là có 0 hoặc nhiều SPACE [[:space:]]*
- kế tiếp là có chữ script

vậy sẽ match với các url có chứa:
- <script
- < script
- < script

Bạn có thể google thêm về pattern matching sử dụng regex, hoặc đọc cuốn Mastering Regular Expressions của Jeffrey Friedl, cuốn này được coi như quyển kinh thánh về pattern matching sử dụng regex.

Ứng dụng của regex rất nhiều, mod_security là 1 ví dụ, ngôn ngữ perl mạnh được nhờ regex engine của nó cực kỳ linh hoạt, hoặc bạn có thể gặp rất nhiều cách sử dụng từ basic tới advanced regex khi dùng các shell utils của *nix như grep, awk, sed, vi ...

tumickey
07-06-2007, 11:24
hihi link Mastering Regular Expressions của Jeffrey Friedl

http://debian.yaako.org/ebook/O'Reilly%20-%20Mastering%20regular%20expressions.pdf

muốn kiếm thêm ebook có thể wa http://ebook4you.org/diendan/ .Ủng hộ nhe :D