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

SQL 注入深度剖析:查詢結果集差異的三類錯誤利用與 UNION 攻擊實戰

     編輯:關於SqlServer

前言

SQL 注入核心在於「構造輸入導致查詢結果集發生預期差異,進而引發應用層邏輯分支偏移或錯誤訊息洩露」。本文從結果集角度系統剖析邏輯錯誤、語法錯誤、執行錯誤三大類型利用原理,並實戰示範繞過登入、UNION 注入、盲注技術。

一、 三大錯誤類型與結果集表現

1. 邏輯錯誤

機制: `WHERE` 條件真假改變結果集基數。
`id=1 AND 1=2` → 結果集為空 (0 行) → 應用取值失敗/跳轉/顯示空白。
`id=1 OR 1=1` → 結果集暴增 (全表) → 應用若 `FETCH FIRST` → 取到非預期第一行 → 頁面內容異常 (如標題變成其他文章)。
Oracle/PostgreSQL 特徵: 空結果集常在頁面顯示字面 `NULL` 字串。

2. 語法錯誤

機制: 構造非法 SQL 觸發資料庫拋錯。
若應用未屏蔽錯誤 → 錯誤訊息 (含表名、欄位、資料片段) 直接回顯頁面 (Error-based Injection)。
若應用捕獲異常並繼續執行 → 結果集為「不存在」 (連 NULL 都不是) → 應用視同空結果集處理。
利用: `CAST((SELECT name FROM sysobjects WHERE xtype='U') AS INT)` 強制型別轉換失敗,錯誤訊息攜帶首個使用者表名。

3. 執行錯誤

機制: 利用耗時函數導致執行緒阻塞。
MySQL: `BENCHMARK(1000000, MD5('x'))`。
SQL Server: `WAITFOR DELAY '0:0:5'`。
頁面回應延遲 → 推斷條件真假 (Time-based Blind Injection)。
物理路徑洩露: 某些版本超時錯誤堆疊包含絕對路徑。

4. 邏輯 + 語法結合 (型別衝突盲注)

利用條件函數返回不同型別:
`IFF(1=1, 1, 'no')` → 數字 `1`。
`IFF(1=2, 1, 'no')` → 字串 `'no'`。
`id=1 AND 1=IFF(1=1,1,'no')` → 數字=數字 **成功**。
`id=1 AND 1=IFF(1=2,1,'no')` → 數字=字串 **語法/型別錯誤**。
透過「正常/報錯」二元特徵逐位提取資料。適用支援 `IFF/CASE/DECODE/IF` 的資料庫。

二、 結果集利用實戰:從繞過登入到 UNION 攻擊

1. 經典登入繞過 (舊式驗證)

$sql = "SELECT TOP 1 * FROM admin WHERE username='$u' AND password=MD5('$p')";
-- 輸入: ' OR '1'='1
-- 結果: SELECT TOP 1 * FROM admin WHERE username='' OR '1'='1' AND ...
-- 結果集非空 (第一行管理員) → 驗證通過

2. 新式驗證繞過 (先查用戶再比對密碼)

$sql = "SELECT TOP 1 * FROM admin WHERE username='$u'";
-- 應用層: 取結果集 password 欄位與用戶輸入 MD5 比對
-- 攻擊: ' UNION SELECT 'admin', MD5('123456'), 1 --
-- 結果集: 偽造 admin 記錄,密碼欄位為已知雜湊 → 驗證通過並繼承 admin 權限

3. 嚴格型別資料庫 (SQL Server 2000 / Sybase)

UNION 要求欄位數、型別、順序**嚴格匹配**。盲注需精確構造對應型別常數 (如 `CAST(NULL AS INT)`)。

4. 經典案例:eWebEditor 上傳漏洞

利用編輯器參數注入 `UNION SELECT ...` 寫入 Webshell,本質是構造期望結果集欺騙應用層執行寫入邏輯。

三、 防禦體系建設

  1. 參數化查詢 / 預存程序 (核心:代碼與資料分離)。
  2. 最小權限帳號 (無 DDL/DCL/FILE/ADMIN)。
  3. 錯誤訊息不回顯 (自定義錯誤頁、記錄日誌)。
  4. WAF 規則 攔截 `UNION SELECT`、`WAITFOR`、`BENCHMARK`、`CAST`、`IFF` 等特徵模式。
  5. 定期滲透測試與代碼審計。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved