MySQL LOAD DATA INFILE 使用者權限設置
我知道使用者必須具有
FILE
權限*.*
才能使用LOAD DATA INFILE
命令而不使用LOCAL
- 它通過客戶端發送文件數據 - 但是當授予 MySQL 使用者權限時,如何限制使用者可以從中載入數據的目錄GRANT
(FILE
類似於secure_file_priv
,但特定於使用者)?這方面的最佳做法是什麼?簡單地強制使用者使用
LOCAL
關鍵字並犧牲一點性能來保證安全,或者授予FILE
數據庫使用者特權?
我首先要說的是,這
FILE
是迄今為止您可以授予應用程序的最危險的特權。FILE
比GRANT
因為在 mysql 的 sql 注入中您不能堆疊查詢要危險得多,因此您不能將 aSELECT
轉換為GRANT
語句,並且該權限對於 sql 注入完全沒有用。相比之下,漏洞通常使用FILE
特權來上傳後門。例如這裡是一個使用 sql 注入的例子
into outfile
select name from user where id=1 union select "<?php eval($_GET[e])?>" into outfile "/var/www/backdoor.php"
如果您在 Ubuntu 系統上嘗試此查詢,它將失敗。這是因為 AppArmor 拒絕 MySQL 對 /var/www/ 的寫訪問。您可以修改 AppArmor 的規則以拒絕對您選擇的任何文件夾的讀/寫訪問。AppArmor 的配置非常簡單,您可以在此處對其進行修改:
/etc/apparmor.d/usr.sbin.mysqld
.如果您使用的發行版不支持 AppArmor,您仍然可以使用內置的 Linux 文件權限,請記住,這些文件 io 函式將由執行 MySQL 的使用者帳戶執行。
chown user -R /some/dir && chmod 700 -R /some/dir
.