早期 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、ClientCertificate | Cookie 注入: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。union.*select, script> 等)。"SELECT * FROM " & table & " WHERE id=" & id),逐個改造為參數化。SELECT/INSERT/UPDATE/DELETE,禁止 xp_cmdshell、OPENROWSET、bulkadmin 等高危權限。黑名單是「治標不治本」的權宜之計,參數化查詢才是「釜底抽薪」的根治方案。新專案強制參數化,舊專案分批重構,配合白名單驗證與 WAF,構建纵深防御體系。