SQL Server 內置數十個擴展存儲過程與 OLE 自動化過程,若被惡意利用可導致系統級滲透。本文列出高風險清單,提供徹底禁用、恢復、驗證的標準化操作流程,構建資料庫層面的纏深防御體系。
xp_cmdshell:執行任意系統命令(最高風險)xp_regread / xp_regwrite / xp_regdeletekey / xp_regdeletevalue / xp_regenumkeys / xp_regenumvalues / xp_regaddmultistring / xp_regremovemultistring:註冊表讀寫枚舉sp_OACreate / sp_OADestroy / sp_OAMethod / sp_OAGetProperty / sp_OASetProperty / sp_OAGetErrorInfo / sp_OAStop:COM 組件實例化與調用,可訪問文件系統、網絡、WMI 等-- 以 xp_cmdshell 為例
EXEC sp_dropextendedproc 'xp_cmdshell';
-- 批量腳本
DECLARE @procs TABLE (name sysname);
INSERT @procs VALUES
('xp_cmdshell'),('xp_regread'),('xp_regwrite'),('xp_regdeletekey'),('xp_regdeletevalue'),
('xp_regenumkeys'),('xp_regenumvalues'),('xp_regaddmultistring'),('xp_regremovemultistring'),
('sp_OACreate'),('sp_OADestroy'),('sp_OAMethod'),('sp_OAGetProperty'),('sp_OASetProperty'),('sp_OAGetErrorInfo'),('sp_OAStop');
DECLARE @p sysname;
DECLARE cur CURSOR FOR SELECT name FROM @procs;
OPEN cur;
FETCH NEXT FROM cur INTO @p;
WHILE @@FETCH_STATUS = 0 BEGIN
BEGIN TRY
EXEC sp_dropextendedproc @p;
PRINT 'Dropped: ' + @p;
END TRY
BEGIN CATCH
PRINT 'Failed: ' + @p + ' - ' + ERROR_MESSAGE();
END CATCH
FETCH NEXT FROM cur INTO @p;
END
CLOSE cur; DEALLOCATE cur;
查詢 DLL 路徑:
EXEC sp_helpextendedproc 'xp_cmdshell';
-- 返回 dll_name: xpsql70.dll (SQL 2000) / xplog70.dll 等
操作:將對應 DLL 重命名(如 xpsql70.dll.bak)或移出 Binn 目錄。注意:SQL Server 2005+ 核心擴展已內建於 sqlservr.exe,無獨立 DLL,此步僅適用舊版本。
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 0; RECONFIGURE;
EXEC sp_configure 'show advanced options', 0; RECONFIGURE;
EXEC sp_addextendedproc → 執行業務邏輯 → EXEC sp_dropextendedproc,全程事務包裹。##xp_cmdshell_proxy_account## 憑證,非 sysadmin 用戶通過代理賬號上下文執行,限制系統權限。Audit Broker Conversation / Audit Schema Object Access,記錄所有擴展過程調用,異常即時告警。SELECT * FROM sys.extended_procedures 無高風險條目EXEC sp_configure 'Ole Automation Procedures' 顯示 run_value = 0EXEC xp_cmdshell 'whoami' 報錯sp_execute_external_script (R/Python) 配合資源管理器隔離。資料庫安全的核心原則:默認拒絕、最小權限、審計全程、定期複核。定期執行上述清理腳本,應作為資料庫強化基線納入自動化合規檢查體系。