[*Bài đọc] SQL injection

14. Bảo mật

SQl Injection là một kỹ thuật lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào, cho phép kẻ tấn công có đủ mọi quyền truy cập và thực hiện các câu lệnh SQL tùy ý trên cơ sở dữ liệu (database) như: thêm, sửa, xóa dữ liệu. Khi xâm nhập thành công, kẻ tấn công có thể tạo ra các đặc tính, truy cập tất cả dữ liệu có trên máy chủ, xóa hoặc thay đổi khiến cho dữ liệu đó không còn sử dụng được.

Lỗ hổng này có thể hiểu như sau: Một dữ liệu đầu vào khi được chuyển tới câu lệnh SQL phía dưới (máy chủ) xử lý có thể làm thay đổi nội dung câu lệnh SQL đó. Ví dụ, dòng mã minh họa dưới đây dùng trong HTML liệt kê danh sách người dùng theo tên(userName) cụ thể:

statement = "SELECT * FROM users WHERE name = '" + userName + "';"

Câu lệnh SQL trên sẽ trả về các bản ghi với giá trị biến hợp lệ: tên người dùng. Tuy nhiên, với kẻ muốn tấn công vào hệ thống thì câu lệnh SQL này có thể trở thành một câu truy vấn SQl với mục đích khác, hãy nhìn vào đoạn chữ bôi đậm phía dưới ứng với giá trị biến (username). Câu lệnh sửa đổi tạo ra một câu lệnh SQL hợp lệ với mục đích xóa bảng users và lấy tất cả các dữ liệu, thông tin từ bảng userinfo (nguy hiểm trong việc tiết lộ thông tin người dùng). Quá trình này thực thi hợp lệ do đầu vào được chèn thêm (a’;) với câu lệnh gốc (‘ là ký hiệu mô tả một chuỗi ký tự trong SQL)

SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';

Cách tránh kiểu tấn công này là đảm bảo mọi dữ liệu từ người dùng chuyển tới truy vấn SQL không làm thay đổi bản chất của câu truy vấn. Một trong đó là loại bỏ tất cả các ký tự đặc biệt có trong dữ liệu đầu vào.

Chú thích: Câu lệnh SQL xử lý với dấu nháy đơn ( ‘ ) được hiểu là bắt đầu và kết thúc của một chuỗi chữ. Với việc chèn dấu gạch chéo ngược ( \ ) vào trước dấu nháy đơn thì toàn bộ nội dung trong dấu nháy đơn đó sẽ là một chuỗi chữ.
Trong dòng mã minh họa phía dưới, câu lệnh SQL sẽ xử lý tên là một chuỗi in đậm (tên nhìn kì quặc nhưng vô hại)

SELECT * FROM users WHERE name = 'a\';DROP TABLE users; SELECT * FROM userinfo WHERE \'t\' = \'t';

Các thư viện web thông thường sẽ làm toàn bộ việc này. Ví dụ như Django, đảm bảo tất cả dữ liệu người dùng được chuyển tới querysets (truy vấn kiểu mô hình) đều được xử lý dấu nháy đơn hoàn toàn

Leave a Reply

Your email address will not be published. Required fields are marked *