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

SQL Server 危險擴展存儲過程清理與還原腳本庫 (SQL Server 2000/2005)

     編輯:關於SqlServer

為什麼要清理擴展存儲過程

SQL Server 早期版本為了功能豐富內建了大量擴展存儲過程,涉及命令執行、注冊表操作、COM/OLE 自動化、文件系統訪問等。這些組件運行在 SQL Server 進程空間內,一旦被攻擊者利用 (SQL 注入、提權、惡意代碼執行),將導致操作系統級別失陷。安全基線 (CIS、STIG、等保) 均要求移除非業務必需的擴展組件。

高危組件清單與影響評估

組件名功能風險等級業務影響 (刪除後)
xp_cmdshell執行 OS 命令🔴 致命無法用 xp_cmdshell 做備份/複製/ETL 封裝
xp_regread/write/delete/enum*注冊表讀寫枚舉🔴 致命無法讀取實例配置、啟動參數、實例名
xp_dirtree遍歷目錄樹🟠 高無法在 SSMS 瀏覽備份文件、創建數據庫對話框失效
xp_fixeddrives磁盤剩餘空間🟠 高備份/還原向導無法顯示磁盤空間
xp_enumerrorlogs枚舉錯誤日誌🟡 中SSMS 查看錯誤日誌歷史受限
xp_getfiledetails文件屬性詳情🟡 中文件屬性查看受限
sp_OA* (7個)COM/OLE 自動化 (創建/銷毀/屬性/方法)🔴 致命無法調用 COM 組件 (如 CDO 郵件、XMLDOM、ADO 流)
sp_makewebtask生成 HTML 報表🟢 低舊版 Web 報表功能失效,極少使用

一鍵清理腳本 (生產環境謹慎執行,建議先測試環境驗證業務影響)

USE master;
GO

-- 命令執行類
EXEC sp_dropextendedproc 'xp_cmdshell';

-- 注冊表操作類
EXEC sp_dropextendedproc 'xp_regaddmultistring';
EXEC sp_dropextendedproc 'xp_regdeletekey';
EXEC sp_dropextendedproc 'xp_regdeletevalue';
EXEC sp_dropextendedproc 'xp_regenumkeys';
EXEC sp_dropextendedproc 'xp_regenumvalues';
EXEC sp_dropextendedproc 'xp_regread';          -- ⚠️ 還原數據庫對話框依賴
EXEC sp_dropextendedproc 'xp_regremovemultistring';
EXEC sp_dropextendedproc 'xp_regwrite';

-- 文件系統類
EXEC sp_dropextendedproc 'xp_dirtree';           -- ⚠️ SSMS 瀏覽備份目錄依賴
EXEC sp_dropextendedproc 'xp_fixeddrives';       -- ⚠️ 磁盤空間顯示依賴
EXEC sp_dropextendedproc 'xp_enumerrorlogs';
EXEC sp_dropextendedproc 'xp_getfiledetails';

-- COM/OLE 自動化類
EXEC sp_dropextendedproc 'sp_OACreate';
EXEC sp_dropextendedproc 'sp_OADestroy';
EXEC sp_dropextendedproc 'sp_OAGetErrorInfo';
EXEC sp_dropextendedproc 'sp_OAGetProperty';
EXEC sp_dropextendedproc 'sp_OAMethod';
EXEC sp_dropextendedproc 'sp_OASetProperty';
EXEC sp_dropextendedproc 'sp_OAStop';

-- 遺留 Web 任務
DROP PROCEDURE IF EXISTS sp_makewebtask;
GO

還原腳本 (需原安裝介質對應 DLL 文件存在於 Binn 目錄)

USE master;
GO

EXEC sp_addextendedproc 'xp_cmdshell',         @dllname = 'xplog70.dll';
EXEC sp_addextendedproc 'xp_enumgroups',       @dllname = 'xplog70.dll';
EXEC sp_addextendedproc 'xp_loginconfig',      @dllname = 'xplog70.dll';
EXEC sp_addextendedproc 'xp_enumerrorlogs',    @dllname = 'xpstar.dll';
EXEC sp_addextendedproc 'xp_getfiledetails',   @dllname = 'xpstar.dll';
EXEC sp_addextendedproc 'sp_OACreate',         @dllname = 'odsole70.dll';
EXEC sp_addextendedproc 'sp_OADestroy',        @dllname = 'odsole70.dll';
EXEC sp_addextendedproc 'sp_OAGetErrorInfo',   @dllname = 'odsole70.dll';
EXEC sp_addextendedproc 'sp_OAGetProperty',    @dllname = 'odsole70.dll';
EXEC sp_addextendedproc 'sp_OAMethod',         @dllname = 'odsole70.dll';
EXEC sp_addextendedproc 'sp_OASetProperty',    @dllname = 'odsole70.dll';
EXEC sp_addextendedproc 'sp_OAStop',           @dllname = 'odsole70.dll';
EXEC sp_addextendedproc 'xp_regaddmultistring',@dllname = 'xpstar.dll';
EXEC sp_addextendedproc 'xp_regdeletekey',     @dllname = 'xpstar.dll';
EXEC sp_addextendedproc 'xp_regdeletevalue',   @dllname = 'xpstar.dll';
EXEC sp_addextendedproc 'xp_regenumvalues',    @dllname = 'xpstar.dll';
EXEC sp_addextendedproc 'xp_regremovemultistring',@dllname = 'xpstar.dll';
EXEC sp_addextendedproc 'xp_regwrite',         @dllname = 'xpstar.dll';
EXEC sp_addextendedproc 'xp_dirtree',          @dllname = 'xpstar.dll';
EXEC sp_addextendedproc 'xp_regread',          @dllname = 'xpstar.dll';
EXEC sp_addextendedproc 'xp_fixeddrives',      @dllname = 'xpstar.dll';
GO

SQL Server 2005/2008+ 版本差異提示

  • 2005+ 默認已禁用 `xp_cmdshell` (需 `sp_configure 'xp_cmdshell', 1` 啟用),DLL 文件改為 `xpstar.dll` / `odsole70.dll` 同名但版本不同,不可跨版本混用 DLL。
  • 2005+ 引入 CLR 集成 替代 `sp_OA*`,安全性可控 (SAFE/EXTERNAL_ACCESS/UNSAFE 權限集),建議遷移至 CLR 方案。
  • 2008+ `sp_addextendedproc` 已棄用,官方文檔標註「未來版本將移除」,新開發請改用 CLR 或外部應用層處理。

實戰建議:分級防護策略

  1. 核心生產庫:全量清理上表所有組件,僅保留業務證實必需的極少數 (極罕見)。
  2. 一般業務庫:清理命令執行、注冊表、COM 類;保留 `xp_dirtree`、`xp_fixeddrives`、`xp_regread` 以維持 SSMS 圖形化操作體驗。
  3. 開發/測試環境:保留全部,方便調試,但網絡隔離、嚴禁對外暴露。
  4. 審計合規:定期運行 SELECT * FROM sys.extended_procedures 對比基線,納入自動化巡檢。

經典攻擊案例:xp_dirtree 目錄遍歷洩露

攻擊者通過 SQL 注入調用 EXEC master..xp_dirtree 'C:\', 1, 1 遞歸列出系統盤所有目錄,配合 `xp_cmdshell` 或 `sp_OA*` 寫入 Webshell、修改 `boot.ini` 導致拒絕服務。刪除 xp_dirtree 可有效切斷偵察鏈路。

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