首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL INTO OUTFILE vs INTO DUMPFILE 深度對比:導出文本 vs 二進制的關鍵差異

     編輯:MySQL 綜合教學

核心結論先行

特性INTO OUTFILEINTO 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 行數據丟失!

為什麼二進制文件必須用 DUMPFILE?

假設要將編譯好的 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 載入

安全風險預警:DUMPFILE 是滲透測試/攻擊常用向量

攻擊鏈:

  1. 獲取 MySQL root 權限(弱口令、提權、注入)。
  2. 查詢 SHOW VARIABLES LIKE 'plugin_dir' 獲取插件目錄。
  3. SELECT UNHEX(<udf_hex>) INTO DUMPFILE '<plugin_dir>/evil.dll' 寫入惡意 UDF。
  4. CREATE FUNCTION sys_exec RETURNS STRING SONAME 'evil.dll' 註冊系統命令執行函數。
  5. 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 進程寫入。
  • 啟用審計日誌(MariaDB Audit Plugin / MySQL Enterprise Audit),記錄所有 INTO OUTFILE/DUMPFILE 操作。

獲取 UDF 十六進制字符串的方法

-- 本地環境讀取已有 UDF 文件並輸出 HEX
SELECT HEX(LOAD_FILE('c:/windows/temp/udf.dll')) INTO OUTFILE 'c:/windows/temp/udf_hex.txt';

打開 udf_hex.txt 即為完整十六進制字符串,可直接用於上述 UNHEX() 注入。

查看 UDF 內置函數名

  • 用 C32 / HxD 等十六進制編輯器打開 .dll/.so,搜索導出函數名(如 sys_exec、sys_eval)。
  • 或用 strings udf.dll | grep -i sys 快速提取。

結語

INTO OUTFILE 是「文本導出器」,INTO DUMPFILE 是「二進制寫入器」。兩者**行數處理、轉義策略、用途場景截然不同**,混用會導致數據損壞或安全災難。運維同學務必牢記:導庫備份用 OUTFILE,寫二進制文件用 DUMPFILE,且嚴防 FILE 權限濫用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved