点击蓝字,关注我们
本文作者:flashine (团队成员)
本文字数:1200
阅读时长:10min
附件/链接:点击查看原文下载
声明:请勿用作违法用途,否则后果自负
本文属于WgpSec原创奖励计划,未经许可禁止转载
读取服务端文件
读取文件利用方式
load_file()
select
load data infile() 利用该函数读文件时需要将文件内容保存至一个表中,在方便查看结果的情况下,一般最好自己创建一个新表来保存查询的结果。
-- 创建存储结果的表
这里读文件和select
函数需要一起使用才能获取到即时的文件内容,若分两次执行将不会获取到文件内容。通过这样执行sql语句可以保证数据库的表中不会存储任何内容。
2. 防范方式
通过启用MySQL的secure_file_priv
配置即可管理,具体配置有三种:
NULL
:MySQL服务器将禁用导入和导出操作,即无法读取和写入任何文件空
:值为空代表该项配置无效目录名
:MySql服务器的导入和导出操作将被限制在配置的目录中
一般默认情况下,该配置在MySQL的默认配置如下
平台 | 默认值 |
---|---|
WIN | >=5.7.16默认值为NULL,<5.7.16则为空 |
DEB, RPM, SLES, SVR4(unix/linux) | /var/lib/mysql-files |
Otherwise(自行编译版本) | 基于CMAKE编译时手动配置参数 |
具体可参考MySQL官网说明sysvar_secure_file_priv
secure_file_priv
参数可通过执行如下sql语句查询值:
show
可通过修改my.cnf
文件修改该配置
读取客户端文件
1. 利用方式
MySQL客户端连接到一个服务器时,通过伪造一个MySQL服务器可以通过发送读文件的数据包来读取客户端的文件内容。MySQL官方认为MySQL客户端不应该连接到不受信任的服务器,所以不认为这是一个漏洞,然后从MySQL8.0.21
开始将客户端读取文件的的操作限制在一个指定的目录中。
读取文件的流程:
伪造的服务器向客户端发送
Server greeting
包客户端发送登录验证的请求
伪造的服务器响应验证成功,等待客户端发送
select
查询伪造的服务器回复给客户端一个要求读取本地文件的请求
客户端发送本地文件内容给伪造的服务器
参考官网的一个流程图:
贴一下自己写的利用源码:(查看原文获取代码)
脚本对客户端的系统类型进行了判断,在客户端连接时可自行读取对应的系统文件。
这里复现时使用的客户端版本为MariaDb10.3.23
,相当于MySQL的8.0版本。
由于这里客户端的local_file
参数默认配置为关闭,因此在复现时在客户端使用了如下配置:
一般情况下MySQL5.7及以下的版本都可以读取到文件
若未设置该参数时,读取的结果如下:
设置该参数后,读取的结果如下:
这里只通过MySQL二进制客户端进行了演示,对于其他类型的客户端(云服务、php、jdbc等)的利用分析可以参考文后链接中seebug的文章。
2. 防范方式
启用MySQL的
SSL
配置:
由于启用SSL
后MySQL的QPS
(每秒查询率)将会下降很多,可能对业务会造成比较大的影响,因此对于实际业务量不大的MySQL服务器可以考虑使用SSL。使用默认配置
local_file
关闭的客户端(升级到新版本或自行编译源码将该参数关闭)或者参考seebug文章中在代码中的修复方式进行修复。
参考链接
https://dev.mysql.com/doc/refman/8.0/en/mysql-command-options.html#option_mysql_local-infile
https://dev.mysql.com/doc/refman/8.0/en/load-data-local-security.html
https://paper.seebug.org/1112/
https://dev.mysql.com/doc/internals/en/com-query-response.html#local-infile-request
邀请码:ADD690F7ADF9FA085B6E4622DDEF99E
扫描关注公众号回复加群,和师傅们一起讨论研究~
扫码关注我们
微信号:wgpsec
Twitter:@wgpsec
分享、在看与点赞,至少我要拥有一个吧