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
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
SELECT * FROM sys.extended_procedures 對比基線,納入自動化巡檢。攻擊者通過 SQL 注入調用 EXEC master..xp_dirtree 'C:\', 1, 1 遞歸列出系統盤所有目錄,配合 `xp_cmdshell` 或 `sp_OA*` 寫入 Webshell、修改 `boot.ini` 導致拒絕服務。刪除 xp_dirtree 可有效切斷偵察鏈路。