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

MySQL安全性指南(二):權限分類、存取驗證流程與高危權限風險實測

     編輯:MySQL 資料庫相關知識

本文系統梳理MySQL權限體系、伺服器雙階段存取驗證邏輯、範圍欄位匹配規則,並實測展示FILE、GRANT、ALTER等高危權限的具體攻擊向量。

權限完整分類表

資料庫/表級權限

權限允許操作
ALTERALTER TABLE(需配合其他權限)
CREATE建立資料庫/表(不含索引)
DELETE刪除記錄
DROP刪除資料庫/表(不含索引)
INDEX建立/刪除索引
SELECT查詢資料(不涉表查詢如SELECT NOW()無需此權限)
UPDATE修改記錄

管理權限(極度敏感)

權限風險描述管控建議
FILE讀寫伺服器主機任意可讀檔(/etc/passwd)、寫入惡意檔案嚴禁授予非管理員;啟動--secure-file-priv限制目錄
GRANT權限遞移攻擊:兩帳號互相GRANT無限擴大權限極少數管理帳號持有
PROCESSSHOW PROCESSLIST洩露執行中SQL(含明文密碼操作)僅管理帳號;mysqld保留額外連線供root緊急登入
RELOADFLUSH、mysqladmin reload/refresh/flush-*按需授予
SHUTDOWNmysqladmin shutdown關閉伺服器極少數管理帳號

雙階段存取驗證流程

  1. 第一階段:連線驗證 —— 檢查user表,匹配Host、User、Password。無匹配則拒絕連線。
  2. 第二階段:查詢授權 —— 每條查詢依序檢查:
    1. user表全域權限 → 足夠則執行。
    2. db表資料庫級權限 → 與全域權限**邏輯OR**合併 → 足夠則執行。
    3. tables_priv表級權限 → OR合併。
    4. columns_priv欄位級權限 → OR合併。
    5. 四表檢查完仍不足 → 拒絕執行。

實際執行時,伺服器啟動將授權表載入記憶體,**記憶體副本**用於驗證,直接修改授權表不生效,必須FLUSH PRIVILEGES重載。

範圍欄位匹配規則

  • Host:支援主機名、IP、萬用字元%/_、CIDR192.168.128.0/17(3.23+)。localhost僅匹配localhost連線,不匹配真實主機名。
  • User:空值匹配任意用戶(匿名用戶),%僅匹配字面%用戶名。
  • Password:加密儲存,**手動操作必須用PASSWORD()**;空密碼意味「不提供密碼」而非「任意密碼」。
  • Db:db/host表支援萬用字元,tables_priv/columns_priv僅字面值。
  • 大小寫敏感性:Host不敏感,User/Password/Db/Table_name敏感,Column_name不敏感。

高危權限實測攻擊向量

FILE權限竊取系統密碼檔

CREATE TABLE etc_passwd (pwd_entry TEXT);
LOAD DATA INFILE '/etc/passwd' INTO TABLE etc_passwd;
SELECT * FROM etc_passwd;

FILE權限竊取他庫表結構與資料

CREATE TABLE tmp (b LONGBLOB);
LOAD DATA INFILE './other_db/x.frm' INTO TABLE tmp ...;
SELECT * FROM tmp INTO OUTFILE 'y.frm' ...;
-- 重複對應.ISD/.ISM檔案,即可完整複製他庫表

ALTER權限繞過表級限制

ALTER TABLE restricted_table RENAME TO allowed_table;

GRANT權限互相提權

帳號A有GRANT、帳號B有GRANT → A對BGRANT高權限 → B對AGRANT高權限 → 雙雙成為超級用戶。

防禦總則

  • 吝嗇授予user表全域權限,改用db/tables_priv/columns_priv精準授權。
  • 嚴禁授予mysql系統庫任何權限(等同全域GRANT)。
  • FILE權限視同核彈,**絕不**授予非管理員。
  • 資料目錄權限鎖定為僅MySQL服務帳號可讀寫(參考指南第一部)。
  • 啟動--skip-show-database隱藏無權資料庫列表。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved