萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 網路安全 >  >> 駭客技術教學 >> 駭客防護

ASP 應用通用 SQL 注入防護模組設計與實作指南

威脅模型

SQL 注入源於使用者輸入未經驗證直接拼接進 SQL 語句。攻擊面涵蓋:QueryString (GET)、Form (POST)、Cookies、HTTP Headers、路徑參數、JSON/XML Body、檔案上傳中繼資料。

通用防護模組架構 (Classic ASP / VBScript)

核心邏輯

  1. 定義危險關鍵字/正則清單 (單引號、註釋、SQL 關鍵字、函數名、系統表名等)。
  2. 遍歷所有輸入集合 (Request.QueryString, Request.Form, Request.Cookies, Request.ServerVariables)。
  3. 對每個值執行大小寫不敏感匹配;命中即記錄日誌、阻斷請求 (HTTP 403/導向錯誤頁)、可選記錄攻擊者 IP/Session/UA/完整請求。
  4. 在全域包含檔 (如 conn.asp, global.asa Application_OnStart) 盡早引入,確保所有頁面受保護。

程式碼範例 (簡化版)

<%
' sql_filter.asp
Const SQL_INJ_PATTERNS = "'|;|--|/\*|\*/|@@|char|nchar|varchar|nvarchar|alter|begin|cast|create|cursor|declare|delete|drop|end|exec|execute|fetch|insert|kill|open|select|sys|table|truncate|update|xp_|sp_|waitfor|delay|shutdown|backup|restore|dbcc|grant|revoke|deny|disk|benchmark|sleep|load_file|into|outfile|dumpfile|union|or|and|xor|not|between|like|rlike|regexp|having|group by|order by|limit|offset|information_schema|sysobjects|syscolumns|systables|master|msdb|model|tempdb"
Dim arrPatterns, pattern, col, val, key
arrPatterns = Split(SQL_INJ_PATTERNS, "|")

Sub CheckCollection(colName, coll)
    For Each key In coll
        val = coll(key)
        If IsArray(val) Then
            For Each v In val : CheckValue colName, key, v : Next
        Else
            CheckValue colName, key, val
        End If
    Next
End Sub

Sub CheckValue(colName, key, val)
    If IsNull(val) Or val = "" Then Exit Sub
    For Each pattern In arrPatterns
        If InStr(1, val, pattern, vbTextCompare) > 0 Then
            ' 記錄攻擊日誌
            LogAttack colName, key, val, pattern, Request.ServerVariables("REMOTE_ADDR"), Request.ServerVariables("HTTP_USER_AGENT")
            ' 阻斷
            Response.Status = "403 Forbidden"
            Response.Write "請求包含非法字符,已被攔截。"
            Response.End
        End If
    Next
End Sub

Sub LogAttack(colName, key, val, pattern, ip, ua)
    ' 寫入資料庫/檔案/系統日誌/發送告警
    ' 範例: 寫入文字日誌
    Dim fso, f, logLine
    Set fso = Server.CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(Server.MapPath("/logs/sql_inj_" & Year(Now) & Right("0"&Month(Now),2) & ".log"), 8, True)
    logLine = Now & " | IP=" & ip & " | UA=" & ua & " | Collection=" & colName & " | Key=" & key & " | Value=" & val & " | Matched=" & pattern
    f.WriteLine logLine
    f.Close
End Sub

' 主程式入口
CheckCollection "QueryString", Request.QueryString
CheckCollection "Form", Request.Form
CheckCollection "Cookies", Request.Cookies
' ServerVariables 視需求啟用 (含大量環境變數)
%>

關鍵防禦原則 (超越關鍵字過濾)

  1. 參數化查詢 (Parameterized Queries):唯一根治方案。使用 Command 物件 + Parameter 集合,資料與程式碼徹底分離。
    Set cmd = Server.CreateObject("ADODB.Command")
    cmd.ActiveConnection = conn
    cmd.CommandText = "SELECT * FROM Users WHERE Username=?"
    cmd.Parameters.Append cmd.CreateParameter("@u", 200, 1, 50, Request.Form("username"))
    Set rs = cmd.Execute
  2. 最小權限資料庫帳號:Web 連線布號僅擁有必要資料表的 SELECT/INSERT/UPDATE/DELETE,無 DDL、無儲存程序執行權、無 xp_cmdshell。
  3. 輸入驗證白名單:對預期格式 (數字、郵件、日期、UUID、枚舉值) 使用正則嚴格驗證,拒絕不符合者。
  4. 錯誤訊息不外洩:生產環境關閉詳細錯誤 (IIS CustomErrors、ASP On Error Resume Next 統一友善提示),避免洩露表結構、連線字串、堆疊追蹤。
  5. WAF/應用防火牆:部署 ModSecurity (OWASP CRS 規則集) 或商業 WAF,針對 SQLi、XSS、LFI/RFI、命令注入等通用規則防禦,虛擬補丁應急。
  6. 資料庫審計:啟用 MSSQL Audit / Extended Events 記錄失敗登入、DDL、敏感表存取、異常查詢模式 (大量 UNION、SLEEP、BENCHMARK)。
  7. 安全開發生命週期 (SDL):威脅建模 → 安全程式碼審查 (靜態分析 SonarQube/Checkmarx/Fortify) → 滲透測試 → 上線前驗收 → 持續監控。

遷移建議

Classic ASP 已停止主流支援 (Windows Server 2003 結束延伸支援)。建議規劃遷移至 ASP.NET Core / Node.js / Python / Go / Java 等現代框架,原生支援參數化查詢、ORM、依賴注入、中介軟體管線、內建防禦機制,並享有長期安全更新。

結語

關鍵字過濾僅為「安全網」,無法替代參數化查詢這條「防火牆」。通用防護模組可作為舊系統緊急加固手段,但長期必須從架構層面根除 SQL 注入風險。

copyright © 萬盛學電腦網 all rights reserved