2008年12月10日 星期三

xp_cmdshell 的移除與回復

xp_cmdshell 的移除與回復

1.xp_cmdshell是一個延伸預存程序,可以讓T-SQL執行shell command
2.SQL Server 2000 預設是啟用xp_cmdshell,
而SQL Server 2005預設是停用的,可使用 [SQL Server 介面區組態] 將此功能啟用
3.預設值只有System Administrator角色可以執行xp_cmdshell

[安全性考量]
雖然預設值只有System Administrator角色可以執行xp_cmdshell,
當系統不幸遭遇SQL Injection攻擊,而程式沒做進一步的防禦時,
而SQL Server安裝時又習慣以本機系統帳戶來啟動SQL Server,
此時攻擊者則可以下dir或del等命令取得檔案目錄資訊或刪除檔案等動作,
或進一步下net user等命令建立Windows管理員帳戶,或些改OS系統設定,
此時等於整台系統都被駭客接管了.

因此,如果沒有用到xp_cmdshell,為了安全還是建議將xp_cmdshell移除,
以下說明兩種移除法
1.T-SQL Command 移除法
2.Enterprise Manager 移除法(UI圖形介面)


-- 執行以下命令來測試xp_cmdshell目前是否可用
xp_cmdshell 'dir c:\'

-- [T-SQL Command 移除法]
-- 移除xp_cmdshell, 從SQL Server移除後
-- 更進一步可以把dll檔都刪除, 補充1的命令可以查出dll檔名稱
USE master
GO
EXEC sp_dropextendedproc 'xp_cmdshell'
GO

-- 執行以下命令來測試xp_cmdshell目前是否可用
xp_cmdshell 'dir c:\'

-- 如果將來又需要使用的時候,責執行以下回復命令將xp_cmdshell加回來
-- 執行此命令的前提是xplog70.dll檔需存在
USE master
GO
EXEC sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'

-- [補充1]:此命令可以查出xp_cmdshell的dll檔的名稱
select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and o.name='xp_cmdshell'

-- [補充2]:此命令可查出有哪些預存程序仍有用到xplog70.dll檔
select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and c.text='xplog70.dll'

-- xplog70.dll的預設路徑是
-- C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll


-- [Enterprise Manager 移除法]

Step1.啟動Enterprise Manager
Step2.依照左圖找到xp_cmdshell






















Step3.按滑鼠右鍵,選擇刪除
















Step4.點選 [顯示依存的情況],此按鈕可顯示目前SQL Server有哪些物件還有用到xp_cmdshell















若沒有顯示任何物件則可進行下一個步驟,若是有顯示依存物件,則需要將依存的問題解決後才進行移除
Step5.點選 [卸除全部]

沒有留言: