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

MSSQL系統表注入風險分析與防禦體系構建

     編輯:關於SqlServer

SQL注入攻擊利用應用程序輸入驗證缺陷,結合 UNION 查詢與系統表(sysobjects、syscolumns)可枚舉數據庫結構、竊取敏感數據。本文從攻擊原理出發,構建分層防禦體系,嚴禁用於非授權測試環境。

攻擊鏈路剖析(僅供防禦理解)

  1. 判斷字段數:ORDER BY N + UNION SELECT 1,2,...N FROM sysobjects
  2. 獲取版本/庫名:UNION SELECT 1,@@VERSION,DB_NAME(),...
  3. 枚舉用戶表:SELECT TOP 1 NAME FROM sysobjects WHERE xtype='U' AND NAME NOT IN (SELECT TOP 0 NAME...) 遞增 TOP N 遍歷。
  4. 枚舉列名:SELECT TOP 1 NAME FROM syscolumns WHERE ID IN (SELECT ID FROM sysobjects WHERE NAME='target_table')...
  5. 提取數據:UNION SELECT TOP 1 1, username, password FROM admin...

前提條件:注入點有效、無單引號過濾、具備DBO權限。

分層防禦策略

1. 代碼層:參數化查詢(核心)

-- 錯誤示範 (拼接)
sql = "SELECT * FROM users WHERE id=" & Request("id")

-- 正確示範 (參數化)
cmd.CommandText = "SELECT * FROM users WHERE id=@id"
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, , Request("id"))

原理:數據與代碼分離,徹底消除注入可能。

2. 數據庫層:最小權限原則

  • 應用賬號僅授予 SELECT/INSERT/UPDATE/DELETE 業務必需權限。
  • 禁止 授予 sysadmin、db_owner 或訪問系統表(sysobjects/syscolumns)的權限。
  • 禁用/移除擴展存儲過程:xp_cmdshell, xp_regread, xp_dirtree 等。

3. 應用層:輸入驗證與WAF

  • 嚴格白名單驗證:數字型參數必須通過 ISNUMERIC() 或正則 ^\d+$。
  • 部署WAF(如ModSecurity)攔截含 UNION SELECT、sysobjects、xp_ 等特征的惡意請求。
  • 錯誤信息不回顯:生產環境關閉詳細錯誤頁面,記錄日誌供審計。

4. 審計與監控

  • 啟用SQL Server審核:記錄失敗登錄、權限變更、敏感對象訪問。
  • 部署數據庫活動監控(DAM)工具,實時告警異常查詢模式(大量 UNION、系統表訪問)。

應急響應清單

  1. 發現注入:立即封禁攻擊源IP,下線受影響應用。
  2. 範圍評估:檢查日誌確定數據洩露範圍(是否訪問 sysobjects、導出數據)。
  3. 修復代碼:全站排查動態拼接SQL,全部改為參數化。
  4. 輪換憑證:如管理員表被讀取,強制重置所有賬號密碼。
  5. 合規報告:按法規要求(如GDPR、個信法)上報監管機構。

總結

系統表注入的根因是「拼接SQL」與「過高權限」。參數化查詢+最小權限賬號可阻斷99%以上注入風險。安全是體系工程,需代碼、數據庫、網絡、運維多層疊加,定期滲透測試驗證防禦有效性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved