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

MSSQL 通用防注入程序漏洞分析:過濾邏輯缺陷與繞過實戰

     編輯:關於SqlServer

程序背景

經典 ASP 時代通用防注入代碼(WrSky_Sql.Asp),通過在 conn.asp 引入實現全站 GET/POST 參數過濾,黑名單包含:' ; and exec insert select delete update count * % chr mid master truncate char declare。

核心漏洞點

1. 黑名單機制天然不全

  • 僅過濾已知關鍵字,無法防禦編碼繞過(URL 編碼、Unicode、十六進制、大小寫變形)。
  • 無法防禦二階注入:數據入庫時無惡意字符,二次查詢拼接時觸發。
  • 無法防禦寬字節注入(GBK 多字節字符吃掉單引號)。

2. 過濾範圍過度導致業務誤傷

  • 論壇發帖含 select、update、% 等詞即被攔截,正常業務不可用。
  • 迫使開發者為特定頁面單獨連接無過濾連接字符串(conn1.asp),產生繞過防護的正規通道,攻擊者可針對性攻擊該類頁面。

3. 日志記錄功能引入新風險

  • 攻擊日志寫入 Access MDB (SqlIn.mdb):
    Fy_db.Execute("insert into SqlIn(SQLStr, IP, ...) values ('" & attack_str & "', '" & Request.ServerVariables("REMOTE_ADDR") & "', ...)"
  • 二次注入:攻擊者構造包含單引號的 Payload,日志寫入時拼接 SQL 導致注入,進而控制日志庫、讀取敏感信息。
  • 信息洩露:日志記錄完整攻擊向量(含參數值),若日志頁面無權限控制,內部人員可獲取攻擊細節甚至敏感業務數據。

4. 依賴 Instr(LCase(...)) 簡單匹配

  • 不解析 SQL 語法上下文,username=admin'-- 中的 -- 不在黑名單,繞過過濾。
  • char(39)、0x27 等編碼形式繞過單引號過濾。

繞過演示 Payload(教學用途)

繞過技術Payload 示例原理
大小寫混淆SeLeCtLCase 會轉小寫,但黑名單若未全小寫則漏檢
URL 編碼%27%20or%201%3d1--ASP Request 自動解碼,但過濾在解碼前/後不一致可繞過
十六進制0x73656c656374 (select)字符串字面量不含關鍵字,執行時隱式轉換
註釋截斷admin'---- 不在黑名單,截斷後續 SQL
寬字節%df%27 (GBK)%df 與後續 %27 組成雙字節字符,單引號被「吃掉」

修復與防禦建議

  1. 棄用黑名單過濾,改用參數化查詢(Command.Parameters / sp_executesql)作為唯一防線。
  2. 輸入驗證採用白名單:長度、格式、類型、範圍校驗(正則/TryParse)。
  3. 最小權限原則:應用連接賬號僅擁有必要表的 SELECT/INSERT/UPDATE/DELETE,無 DDL/系統表權限。
  4. 錯誤信息不回顯前端,統一記錄安全日志(寫入參數化的日志表)。
  5. 部署 WAF(Web 應用防火牆)作為邊界防禦,規則庫定期更新。
  6. 定期代碼審計/滲透測試,專項檢查 SQL 拼接點。

歷史教訓總結

「通用防注入」類組件在 ASP/早期 ASP.NET 時代廣泛使用,但黑名單+字符串匹配架構在現代攻擊面前形同虛設。現代開發應從框架層面強制參數化(如 Entity Framework、Dapper、MyBatis 等 ORM 默認參數化),從源頭消除拼接 SQL 的可能性。

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