文章原始內容展示了攻擊者取得 `sa` 權限後,如何利用 `xp_cmdshell` 與 VBScript 繞過系統限制新增本地管理員帳號。這是一條經典的權限提升攻擊鏈。本文重構為**防禦檢核指南**,助 DBA 與藍隊封堵路徑。
| 風險面向 | 說明 | 風險等級 |
|---|---|---|
xp_cmdshell 啟用 | 允許 T-SQL 直接執行 OS 命令,等同給資料庫帳號 Shell 存取權 | 🔴 致命 |
| OLE Automation (`sp_OA*`) 啟用 | 允許實例化 COM 物件 (`Scripting.FileSystemObject`, `WScript.Network`, `ADODB.Stream` 等),可讀寫檔案、註冊表、網路 | 🔴 致命 |
| `sa` 帳號啟用且密碼弱 | 攻擊入口,暴力破解/噴灌首選目標 | 🔴 致命 |
| 資料庫服務帳號為高權限 (Local System / Domain Admin) | `xp_cmdshell` 執行上下文即為服務帳號,若為高權限則直接掌控主機/網域 | 🟠 高危 |
| 缺乏審計/監控 | 無法發現異常 `xp_cmdshell` 呼叫、檔案寫入、帳號建立事件 | 🟠 高危 |
-- 1. 關閉 xp_cmdshell (預設關閉,嚴禁開啟)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0; RECONFIGURE;
EXEC sp_configure 'show advanced options', 0; RECONFIGURE;
-- 2. 關閉 OLE Automation Procedures (預設關閉)
EXEC sp_configure 'Ole Automation Procedures', 0; RECONFIGURE;
-- 3. 禁用/重命名 sa 帳號
ALTER LOGIN [sa] DISABLE; -- 或 RENAME
-- 強制強密碼策略
ALTER LOGIN [sa] WITH PASSWORD = 'C0mpl3x!P@ssw0rd', CHECK_POLICY = ON;
-- 4. 服務帳號最小權限
-- 必須使用專用網域服務帳號 (非管理員),配置「以服務身分登入」權利
-- 拒絕「本地登入」、「批次作業登入」等不必要權利
CREATE TRIGGER TR_Block_SA_External
ON ALL SERVER FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN() = 'sa' AND CLIENT_HOST() NOT IN ('AppServer01', 'AppServer02')
ROLLBACK;
END;
CREATE SERVER AUDIT [Audit_Sensitive_Actions]
TO FILE (FILEPATH = 'E:\AuditLogs\', MAXSIZE = 1 GB);
CREATE SERVER AUDIT SPECIFICATION [Spec_Sensitive]
FOR SERVER AUDIT [Audit_Sensitive_Actions]
ADD (EXECUTE ON xp_cmdshell BY public),
ADD (EXECUTE ON sp_OACreate BY public),
ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP),
ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP),
ADD (BACKUP_RESTORE_GROUP);
ALTER SERVER AUDIT SPECIFICATION [Spec_Sensitive] WITH (STATE = ON);
ALTER SERVER AUDIT [Audit_Sensitive_Actions] WITH (STATE = ON);
`sa` + `xp_cmdshell` + `sp_OA*` = **資料庫伺服器淪陷的鐵三角**。現代防禦核心在於:**預設關閉、最小權限、零信任網路、全方位審計、自動化響應**。DBA 應定期執行配置基線掃描 (PowerShell/DSC/Ansible),確保無「為了方便臨時開啟」的高風險配置長期存活。