本文系統梳理MySQL權限體系、伺服器雙階段存取驗證邏輯、範圍欄位匹配規則,並實測展示FILE、GRANT、ALTER等高危權限的具體攻擊向量。
| 權限 | 允許操作 |
|---|---|
ALTER | ALTER TABLE(需配合其他權限) |
CREATE | 建立資料庫/表(不含索引) |
DELETE | 刪除記錄 |
DROP | 刪除資料庫/表(不含索引) |
INDEX | 建立/刪除索引 |
SELECT | 查詢資料(不涉表查詢如SELECT NOW()無需此權限) |
UPDATE | 修改記錄 |
| 權限 | 風險描述 | 管控建議 |
|---|---|---|
FILE | 讀寫伺服器主機任意可讀檔(/etc/passwd)、寫入惡意檔案 | 嚴禁授予非管理員;啟動--secure-file-priv限制目錄 |
GRANT | 權限遞移攻擊:兩帳號互相GRANT無限擴大權限 | 極少數管理帳號持有 |
PROCESS | SHOW PROCESSLIST洩露執行中SQL(含明文密碼操作) | 僅管理帳號;mysqld保留額外連線供root緊急登入 |
RELOAD | FLUSH、mysqladmin reload/refresh/flush-* | 按需授予 |
SHUTDOWN | mysqladmin shutdown關閉伺服器 | 極少數管理帳號 |
user表,匹配Host、User、Password。無匹配則拒絕連線。user表全域權限 → 足夠則執行。db表資料庫級權限 → 與全域權限**邏輯OR**合併 → 足夠則執行。tables_priv表級權限 → OR合併。columns_priv欄位級權限 → OR合併。實際執行時,伺服器啟動將授權表載入記憶體,**記憶體副本**用於驗證,直接修改授權表不生效,必須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不敏感。CREATE TABLE etc_passwd (pwd_entry TEXT); LOAD DATA INFILE '/etc/passwd' INTO TABLE etc_passwd; SELECT * FROM etc_passwd;
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 TABLE restricted_table RENAME TO allowed_table;
帳號A有GRANT、帳號B有GRANT → A對BGRANT高權限 → B對AGRANT高權限 → 雙雙成為超級用戶。
user表全域權限,改用db/tables_priv/columns_priv精準授權。mysql系統庫任何權限(等同全域GRANT)。FILE權限視同核彈,**絕不**授予非管理員。--skip-show-database隱藏無權資料庫列表。