1. Trang chủ
  2. » Công Nghệ Thông Tin

Hacker Professional Ebook part 266 doc

6 134 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 6
Dung lượng 125,59 KB

Nội dung

Để chúng ta có thể làm việc với ví dụ cụ thể, chúng ta sẽ sửa chút ít của 1 trong những script php thông dụng thành một script dễ bị tổn thương được chúng ta tính trước. Script này có thể làm việc với mysql được cài đặt mặc định, chúng ta sẽ dùng user "root" và "mysql" DB mặc định để giải thích SQL injection. 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

Ngày đăng: 04/07/2014, 12:20

TỪ KHÓA LIÊN QUAN