mysql 8.0 自定义函数_MySQL之文件读取

点击蓝字,关注我们

本文作者:flashine (团队成员)
本文字数:1200

阅读时长:10min

附件/链接:点击查看原文下载

声明:请勿用作违法用途,否则后果自负

本文属于WgpSec原创奖励计划,未经许可禁止转载

读取服务端文件

读取文件利用方式

  1. load_file()

select 

10e9000c99d77ec0e8f85c24051c7337.png

  1. load data infile() 利用该函数读文件时需要将文件内容保存至一个表中,在方便查看结果的情况下,一般最好自己创建一个新表来保存查询的结果。

-- 创建存储结果的表

这里读文件和select函数需要一起使用才能获取到即时的文件内容,若分两次执行将不会获取到文件内容。通过这样执行sql语句可以保证数据库的表中不会存储任何内容。

5973e946fc48816c54632c825dc86342.png

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文件修改该配置6ceaf7895212432a1fb3ba6fcb2326b5.png

读取客户端文件

1. 利用方式

MySQL客户端连接到一个服务器时,通过伪造一个MySQL服务器可以通过发送读文件的数据包来读取客户端的文件内容。MySQL官方认为MySQL客户端不应该连接到不受信任的服务器,所以不认为这是一个漏洞,然后从MySQL8.0.21开始将客户端读取文件的的操作限制在一个指定的目录中。

读取文件的流程:

  1. 伪造的服务器向客户端发送Server greeting

  2. 客户端发送登录验证的请求

  3. 伪造的服务器响应验证成功,等待客户端发送select查询

  4. 伪造的服务器回复给客户端一个要求读取本地文件的请求

  5. 客户端发送本地文件内容给伪造的服务器

参考官网的一个流程图:34a12dd16253c1243ac85a7293b9aaf7.png

贴一下自己写的利用源码:(查看原文获取代码)

636c339a930139c9defe5175f7e07d87.png

9564aeabe5d2f4d81965b46afa3e3f09.png

0aa5284e09b39ce91503b6e129d8ac67.png

脚本对客户端的系统类型进行了判断,在客户端连接时可自行读取对应的系统文件。

这里复现时使用的客户端版本为MariaDb10.3.23,相当于MySQL的8.0版本。
由于这里客户端的local_file参数默认配置为关闭,因此在复现时在客户端使用了如下配置:

82b6b853bfc162932fb1fbe549781b33.png

一般情况下MySQL5.7及以下的版本都可以读取到文件

若未设置该参数时,读取的结果如下:

8a40cbda73ac0cf0ffe9cdc7b6647abd.png

设置该参数后,读取的结果如下:

4d27b513645691e966a052854ef1dd6c.png

这里只通过MySQL二进制客户端进行了演示,对于其他类型的客户端(云服务、php、jdbc等)的利用分析可以参考文后链接中seebug的文章。

2. 防范方式

  1. 启用MySQL的SSL配置:
    由于启用SSL后MySQL的QPS(每秒查询率)将会下降很多,可能对业务会造成比较大的影响,因此对于实际业务量不大的MySQL服务器可以考虑使用SSL。

  2. 使用默认配置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

扫描关注公众号回复加群,和师傅们一起讨论研究~

扫码关注我们

e1e1d31d43eae44ae43b27700192d058.png

微信号:wgpsec

Twitter:@wgpsec

211730788dad6b5e5ef1fd980c9987ae.gif

分享、在看与点赞,至少我要拥有一个吧

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值