打過補丁的惡意 MySQL Server 可在 LOAD DATA LOCAL 過程中,要求客戶端傳輸伺服器指定的檔案(如 /etc/passwd),而非客戶端原本指定的檔案。客戶端若以高權限執行,洩露風險極大。
Web 應用連接資料庫時,實際客戶端是 Web Server 進程。若攻擊者能注入 SQL 執行 LOAD DATA LOCAL INFILE '/etc/passwd',即可讀取 Web Server 進程可讀的任意檔案。
| 版本/階段 | 預設行為 | 控制手段 |
|---|---|---|
| ≤ 3.23.48 | 無限制 | — |
| 3.23.49 / 4.0.2+ | 客戶端庫預設啟用 --enable-local-infile | 編譯時 --disable-local-infile 關閉 |
| 現代版本 (5.7/8.0) | 客戶端庫預設啟用 | 多層開關控制(見下) |
--local-infile=0,所有 LOAD DATA LOCAL 直接報錯 ERROR 1148。mysql --local-infile[=1] 啟用mysql --local-infile=0 禁用mysqlimport --local / -L 啟用mysql_options(mysql, MYSQL_OPT_LOCAL_INFILE, 0) 禁用。[client] 群組加 loose-local-infile=1(loose- 前綴防舊版報錯)。ERROR 1148: The used command is not allowed with this MySQL version
出現此錯誤表示 Server 或 Client 端已禁用 LOCAL,需檢查上述四層開關。
local_infile=OFF(MySQL 8.0 系統變數)。mysql_options(..., MYSQL_OPT_LOCAL_INFILE, 0)。LOAD DATA INFILE(Server 端檔案)或應用層讀取後改用 INSERT 批次寫入。