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
可能觉的是挺鸡肋的,但是如果配合相应的环境下还是可以进行利用的!
这时候利用上面这一点,现在我们的情况就是 服务端可以任意读取客户端中的文件!
例子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服务器查看,读取成功!
案例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来访问即可生效!
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 就不能读该文件