Khái quát SQL injection

I – SQL injection là gì?

SQL injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web với backend không sử dụng data object mà dùng kết nối query thuần và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để để tìm kiếm ,chiếm đoạt thông tin hoặc phá huỷ data hệ thống.

II – Những cách tấn công thông thường

2.1 : Thông qua những input nhập liệ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.  Ví dụ như sau:

$query = "SELECT * FROM products WHERE name = '" + $name + "';"

Câu sql trên được sử dụng cho người dùng tìm kiếm các sản phẩm theo tên mà người dùng muốn tìm. Tuy nhiên, người dùng cuối, thay vì nhập vào một tên sản phẩm họ nhập vào 1 chuỗi ký tự sql với chủ ý thay đổi câu lệnh tìm kiếm của hệ thống. Ví dụ, ta thiết lập giá trị của biến $name là:

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

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

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

2.2 : Blind SQL injections

Cơ sở của kỹ thuật này là việc so sánh đúng sai để phán đoán tên bảng,tên cột hoặc tìm ra từng ký tự của những thông tin như tên bảng, tên cột…

Ví dụ :

1 URL như sau : http://www.sales.com/products?pid=63

và câu lệnh SQL được thực hiện sẽ là :

SELECT  *  FROM products WHERE produc_ID=63

để xác định xem nó có bị dinh lỗi blind sql injection ko ta hãy thử thêm vào 1 điều kiện đúng .Ví dụ :

http://www.sales.com/products?pid=63 AND 1=1

nếu ta vẫn có được data như trước nghĩa là trang này bị lỗi blind sql injection.từ đó ta thêm các kiều điện vào và dựa vào kết quả trả về để biết điều kiên ta đưa vào là đúng hay sai.Ví dụ :

http://www.sales.com/products?pid=63 AND ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))=97

Lấy ký tự đầu username của table users xem phải ký tự ‘a’Ta có thể dùng phép so > hay < để chặn các kết quả để giảm bớt số lần so sánh (như quicksort chẳng hạn).

III – Phương pháp phòng tránh

3.1 : Sử dụng data object

Nên sử dụng data object  thay cho cách truy vấn thông thường (vi dụ trong php là PDO ),khi đó những input nhập vào được coi là ký tự và không thể thay đôi cấu trúc câu truy vấn.Dễ dàng thao tác với những loại cơ sở dữ liệu khác nhau,cấu trúc tốt và tránh lỗi cú pháp khi sử dụng những câu query trực tiếp.

2.2 : Validate dữ liệu đầu vào

Bắt buộc phải validate dữ liệu từ 2 phía client và server,loại bỏ các ký tự không cần thiết ,các key đặc biệt trong SQL ,format theo đúng chuẩn dữ liệu cần thiết.

2.3 : Phân quyền SQL

Tùy vào mỗi trường hợp mà ta thiết lập role phù hợp cho mỗi tài khoản web tương tác với cơ sở dữ liệu. Với những ứng dụng web thông thường, tài khoản cho ứng dụng web trong SQL SERVER nên chỉ được thiết lập quyền đọc (SELECT) (db_datareader) và quyền ghi (INSERT, UPDATE) (db_datawriter).

IV – Tài liệu tham khảo

http://vi.wikipedia.org/wiki/SQL_injection

http://crypto.stanford.edu/cs142/lectures/16-sql-inj.pdf

Add a Comment

Scroll Up