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

SQL 注入進階防禦與繞過技術深度解析 (第二部分):繞過單引號過濾、編碼技巧與安全請求封裝

     編輯:關於SqlServer

承接入門篇,本文深入探討駭客如何繞過單引號過濾、利用大小寫混淆、URL 編碼特性、POST vs GET 差異,並提供 ASP 安全請求封裝函數 SafeRequest 徹底阻擋注入。

一、 繞過單引號過濾的核心技巧

1. ASCII/UNICODE 編碼替代字串常值

-- 原始:WHERE xtype = 'U'
-- 繞過:WHERE xtype = CHAR(85)          -- 'U' ASCII 85
-- 中文:WHERE name = NCHAR(29992)+NCHAR(25143)  -- '用戶'

SQL Server 解析 CHAR()/NCHAR() 為字元,無需單引號,繞過簡單字串替換過濾。

2. 大小寫混淆繞過關鍵字過濾

-- 過濾 'SELECT' → 嘗試 'SeLeCt'、'sElEcT'
-- 過濾 'UNION' → 'UnIoN'

若過濾邏輯未使用 CASE INSENSITIVE 比對,大小寫變體即可通過。

3. 利用註解符號截斷後續 SQL

-- 參數:id=1;-- 
-- SQL 變為:SELECT * FROM t WHERE id=1;-- ... 後續 WHERE 子句被註解

二、 實戰經驗小結

技巧說明
欄位名猜測參考網站登入表單 input name,通常與資料欄位同名
URL 編碼+ → 空格、%2B → +、%25 → %;注入 Payload 必須雙重編碼
POST 注入IIS 日誌不記錄 POST Body,隱蔽性優於 GET
Access vs SQL ServerAccess 僅能 ASCII 逐字解碼;SQL Server 可利用錯誤訊息回顯 (CAST/CONVERT 溢位) 效率高 10 倍

三、 防禦核心:ASP SafeRequest 封裝函數

取代所有 Request("param"),統一進入點過濾:

Function SafeRequest(ParaName, ParaType)
    ' ParaType: 1=數字, 0=字串
    Dim ParaValue
    ParaValue = Request(ParaName)

    If ParaType = 1 Then
        If Not IsNumeric(ParaValue) Then
            Response.Write "參數 " & ParaName & " 必須為數字!"
            Response.End
        End If
    Else
        ' 字串型:移除單引號、分號、註解符號等高風險字元
        ParaValue = Replace(ParaValue, "'", "")
        ParaValue = Replace(ParaValue, ";", "")
        ParaValue = Replace(ParaValue, "--", "")
        ParaValue = Replace(ParaValue, "/*", "")
        ParaValue = Replace(ParaValue, "*/", "")
        ' 可擴充:xp_cmdshell 關鍵字、UNION、SELECT 等
    End If

    SafeRequest = ParaValue
End Function

使用範例

' 原本:sql = "SELECT * FROM Users WHERE ID = " & Request("id")
' 修正:
Dim safeId
safeId = SafeRequest("id", 1)  ' 強制數字
sql = "SELECT * FROM Users WHERE ID = " & safeId

' 字串參數:
Dim safeName
safeName = SafeRequest("name", 0)
sql = "SELECT * FROM Users WHERE Name = '" & safeName & "'"

四、 現代化防禦:參數化查詢 (唯一根治)

SafeRequest 屬於「輸入過濾」,無法防禦所有變體 (編碼、二次注入、截斷);唯有參數化查詢從根本分離代碼與資料。

' ADO 參數化範例
Dim cmd, rs
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM Users WHERE ID = ? AND Name = ?"
cmd.Parameters.Append cmd.CreateParameter("@id", adInteger, adParamInput, , SafeRequest("id",1))
cmd.Parameters.Append cmd.CreateParameter("@name", adVarWChar, adParamInput, 50, SafeRequest("name",0))
Set rs = cmd.Execute

五、 總結檢查清單

  • [ ] 所有動態 SQL 改用參數化查詢 / 預存程序
  • [ ] 輸入驗證:型別、長度、格式、白名單
  • [ ] 錯誤訊息**不回顯給前端** (自定義錯誤頁)
  • [ ] 資料庫帳號最小權限 (僅 SELECT/EXEC 必需物件)
  • [ ] WAF/IDS 部署規則集 (OWASP ModSecurity Core Rule Set)
  • [ ] 定期代碼審查 / 掃描工具 (SQLMap, Acunetix, Fortify)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved