![]() |
|
| Đăng ký | Hỏi đáp | Lịch | Đánh dấu là đã đọc |
|
||||||
Bảng thông báo |
|||||||
|
![]() ![]() |
|
|
LinkBack | Công cụ bài viết | Kiểu hiển thị |
|
|
#1 (permalink) | ||||||
|
Trong phần này, tôi chỉ bàn đến lỗi trong MySQL khi sử dụng với PHP. Đây là lỗi bảo mật nguy hiểm chỉ đứng sau XSS về số lượng lỗi bị khai thác.
Để thuận thiện cho quá trình tìm hiểu và phân tích, chúng ta sẽ tạo một database với tên testsql001 và sử dụng kết hợp Command để quản trị MySQL
Mã:
Mã:
Thử vào trang với URL:
![]()
![]() Đây là những kí tự để chú thích cho câu lệnh SQL, vì vậy, phần SQL phía sau đó xem như không có tác dụng. Đấy thăng # ở đây không hợp lệ vì nó dùng để trỏ tới một anchor trên trang chứ không được gửi tới query, %23 là mã hóa của #, nó hợp lệ để gửi đi. ![]() Như vậy, hacker có thể đăng nhập hợp pháp với bất cứ tài khoản nào có trong CSDL mà không cần biết mật khẩu. CODE test-search.php Mã:
![]() Nếu dữ liệu nhiều, hacker có thể gửi liên tục URL này, rất có thể server của bạn sẽ quá tải. |
|||||||
|
|
Lần đọc: 395
|
|
|
#2 (permalink) | |||||
![]() Như vậy mật khẩu dài 9 kí tự, tiếp theo sẽ dò từng kí tự trong mật khẩu, MySQL hỗ trợ các hàm: LEFT, RIGHT và MID (dev.mysql.com/doc/refman/5.0/en/string-functions.html) để tìm vị trí của kí tự trong chuỗi nào đó. Tìm kí tự đầu tiên, tham số thứ 2 trong hàm LEFT là độ dài kí tự muốn lấy ra:
![]() Tiếp tục tìm kí tự thứ hai trong mật khẩu, ta đã biết được kí tự đầu tiên là "a":
![]() ![]() Như vậy, hacker đã biết được chính xác mật khẩu của tài khoản admin. Các hacker thường viết ra công cụ tự dò tìm, tốc độ rất nhanh, vì vậy bạn đừng nghĩ rằng cách này tốn thời gian vô ích!
Chạy SQL sau để tạo bảng post: Mã:
Mã:
|
||||||
|
|
Lần đọc: 395
|
|
|
#3 (permalink) | ||
|
Sau đó, ta chạy thử với URL như sau:
![]() Chưa có gì đặc biệt, ta thử trong Command xem sao: ![]() Kết quả ta thấy câu lênh lấy ra được 3 rows, nhưng vì trong mã PHP, ta chỉ lấy một kết quả đầu tiên. Ta thử sửa lại mã như sau: Mã:
![]() Như vậy tài khoản trong bảng user đã bị lộ. Trở lại với trường hợp trang chỉ có ra một kết quả, mặc dù tập kết quả trả về từ query vẫn là 3, nhưng khi hiện ra trang chỉ lấy kết quả đầu tiên, nên hacker chưa thể có được kết quả trong bảng user. Ta thử với URL sau:
![]() Khi lấy 1 kết quả: ![]() ![]() Khi số id ở SELECT đầu tiên không tồn tại, tức kết quả trả về là rỗng, khi đó kết quả sẽ chỉ có ở SELECT thứ hai. Union dùng để gộp query với các bảng có số trường bằng nhau. Ta thử thêm một trường nữa vào bảng post: Mã:
ALTER TABLE `post` ADD `ORDER` VARCHAR( 100 ) NOT NULL AFTER `TEXT` ; Mã:
SELECT * FROM post WHERE id='-1' UNION SELECT id,name,pass FROM user #'' ![]() Nhưng hãy thử bằng query sau đây: Mã:
SELECT * FROM post WHERE id='-1' UNION SELECT id,name,pass,1 FROM user #'' ![]() Từ đây ta rút ra được, đừng nên nghĩ rằng hai bảng không có số trường giống nhau thì sẽ không cho ra kết qua khi dùng Union! Ngoài việc lấy dữ liệu, hacker còn có thê khai thác qua các lệnh INSERT và UPDATE để thêm mới hoặc cập nhật dữ liệu trái phép như thêm tài khoản mới với quyền quản trị, cập nhật từ người dùng bình thường thành quản trị. Hacker còn có thể lấy các thông tin về máy chủ CSDL bằng các hàm như: DATABASE(),USER(),SYSTEM_USER(). Nguy hiểm với dữ liệu hơn là có thể dùng lệnh DROP để xóa đi một bảng nào đó! SQL Injection Cheat Sheet: ferruh.mavituna.com/makale/sql-injection-cheatsheet |
|||
|
|
Lần đọc: 395
|
|
|
#4 (permalink) | |
|
Cách chống SQL Injection:
“Hiểm họa” SQL Injection nằm ở vấn để nhập giá trị cùng dấu nháy đơn (') nhằm làm thay đổi câu query để thực hiện hành động không đúng mục đích. Cách giải quyết dấu nháy đơn là thêm kí tự thoát chuỗi để xem dấu nháy như là kí tự trong giá trị chứ không có tác dụng với cả query. PHP cung cấp sẵn giải pháp:
Mã:
Mã:
Mã:
Mã:
|
||
|
|
Lần đọc: 395
|
|
|
#5 (permalink) | |||
|
Trường hợp khi xử lý tìm kiếm, vì mysql_real_escape_string không lọc các kí tự % và _ nên bạn có thể lọc bằng cách sau (thoát chuỗi thủ công):
Mã:
- Giới hạn số kí tự tối đa: Các dữ liệu như số ID, tên tài khoản, mật khẩu dùng để khai thác lỗi SQL Injection thường không dài lắm so với câu query không hợp pháp dùng để “tiêm” SQL. Vì vậy, bạn nên giới hạn số kí tự tối đa nếu có thể. Ví dụ tên tài khoản và mật khẩu không được dài quá 32 kí tự. - Tắt thông báo lỗi: Thông thường, để khai thác lỗi SQL Injection, việc đầu tiên hacker phải làm là kiểm tra xem câu truy vấn có bị lỗi hay không. Khi có lỗi xảy ra, MySQL sẽ ném ra lỗi với thông tin chi tiết về lỗi đó, trong đó có cả thông tin về bảng bị lỗi. Chính từ những thông báo lỗi này, hacker có thể dễ dàng khai thác SQL Injection hơn. Vì vậy, tốt nhất là bạn hãy tắt thông báo lỗi trong PHP:
- Giới hạn quyền truy cập CSDL: Đừng nên dùng tài khoản có quyền quản trị cao nhất để truy cập database cho ứng dụng web. Thay vào đó, bạn nên tạo tài khoản khác với những quyền hạn phù hợp và nên giới hạn các quyền hạn liên qua tới hệ thống đến mức có thể. Lấy ví dụ, website chỉ đọc từ CSDL, bạn chỉ cần cho tài khoản MySQL có quyền SELECT. Nếu người dùng có hành động đăng nhập tài khoản, thì chỉ nên giới hạn quyền truy cập vào bảng user, các bảng khác không liên quan thì không thể truy cập được. |
||||
|
|
Lần đọc: 395
|
![]() |
| Công cụ bài viết | |
| Kiểu hiển thị | |
|
|
|
Address: Hoa Sen University, Ho Chi Minh City, Viet Nam. Designed by hiepgia. Best Viewed in 1024x768 with IE6+, Firefox 1.5+, Chrome, Opera 9+. Truy cập vào Website, nghĩa là bạn đã chấp nhận Quy Định của Forum! |
RSS RSS 2.0 XML
MAP |
| vBulletin v3.8.4 Licensed & Copyright © 2008 - 2009, Hoa Sen University. |