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à các
thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào)
và thi hành các câu lệnh SQL bất hợp pháp, Sql injection có thể cho phép
những kẻ tấn công thực hiện các thao tác, delete, insert, update,… trên
cơ sỡ dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang
chạy, lỗi này thường xãy ra trên các ứng dụng web có dữ liệu được quản
lý bằng các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle,
DB2, Sysbase...
Không kiểm tra ký tự thoát truy vấn
Đây là dạng lỗi SQL injection xảy ra khi thiếu đoạn mã kiểm tra dữ liệu đầu vào trong câu truy vấn SQL. Kết quả là người dùng cuối có thể thực hiện một số truy vấn không mong muốn đối với cơ sở dữ liệu của ứng dụng. Dòng mã sau sẽ minh họa lỗi này:
Câu lệnh này được thiết kế để trả về các bản ghi tên người dùng cụ thể
từ bảng những người dùng. Tuy nhiên, nếu biến "userName" được nhập chính
xác theo một cách nào đó bởi người dùng ác ý, nó có thể trở thành một
câu truy vấn SQL với mục đích khác hẳn so với mong muốn của tác giả đoạn
mã trên. Ví dụ, ta nhập vào giá trị của biến userName như sau:
Nếu đoạn mã trên được sử dụng trong một thủ tục xác thực thì ví dụ trên
có thể được sử dụng để bắt buộc lựa chọn một tên người dùng hợp lệ bởi
't'='t' luôn đúng. Trong khi hầu hết các SQL server cho phép thực hiện
nhiều truy vấn cùng lúc chỉ với một lần gọi, tuy nhiên một số SQL API
như mysql_query của php lại không cho phép điều đó vì lý do bảo mật.
Điều này chỉ ngăn cản tin tặc tấn công bằng cách sử dụng các câu lệnh
riêng rẽ mà không ngăn cản tin tặc thay đổi các từ trong cú pháp truy
vấn. Các giá trị của biến "userName" trong câu truy vấn dưới đây sẽ gây
ra việc xoá những người dùng từ bảng người dùng cũng tương tự như việc
xóa tất cả các dữ liệu được từ bảng dữ liệu (về bản chất là tiết lộ các
thông tin của mọi người dùng), ví dụ này minh họa bằng một API cho phép
thực hiện nhiều truy vấn cùng lúc:
Ta có thể nhận thấy một cách rõ ràng ý định của tác giả đoạn mã trên là
nhập vào một số tương ứng với trường id - trường số. Tuy nhiên, người
dùng cuối, thay vì nhập vào một số, họ có thể nhập vào một chuỗi ký tự,
và do vậy có thể trở thành một câu truy vấn SQL hoàn chỉnh mới mà bỏ qua
ký tự thoát. Ví dụ, ta thiết lập giá trị của biến a_variable là:
Sẽ hiển thị một trang một cách bình thường, trong khi:
sẽ hiển thị một nội dung khác, hoặc không hiển thị gì nếu ứng dụng web
có chứa lỗi SQL injection dạng này. Lỗ hổng dạng này còn cho phép tin
tặc không chỉ gây ảnh hưởng tới bảng hay dữ liệu hiện tại mà còn ảnh
hưởng tới những dữ liệu hay bảng khác phụ thuộc vào nội dung của dữ liệu
hay bảng hiện tại.
Phép chia cho 0 chỉ được đánh giá là lỗi khi mà người dùng có tên "Ralph" tồn tại trong cơ sở dữ liệu.
Đại học Duy Tân
Không kiểm tra ký tự thoát truy vấn
Đây là dạng lỗi SQL injection xảy ra khi thiếu đoạn mã kiểm tra dữ liệu đầu vào trong câu truy vấn SQL. Kết quả là người dùng cuối có thể thực hiện một số truy vấn không mong muốn đối với cơ sở dữ liệu của ứng dụng. Dòng mã sau sẽ minh họa lỗi này:
statement = "SELECT * FROM users WHERE name = '" + userName + "';"
a' or 't'='tKhiến câu truy vấn có thể được hiểu như sau:
SELECT * FROM users WHERE name = 'a' OR 't'='t';
a';DROP TABLE users; SELECT * FROM data WHERE 't' = 'tĐiều này đưa tới cú pháp cuối cùng của câu truy vấn trên như sau:
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM DATA WHERE 't' = 't';
Xử lý không đúng kiể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. Điều này có thể xảy ra khi một trường số được sử dụng trong truy vấn SQL nhưng lập trình viên lại thiếu bước kiểm tra dữ liệu đầu vào để xác minh kiểu của dữ liệu mà người dùng nhập vào có phải là số hay không. Ví dụ như sau:statement := "SELECT * FROM data WHERE id = " + a_variable + ";"
1;DROP TABLE userskhi đó, nó sẽ thực hiện thao tác xóa người dùng có id tương ứng khỏi cơ sở dữ liệu, vì câu truy vấn hoàn chỉnh đã được hiểu là:
SELECT * FROM DATA WHERE id=1;DROP TABLE users;
Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu
Đôi khi lỗ hổng có thể tồn tại chính trong phần mềm máy chủ cơ sở dữ liệu, như là trường hợp hàm mysql_real_escape_string() của các máy chủ MySQL. Điều này sẽ cho phép kẻ tấn công có thể thực hiện một cuộc tấn công SQL injection thành công dựa trên những ký tự Unicode không thông thường ngay cả khi đầu nhập vào đang được thoát.Blind SQL injection
Lỗi SQL injection dạng này là dạng lỗi tồn tại ngay trong ứng dụng web nhưng hậu quả của chúng lại không hiển thị trực quan cho những kẻ tấn công. Nó có thể gây ra sự sai khác khi hiển thị nội dung của một trang chứa lỗi bảo mật này, hậu quả của sự tấn công SQL injection dạng này khiến cho lập trình viên hay người dùng phải mất rất nhiều thời gian để phục hồi chính xác từng bit dữ liệu. Những kẻ tấn công còn có thể sử dụng một số công cụ để dò tìm lỗi dạng này và tấn công với những thông tin đã được thiết lập sẵn.Thay đổi giá trị điều kiện truy vấn
Dạng lỗi này khiến cho kẻ tấn công có thể thay đổi giá trị điều kiện trong câu truy vấn, làm sai lệch sự hiển thị của một ứng dụng chứa lỗi này.SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=1;
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2;
Điều kiện lỗi
Lỗi SQL injection dạng này dẫn tới việc buộc cơ sở dữ liệu chỉ được phép đánh giá khi mà giá trị của câu lệnh WHERE là đúng. Ví dụ:SELECT 1/0 FROM users WHERE username='Ralph';
Thời gian trễ
Lỗi SQL injection dạng này tồn tại khi thời gian xử lý của một hay nhiều truy vấn SQL phụ thuộc vào dữ liệu logic được nhập vào hoặc quá trình xử lý truy vấn của SQL engine cần nhiều thời gian. Tin tặc có thể sử dụng lỗi SQL injection dạng này để xác định thời gian chính xác mà trang cần tải khi giá trị nhập vào là đúng.Đại học Duy Tân
Không có nhận xét nào:
Đăng nhận xét