首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 擴展預存程序 (xp_cmdshell 等) 管理與 DLL 依賴深度解析

     編輯:MySQL 資料庫相關知識

背景:為什麼要刪除/恢復擴展預存程序?

SQL Server 早期版本預裝大量擴展預存程序 (xp_cmdshell, xp_dirtree 等),提供文件系統、註冊表、網絡、郵件等作業系統級能力。出於安全合規,DBA 常執行:

EXEC sp_dropextendedproc 'xp_cmdshell';

但業務偶爾確需這些功能 (如備份腳本調用 xp_cmdshell、目錄掃描用 xp_dirtree),需知曉如何精準恢復。

核心機制:DLL 映射表

每個擴展預存程序對應一個 DLL,註冊時需指定 DLL 路徑:

EXEC sp_addextendedproc 'xp_cmdshell', @dllname = 'xplog70.dll';

但 並非所有 xp 都在同一 DLL。通過工具 (如 eXeScope) 反編譯 MSSQL\Binn\*.dll 可得映射:

DLL 文件代表功能域關鍵預存程序示例
xplog70.dll核心命令執行xp_cmdshell
xpstar.dll文件/註冊表/服務/錯誤日誌/實例註冊表xp_dirtree, xp_fileexist, xp_regread, xp_servicecontrol, xp_readerrorlog
odsole70.dllOLE 自動化 (COM 物件操作)sp_OACreate, sp_OAMethod, sp_OAGetProperty
sqlmap70.dllSQLMail / MAPI 郵件xp_sendmail, xp_readmail, xp_startmail
xpqueue.dllMSMQ 隊列操作xp_createprivatequeue, xp_sendmsg
xprepl.dll復制/發布訂閱/位圖操作xp_repl_encrypt, xp_makecab
xpweb70.dllWeb Task (已棄用)xp_makewebtask, xp_runwebtask

實戰:恢復 xp_dirtree

若誤刪 xp_dirtree,不能 用 xplog70.dll 註冊,必須用 xpstar.dll:

EXEC sp_addextendedproc 'xp_dirtree', @dllname = 'xpstar.dll';

安全最佳實踐

  1. 最小權限原則:僅在確有業務需求的實例/數據庫啟用特定 xp。
  2. 代理帳號隔離:xp_cmdshell 執行上下文由 ##xp_cmdshell_proxy_account## 控制,務必設定低權限代理帳號。
  3. 審計追蹤:啟用 sp_configure 'xp_cmdshell', 1 後,配合 SQL Audit 記錄所有調用。
  4. 替代方案優先:文件操作改用 CLR 整合 (SQLCLR) 或 SSIS 腳本任務,避免直接暴露 OS Shell。

版本演進提示

  • SQL Server 2005+ 推薦使用 sp_configure 'Ole Automation Procedures' 替代 odsole70.dll 手動註冊。
  • SQL Server 2012+ xp_cmdshell 默認關閉,需 sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 1; RECONFIGURE; 開啟。
  • Azure SQL / 容器化部署環境通常禁止擴展預存程序,架構設計時需規避依賴。

總結

擴展預存程序是「雙刃劍」:賦予 T-SQL 作業系統能力,卻極大擴大攻擊面。掌握 DLL-功能映射表,做到「知其名、知其源、知其危、知其替」,才能在合規與業務間找到平衡點。

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