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

SQL 注入攻擊入門完全指南:原理、判斷技巧與資料庫類型辨識

     編輯:關於SqlServer

前言

B/S 架構普及降低開發門檻,但也導致大量程式缺乏輸入驗證,成為 SQL 注入溫床。注入攻擊走標準 HTTP 埠 (80/443),防火牆難以攔截;若無 IIS 日誌審計習慣,入侵可潛伏極久。本文以 ASP + Access/SQL Server 為主流環境,系統說明注入原理、漏洞判斷、資料庫辨識與基礎利用技巧。

準備工作:關閉 IE 友善錯誤訊息

工具 → 網際網路選項 → 進階 → 取消勾選「顯示友善 HTTP 錯誤訊息」,否則伺服器詳細錯誤將被 IE 遮蔽為通用 500 錯誤,無法獲取注入線索。

一、SQL 注入原理

應用程式未過濾用戶輸入,直接拼接至 SQL 陳述式。攻擊者提交精心構造的惡意代碼,改變原本查詢邏輯,竊取、竄改或刪除資料。

實例: `https://www.19cn.com/showdetail.ASP?id=49` 後加單引號 `'` → 伺服器回傳:

Microsoft JET Database Engine 錯誤 '80040e14'
字串語法錯誤 在查詢運算式 'ID=49'' 中。
/showdetail.ASP,行 8

推斷:

  1. 使用 Access + JET Engine (非 ODBC)。
  2. 程式未驗證輸入合法性。
  3. 查詢欄位名為 `ID`。

二、判斷是否存在注入漏洞

單引號測試的盲點

  • 伺服器可能關閉詳細錯誤回傳,或程式使用 `CInt()` 強制轉型,單引號同樣報錯但非注入點。
  • 開發者常過濾單引號,單引號測試易產生假陰性。

經典 1=1 / 1=2 邏輯判斷法 (數值型參數)

請求預期回應判斷
`id=49`正常顯示基準
`id=49 AND 1=1`正常顯示,內容與基準相同✅ 可能注入
`id=49 AND 1=2`BOF/EOF、找不到記錄、空白頁 (視錯誤處理而定)✅ 確認注入

原理:`AND 1=1` 恆真不影響結果集;`AND 1=2` 恆假導致結果集為空。若應用程式未參數化,此差異直接揭露注入點。

字串型參數判斷

id=test' AND '1'='1  -- 正常
id=test' AND '1'='2  -- 異常/空白

三、辨識後端資料庫類型

Access 與 SQL Server 佔國內網站 99% 以上,功能差異大,注入語法截然不同,必須先辨識。

方法 1:利用 SQL Server 系統變數轉型錯誤回顯 (需 IIS 開啟詳細錯誤)

id=49 AND USER>0

`USER` 為 `nvarchar`,與 `INT 0` 比較觸發轉型錯誤,錯誤訊息直接洩露當前登入用戶名 (如 `dbo` 代表 `sa` 權限)。

方法 2:系統表存取差異 (適用錯誤頁面被隱藏情境)

測試語句SQL Server 回應Access 回應
`AND (SELECT COUNT(*) FROM sysobjects)>0`頁面正常 (表存在)頁面異常/空白 (表不存在)
`AND (SELECT COUNT(*) FROM msysobjects)>0`頁面異常 (表不存在)通常異常 (Web 環境無權限讀取)

以第一條語句為主判斷,第二條為驗證。

四、Access 資料庫注入基礎

  • Access 無系統變數回顯技巧,主要採用 `ASCII` 逐字解碼法猜解資料。
  • 利用 `IIF`、`MID`、`ASC` 函數配合 `AND`/`OR` 布林盲注。
  • 範例:`id=49 AND (ASC(MID((SELECT TOP 1 name FROM msysobjects),1,1))>100)`

五、防禦建議 (開發者必讀)

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
  • 所有輸入統一經 `SafeRequest` 取得。
  • 數值型強制 `IsNumeric` 驗證;字串型雙倍單引號。
  • 最佳實務:全面採用參數化查詢 (Command 物件 Parameters 集合),徹底消除注入風險。

總結

SQL 注入核心在於「未驗證輸入直接拼接 SQL」。掌握 `1=1/1=2` 邏輯判斷、資料庫類型辨識、系統表資訊收集,是滲透測試的基礎功夫。開發端唯一正解:參數化查詢 + 最小權限資料庫帳號 + 錯誤訊息不回顯給用戶端。

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