SQL Server 早期版本預裝大量擴展預存程序 (xp_cmdshell, xp_dirtree 等),提供文件系統、註冊表、網絡、郵件等作業系統級能力。出於安全合規,DBA 常執行:
EXEC sp_dropextendedproc 'xp_cmdshell';
但業務偶爾確需這些功能 (如備份腳本調用 xp_cmdshell、目錄掃描用 xp_dirtree),需知曉如何精準恢復。
每個擴展預存程序對應一個 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.dll | OLE 自動化 (COM 物件操作) | sp_OACreate, sp_OAMethod, sp_OAGetProperty |
sqlmap70.dll | SQLMail / MAPI 郵件 | xp_sendmail, xp_readmail, xp_startmail |
xpqueue.dll | MSMQ 隊列操作 | xp_createprivatequeue, xp_sendmsg |
xprepl.dll | 復制/發布訂閱/位圖操作 | xp_repl_encrypt, xp_makecab |
xpweb70.dll | Web Task (已棄用) | xp_makewebtask, xp_runwebtask |
若誤刪 xp_dirtree,不能 用 xplog70.dll 註冊,必須用 xpstar.dll:
EXEC sp_addextendedproc 'xp_dirtree', @dllname = 'xpstar.dll';
xp_cmdshell 執行上下文由 ##xp_cmdshell_proxy_account## 控制,務必設定低權限代理帳號。sp_configure 'xp_cmdshell', 1 後,配合 SQL Audit 記錄所有調用。sp_configure 'Ole Automation Procedures' 替代 odsole70.dll 手動註冊。xp_cmdshell 默認關閉,需 sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 1; RECONFIGURE; 開啟。擴展預存程序是「雙刃劍」:賦予 T-SQL 作業系統能力,卻極大擴大攻擊面。掌握 DLL-功能映射表,做到「知其名、知其源、知其危、知其替」,才能在合規與業務間找到平衡點。