Các kỹ thuật tấn công cơ sở dữ liệu

Một phần của tài liệu Xây dựng website thương mại điện tử (Trang 110 - 114)

a) Sửa đổi nội dung câu truy vấn

Sửa đổi nội dung câu truy vấn (SQL Injection) là cách lợi dụng những lỗ hổng trong trong quá trình lập trình Web về phần truy xuất cơ sở dữ liệu. Đây không chỉ là khuyết điểm của riêng SQL Server mà nó còn là vấn đề chung cho các cơ sở dữ liệu khác như MS Access hay Oracle.

Khi Hacker gửi những dữ liệu (thông qua webform), ứng dụng web sẽ thực hiện và trả về cho trình duyệt kết quả câu truy vấn hay những thông báo lỗi có liên quan đến cơ sở dữ liệu. Và nhờ những thông tin này mà hacker biết được nội dung cơ sở dữ liệu và có thể điều khiển toàn bộ hệ thống ứng dụng.

Dưới đây là kỹ thuật SQL Injection đơn giản nhất để vượt qua các form đăng nhập:

Giả sử ứng dụng Web có đoạn mã sau:

SQLQuery= “SELECT Username FROM User WHERE Username= ‘”&strUsername& “’AND PASSWORD= ‘”&Password& “’”

flag=GetQueryResult(SQLQuery) If flag= “” then check=FALSE Else check=TRUE

End if

Đoạn mã trên kiểm tra chuỗi nhập Username và Password. Nếu tồn tại trong bảng User thì kiểm tra là đúng và ngược lại thì biến kiểm tra gán bằng false.

Username: ’OR ‘’=’ Password: ’or ‘’=’

Câu lệnh SQL lúc này như sau:

SQLQuery= “SELECT Username FROM User WHERE Username= ‘’ OR ‘’= ‘’ AND PASSWORD= ‘’ OR ‘’= ‘’

Câu lệnh so sánh trên luôn luôn đúng (vì ‘’ luôn bằng ‘’). Do đó, câu điều kiện trong mệnh đề WHERE luôn luôn đúng. Giá trị tên người sử dụng đầu tiên trong bảng sẽ được chọn.

Kết hợp với các ký tự đặc biệt của SQL:

 Ký tự “;”: đánh dấu kết thúc một câu truy vấn

 Ký tự “--”: ẩn chuỗi ký tự phía sau nó trên cùng một dòng

Hoặc giá trị nhập vào là: Username: ’; drop table User-- Password:

Câu lệnh SQL lúc này như sau:

SQLQuery= “SELECT Username FROM User WHERE Username= ‘’;drop table User-- AND PASSWORD= ‘”&Password& “’”

Với câu lệnh trên thì bảng User sẽ bị xóa hoàn toàn. Hoặc giá trị nhập vào là:

Username: admin’-- Password:

Câu lệnh SQL như sau:

SQLQuery= “SELECT Username FROM User WHERE Username= ‘admin’-- AND PASSWORD= ‘”&Password& “’”

Câu lệnh trên cho phép đăng nhập vào hệ thống với quyền admin mà không đòi hỏi password.

HAVING sử dụng cùng chung với mệnh đề GROUP BY là phương pháp hữu hiệu để nhận thông tin bảng dữ liệu, trường dữ liệu.

Lệnh SELECT được dùng để lấy thông tin từ cơ sở dữ liệu. Thông thường vị trí có thể chèn thêm vào mệnh đề SELECT là sau WHERE. Để có thể trả về nhiều dòng thông tin trong bảng, thay đổi điều kiện trong mệnh đề WHERE bằng cách chèn thêm UNION SELECT.

Sau đây là những ví dụ được thực hiện khi không biết nội dung cơ sở dữ liệu dựa vào HAVING, GROUP BY, UNION:

Đầu tiên, để biết tên bảng và tên trường mà câu truy vấn sử dụng, sử dụng câu điều kiện “having” như ví dụ sau:

Giá trị nhập vào:

Username: ’having 1=1-- Lỗi phát sinh:

Column ‘User.Username’is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. (adsbygoogle = window.adsbygoogle || []).push({});

Nhờ vào lỗi phát sinh này mà biết được bảng sử dụng trong câu truy vấn là User và trong bảng tồn tại một trường tên là Username.

Sau đó sử dụng GROUP BY

Username: ‘group by User.Username having 1=1-- Lỗi phát sinh:

Column ‘User.Password’is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

Như vậy, Password là một trường của bảng User và được sử dụng trong câu truy vấn. Tiếp tục dùng GROUP BY cho đến khi biết được tất cả các trường trong bảng User tham gia vào câu truy vấn. Khi không còn báo lỗi cú pháp GROUP BY nữa thì chuyển qua công đoạn kiểm tra kiểu của từng trường trong bảng. Lúc này UNION được sử dụng.

Lệnh SUM() là lệnh tính tổng cho đối số bên trong dấu ngoặc. Đối số phải là kiểu số. Nếu đối số không là kiểu số thì phát sinh lỗi như sau:

The sum or average aggregate operation cannot take a varchar data type as an argument.

Với thông báo lỗi trên thì Username chắc chắn phải là kiểu varchar. Với phương pháp trên dễ dàng xác định được từng trường trong bảng. Sau khi đã nhận đầy đủ thông tin trên thì hacker dễ dàng tự thêm thông tin vào bảng User.

Username: ’; insert into User(Username,Password) values(‘admin’, ‘’)--

Hacker thêm nội dung như ví dụ trên  bây giờ trở thành người quản trị mạng

mà không cần mật khẩu để chứng thực.

c) Tấn công dựa vào câu lệnh INSERT

Từ khóa INSERT dùng để đưa thông tin vào cơ sở dữ liệu. Thông thường câu lệnh INSERT được dùng trong các trường hợp như: thông tin đăng ký người sử dụng.

Kỹ thuật “;”, “--” được dùng như đã từng dùng với câu lệnh SELECT, phải đảm bảo đúng số lượng và kiểu giá trị được nhập vào nhằm tránh lỗi về cú pháp (nếu không xác định được kiểu dữ liệu có thể nhập tất cả là số).

d) Tấn công dựa vào STORED PROCEDURE

Stored Procedure được sử dụng trong lập trình Web với mục đích giảm sự phức tạp trong ứng dụng và tránh sự tấn công trong kỹ thuật SQL Injection. Tuy nhiên hacker vẫn có thể lợi dụng những Store Procedure để tấn công vào hệ thống.

Ví dụ, Stored Procedure sp_login gồm hai tham số là username và password. Nếu nhập:

Username: nhimmap Password: ‘;shutdown--

Lệnh gội Stored Procedure như sau: Exec sp_login ‘nhimmap’,‘’;shutdown--

Một phần của tài liệu Xây dựng website thương mại điện tử (Trang 110 - 114)