經典 ASP 時代通用防注入代碼(WrSky_Sql.Asp),通過在 conn.asp 引入實現全站 GET/POST 參數過濾,黑名單包含:' ; and exec insert select delete update count * % chr mid master truncate char declare。
select、update、% 等詞即被攔截,正常業務不可用。conn1.asp),產生繞過防護的正規通道,攻擊者可針對性攻擊該類頁面。SqlIn.mdb):Fy_db.Execute("insert into SqlIn(SQLStr, IP, ...) values ('" & attack_str & "', '" & Request.ServerVariables("REMOTE_ADDR") & "', ...)"Instr(LCase(...)) 簡單匹配username=admin'-- 中的 -- 不在黑名單,繞過過濾。char(39)、0x27 等編碼形式繞過單引號過濾。| 繞過技術 | Payload 示例 | 原理 |
|---|---|---|
| 大小寫混淆 | SeLeCt | LCase 會轉小寫,但黑名單若未全小寫則漏檢 |
| URL 編碼 | %27%20or%201%3d1-- | ASP Request 自動解碼,但過濾在解碼前/後不一致可繞過 |
| 十六進制 | 0x73656c656374 (select) | 字符串字面量不含關鍵字,執行時隱式轉換 |
| 註釋截斷 | admin'-- | -- 不在黑名單,截斷後續 SQL |
| 寬字節 | %df%27 (GBK) | %df 與後續 %27 組成雙字節字符,單引號被「吃掉」 |
Command.Parameters / sp_executesql)作為唯一防線。「通用防注入」類組件在 ASP/早期 ASP.NET 時代廣泛使用,但黑名單+字符串匹配架構在現代攻擊面前形同虛設。現代開發應從框架層面強制參數化(如 Entity Framework、Dapper、MyBatis 等 ORM 默認參數化),從源頭消除拼接 SQL 的可能性。