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

ASP 通用 SQL 注入防禦模組編寫實戰:從黑名單到參數化的演進

     編輯:關於SqlServer

早期 ASP 開發常用「通用防注入 Include 文件」遍歷 Request.QueryString/Form 黑名單關鍵字(and、select 等)攔截攻擊。但此方案存在誤傷正常業務、繞過手段多樣(編碼、大小寫、註釋)、漏檢 Cookies/ServerVariables等缺陷。本文剖析黑名單局限,給出參數化查詢、白名單驗證、WAF 三層防禦體系。

典型黑名單攔截代碼(教學勿用)

<%
Dim sql_injdata, SQL_inj, SQL_Get, SQL_Data
sql_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
SQL_inj = Split(sql_injdata, "|")

' GET 攔截
If Request.QueryString <> "" Then
    For Each SQL_Get In Request.QueryString
        For SQL_Data = 0 To UBound(SQL_inj)
            If InStr(Request.QueryString(SQL_Get), SQL_inj(SQL_Data)) > 0 Then
                Response.Write ""
                Response.End
            End If
        Next
    Next
End If

' POST 攔截
If Request.Form <> "" Then
    For Each SQL_Post In Request.Form
        For SQL_Data = 0 To UBound(SQL_inj)
            If InStr(Request.Form(SQL_Post), SQL_inj(SQL_Data)) > 0 Then
                Response.Write ""
                Response.End
            End If
        Next
    Next
End If
%>

黑名單方案的四大死穴

死穴說明繞過示例
誤傷業務合法字符串含關鍵字(如用戶名 "Anderson"、產品 "SelectPlus")被攔截—
大小寫/編碼繞過ASP 不區分大小寫,但攻擊者可用 URL 編碼(%27)、Unicode、十六進制、註釋(/**/)混淆id=1%20or%201=1 / id=1/**/OR/**/1=1
集合覆蓋不全僅檢查 QueryString/Form,漏掉 Cookies、ServerVariables、ClientCertificateCookie 注入:id=1 OR 1=1
語義繞過等價改寫:UNION SELECT → UNION ALL SELECT、WHERE 1=1 → WHERE 2>1—

現代防禦三層體系

第一層:參數化查詢(核心,消除注入根源)

<%
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM Users WHERE UserName = ? AND Pwd = ?"
cmd.CommandType = 1 ' adCmdText
cmd.Parameters.Append cmd.CreateParameter("@UserName", 200, 1, 50, Request.Form("username")) ' adVarChar, adParamInput
cmd.Parameters.Append cmd.CreateParameter("@Pwd", 200, 1, 50, Request.Form("password"))
Set rs = cmd.Execute
%>

參數化將數據視為字面值,絕不參與 SQL 解析,徹底杜絕注入。

第二層:輸入白名單驗證(業務層攔截)

  • 整數:If Not IsNumeric(id) Then Exit / id = CLng(id)。
  • 字符串:定義允許字符集正則,如 ^[a-zA-Z0-9_\u4e00-\u9fa5]{1,50}$。
  • 枚舉值:If status Not In (0,1,2) Then Exit。
  • 長度限制:If Len(name) > 50 Then Exit。

第三層:WAF / 容器級防護(纵深防御)

  • IIS URL Rewrite 規則攔截明顯攻擊特徵(union.*select, script> 等)。
  • 雲 WAF(阿里云/騰訊云/Cloudflare)托管規則集自動更新。
  • 資料庫審計/防火牆(如 SQL Server Audit、FortiDB)監控異常執行計畫。

遺留系統快速修補清單

  1. 全站搜尋動態拼接 SQL("SELECT * FROM " & table & " WHERE id=" & id),逐個改造為參數化。
  2. 若暫時無法重構,至少在公共 Include 中遍歷 所有六大 Request 集合,並升級為正則語義檢測(而非簡單關鍵字匹配)。
  3. 資料庫連接帳號最小權限:僅 SELECT/INSERT/UPDATE/DELETE,禁止 xp_cmdshell、OPENROWSET、bulkadmin 等高危權限。
  4. 錯誤頁面不回顯 SQL 詳情,統一友好提示,日誌記錄詳情供排查。

總結

黑名單是「治標不治本」的權宜之計,參數化查詢才是「釜底抽薪」的根治方案。新專案強制參數化,舊專案分批重構,配合白名單驗證與 WAF,構建纵深防御體系。

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