xp_cmdshell 是 SQL Server 最具爭議的擴充預存程序,允許執行作業系統命令。本文從防禦視角解析如何移除、偵測與恢復 xp_cmdslide,並應對攻擊者常見的 xplog70.dll 刪除/改名繞過手法,屬資安人員必備知識。
-- 移除 xp_cmdshell
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id = OBJECT_ID(N'[dbo].[xp_cmdshell]')
AND OBJECTPROPERTY(id, N'IsExtendedProc') = 1)
EXEC sp_dropextendedproc N'xp_cmdshell';
-- 新增 xp_cmdshell (SQL 7.0 用 xpsql70.dll, SQL 2000 用 xplog70.dll)
EXEC sp_addextendedproc 'xp_cmdshell', 'xplog70.dll';
xp_cmdshell 回傳 SQL_ERROR → 可能已被移除。sp_addextendedproc 提示「資料庫中已存在名為 'xp_cmdshell' 的物件」 → DLL 可能被刪除/改名。EXEC sp_addextendedproc 'xp_cmdshell', 'xplog70.dll';
%ssp_addextendedproc 'xp_cmdshell','xplog70.dll'若攻擊者發現 xplog70.dll 被刪除/改名,可能嘗試:
sp_OACreate / sp_OAMethod (OLE Automation) 執行命令。| 措施 | 說明 |
|---|---|
| 永久移除 xp_cmdshell | 生產環境**必須**執行 sp_dropextendedproc | 刪除/重命名 xplog70.dll | 增加攻擊者恢復難度,但非絕對防禦 |
| 停用 OLE Automation | EXEC sp_configure 'Ole Automation Procedures', 0; RECONFIGURE; |
| 限制 SQL Agent 權限 | 服務帳號使用最低權限網域帳號,禁止 CmdExec 作業 |
| 啟用登入稽核 | 記錄失敗/成功登入,偵測暴力破解 |
| 應用層參數化查詢 | 根除 SQL Injection,切斷攻擊入口 |
深入理解 xp_cmdshell 機制與攻防對抗,能幫助 DBA 建立纵深防禦,將資料庫伺服器的攻擊面壓縮至最小。