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

SQL 注入攻擊全接觸:高級篇 (二) - 繞過限制與防禦實戰

     編輯:關於SqlServer

第二節:繼續繞過程式限制進行注入

許多開發者嘗試過濾單引號 ' 來防禦 SQL 注入,但這僅能阻擋初級攻擊。熟悉 SQL 的攻擊者可利用內建函數繞過此類過濾。

利用字元編碼函數繞過單引號過濾

  • ASCII 字元: WHERE xtype='U' 可改寫為 WHERE xtype=CHAR(85)(U 的 ASCII 碼為 85)。
  • Unicode 中文字元: WHERE name='用戶' 可改寫為 WHERE name=NCHAR(29992)+NCHAR(25143)。

同理,SQL Server 使用 CHAR()、NCHAR();Access 使用 CHR()。

第三節:實戰經驗總結與防禦對策

常見繞過技巧

  1. 大小寫混淆: 過濾器常忽略大小寫,嘗試 selecT、unIoN 等變體。
  2. 推測欄位名: 觀察前端登入表單的輸入框 name 屬性,資料庫欄位名常與之對應。
  3. URL 編碼細節: + 解析為空格,%2B 為 +,%25 為 %。善用 URLEncode 繞過過濾。
  4. 偏好 POST 注入: GET 請求參數會被 IIS 完整記錄日誌,POST 請求則不會,隱蔽性更強。
  5. Access 與 SQL Server 猜解差異: Access 僅能用 ASCII 逐字解碼;SQL Server 除此法外,更可利用報錯回顯高效提取資料。

核心防禦方案:參數化查詢 / 安全請求函數

SQL 注入根源在於「資料與代碼未分離」。最有效的防禦是使用參數化查詢(Prepared Statements)。若環境限制,可參考以下 ASP 安全封裝函數替代 Request:

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, "'", "''")
    End If
    SafeRequest = ParaValue
End Function

原理: 數值型驗證 IsNumeric;字串型將單引號轉義為兩個單引號(SQL 標準轉義方式),使輸入無法閉合 SQL 字串常數。

無論您是安全研究員、開發者或技術愛好者,理解攻擊原理才能構建堅固防線。安全與開發,本是相輔相成。

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