xp_cmdshell -- 執行作業系統命令 (最高風險)
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread -- 讀取登錄
xp_regremovemultistring
xp_regwrite -- 寫入登錄
sp_OACreate
sp_OADestroy
sp_OAMethod
sp_OAGetProperty
sp_OASetProperty
sp_OAGetErrorInfo
sp_OAStop
-- 移除 xp_cmdshell
EXEC sp_dropextendedproc 'xp_cmdshell';
-- 查詢對應 DLL (還原時需用)
EXEC sp_helpextendedproc 'xp_cmdshell';
-- 回傳 xpsql70.dll
-- 還原 xp_cmdshell
EXEC sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll';
移除擴展程序後,攻擊者若取得 sa 權限仍可執行 sp_addextendedproc 重新註冊。必須在檔案系統層面處理:
-- 重命名 DLL (需停止 SQL Server 服務)
REN %ProgramFiles%\Microsoft SQL Server\MSSQL\Binn\xpsql70.dll xpsql70.dll.disabled
-- 或移動至非系統路徑
MOVE xpsql70.dll D:\SecuredBin\
同理處理 odsole70.dll (OLE Automation)、xpstar.dll 等。
-- 檢查現存危險擴展程序
SELECT name FROM sys.extended_procedures
WHERE name IN ('xp_cmdshell','xp_regread','xp_regwrite','xp_regdeletekey',
'xp_regenumkeys','xp_regenumvalues','xp_regaddmultistring',
'xp_regremovemultistring','xp_regdeletevalue');
-- 檢查 OLE Automation 程序是否可用 (嘗試建立物件)
DECLARE @hr int, @obj int;
EXEC @hr = sp_OACreate 'Scripting.FileSystemObject', @obj OUTPUT;
IF @hr = 0 PRINT 'OLE Automation 啟用 - 風險!'; ELSE PRINT 'OLE Automation 已停用';
xp_cmdshell,改用 CLR 整合 (SQL 2005+) 並限定 EXTERNAL_ACCESS 權限集,或建立獨立代理服務透過 Service Broker/訊息隊列處理。