本文系統梳理 MySQL 權限分類(數據庫/表級、管理級)、服務端雙階段訪問控制邏輯、範圍列匹配規則、授權表組合邏輯,並重點剖析 FILE、GRANT、ALTER、SHUTDOWN 等高危權限的攻擊場景與防範措施。
| 分類 | 權限 | 說明 | 存儲表 |
|---|---|---|---|
| 數據庫/表級 | SELECT | 查詢表數據 | user/db/tables_priv/columns_priv |
| INSERT | 插入記錄 | ||
| UPDATE | 修改記錄 | ||
| DELETE | 刪除記錄 | ||
| CREATE | 創建庫/表 | ||
| DROP | 刪除庫/表 | ||
| INDEX | 創建/刪除索引 | ||
| 管理級 | FILE | 讀寫服務端文件(極高危) | user |
| GRANT | 授予自身權限給他人 | user | |
| PROCESS | 查看/殺死所有線程 | user | |
| RELOAD | 執行 FLUSH、刷新日志/權限 | user | |
| SHUTDOWN | 關閉服務器 | user | |
| SUPER (舊版無) | 高級管理操作 | user |
user/db/host 表採用 ENUM('N','Y') 列存儲;tables_priv/columns_priv 採用 SET 類型單列組合存儲。
user 表 Host、User、Password,失敗即拒絕。user 表全局權限 → 足夠則執行db 表資料庫級權限 + host 表(AND 邏輯) → 足夠則執行tables_priv 表級權限columns_priv 列級權限邏輯表達式:user OR (db AND host) OR tables_priv OR columns_priv。服務啟動時將授權表載入內存,修改後必須 FLUSH PRIVILEGES 或 mysqladmin reload 生效。
Host:支援主機名、IP、通配符 % _、CIDR(3.23+)。localhost 僅匹配 Unix socket 連接。User:空值匹配任意用戶(匿名),% 為字面值。Password:空值表示無需密碼,存儲加密值,手動操作必須用 PASSWORD()。Db:db/host 表支援通配符,tables_priv/columns_priv 僅字面值。User、Password、Db、Table_name、Column_name 敏感;Host 不敏感。排序原則:Host 具體度優先(字面值 > 通配符),同 Host 下 User 具體度優先。最具體記錄優先匹配。
-- 竊取 /etc/passwd
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' ...;
防範:嚴格限制數據目錄權限(chmod 700),啟動參數 --skip-show-database 隱藏無權庫。
兩個擁有 GRANT 的用戶可互相提升權限,最終達到超級用戶級別。原則:極少授予,僅限 DBA。
ALTER TABLE t2 RENAME t1 可繞過表級授權訪問受保護表。防範:不授予非 DBA 的 ALTER。
分別導致服務拒絕、洩露敏感查詢文本(含明文密碼)、配置篡改。原則:按需最小授予,審計所有管理操作。
user 表全局權限,優先使用 db、tables_priv、columns_priv 限定範圍。mysql 系統庫任何權限(等同全局 GRANT)。FLUSH PRIVILEGES 後的實時生效狀態。--secure-auth 拒絕預 4.1 協議客戶端。