load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
實現:Mysql Server會讀取服務端的/etc/passwd,然后將其數據按照'\n'分割插入表中,但現在這個語句同樣要求你有FILE權限
,以及非local加載的語句也受到secure_file_priv
的限制
流程的話是: 客戶端 讀取 服務端本地中的文件 到 服務端的Mysql中
缺點:要求你有FILE權限
,受到secure_file_priv
的限制!
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
相同環境下,如果使用load data local infile
,則可以進行成功讀取!
流程的話是:客戶端 讀取 客戶端本地中的文件 到 服務端中的Mysql中,但是與上面有個最大的不同點是讀取方讀取的文件是相反的!
mysql> load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
Query OK, 11 rows affected, 11 warnings (0.01 sec)
Records: 11 Deleted: 0 Skipped: 0 Warnings: 11
參考文章:https://www.lorexxar.cn/2020/01/14/css-mysql-chain/
可能覺的是挺雞肋的,但是如果配合相應的環境下還是可以進行利用的!
這時候利用上面這一點,現在我們的情況就是 服務端可以任意讀取客戶端中的文件!
例子1: Adminer的利用
受害者:192.168.1.157 ,該機器上面存在adminer數據庫工具
攻擊者:192.168.1.143
1、攻擊者打開受害者的web界面如下,發現可以進行外連操作
2、然后攻擊者進行adminer連接到自己的mysql服務器上
3、攻擊者執行LOAD DATA LOCAL INFILE 'C:\\programdata\\1.txt' INTO TABLE table;
4、攻擊者打開自己的mysql服務器查看,讀取成功!
參考文章:https://xz.aliyun.com/t/6408
案例2:Discuz x3.4
在Discuz x3.4的配置中存在這樣兩個文件
config/config_ucenter.php
config/config_global.php
1、在dz的后台,有一個Ucenter的設置功能,這個功能中提供了ucenter的數據庫服務器配置功能,通過配置數據庫鏈接惡意服務器,可以實現任意文件讀取獲取配置信息。
2、配置ucenter的訪問地址
原地址: http://localhost:8086/upload/uc_server
修改為: http://localhost:8086/upload/uc_server\');phpinfo();//
當我們獲得了authkey
之后,我們可以通過admin的uid以及鹽來計算admin的cookie。然后用admin的cookie以及UC_KEY來訪問即可生效!
更多案例參考文章:https://www.lorexxar.cn/2020/01/14/css-mysql-chain/
LOAD DATA LOCAL INFILE權限要求
最后自己還想下看下關於LOAD DATA LOCAL INFILE
是否也收到數據庫權限或者是用戶權限的限制
那么就有四種情況
1、高數據庫權限 高PHP權限 ----> 讀取成功
2、高數據庫權限 低PHP權限 ----> 讀取失敗
3、低數據庫權限 高PHP權限 ----> 讀取成功
4、低數據庫權限 低PHP權限 ----> 讀取失敗
總結:
LOAD DATA LOCAL INFILE 繼承的是 執行客戶端 用戶權限 且只能讀 mysql客戶端 本地文件
若 webshell 中如果能讀取 user.MYD 文件,LOAD DATA LOCAL INFILE 就能讀該文件
若 webshell 中如果不能讀取 user.MYD 文件,LOAD DATA LOCAL INFILE 就不能讀該文件