首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 危險內置存儲過程清理指南:封殺 xp_cmdshell 等高風險擴展

     編輯:關於SqlServer

SQL Server 內置數十個擴展存儲過程與 OLE 自動化過程,若被惡意利用可導致系統級滲透。本文列出高風險清單,提供徹底禁用、恢復、驗證的標準化操作流程,構建資料庫層面的纏深防御體系。

高風險存儲過程清單(必禁)

A. 擴展存儲過程(xp_*)

  • xp_cmdshell:執行任意系統命令(最高風險)
  • xp_regread / xp_regwrite / xp_regdeletekey / xp_regdeletevalue / xp_regenumkeys / xp_regenumvalues / xp_regaddmultistring / xp_regremovemultistring:註冊表讀寫枚舉

B. OLE 自動化過程(sp_OA*)

  • sp_OACreate / sp_OADestroy / sp_OAMethod / sp_OAGetProperty / sp_OASetProperty / sp_OAGetErrorInfo / sp_OAStop:COM 組件實例化與調用,可訪問文件系統、網絡、WMI 等

標準禁用流程

1. 刪除擴展存儲過程入口點

-- 以 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;

2. 物理刪除/重命名底層 DLL(防繞過恢復)

查詢 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,此步僅適用舊版本。

3. 禁用 OLE 自動化(Surface Area Configuration)

EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 0; RECONFIGURE;
EXEC sp_configure 'show advanced options', 0; RECONFIGURE;

業務確需使用時的受控開放方案

  1. 封裝為簽名存儲過程:僅在特定過程中 EXEC sp_addextendedproc → 執行業務邏輯 → EXEC sp_dropextendedproc,全程事務包裹。
  2. 最小權限代理賬號:配置 ##xp_cmdshell_proxy_account## 憑證,非 sysadmin 用戶通過代理賬號上下文執行,限制系統權限。
  3. 審計與告警:啟用 Audit Broker Conversation / Audit Schema Object Access,記錄所有擴展過程調用,異常即時告警。

驗證清單

  • ✅ SELECT * FROM sys.extended_procedures 無高風險條目
  • ✅ EXEC sp_configure 'Ole Automation Procedures' 顯示 run_value = 0
  • ✅ 非 sysadmin 用戶執行 EXEC xp_cmdshell 'whoami' 報錯
  • ✅ 審計日志記錄嘗試調用事件

現代替代方案(推薦替代 xp_cmdshell)

  • SQL CLR:托管代碼沙箱,代碼訪問安全 (CAS) 精細控制權限。
  • 外部腳本:sp_execute_external_script (R/Python) 配合資源管理器隔離。
  • Agent 作業 + PowerShell/CmdExec 步驟:由服務賬號運行,權限可控,審計完整。
  • 文件表 / FILESTREAM:文件系統操作替代方案。

資料庫安全的核心原則:默認拒絕、最小權限、審計全程、定期複核。定期執行上述清理腳本,應作為資料庫強化基線納入自動化合規檢查體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved