CSS-T | Mysql Client 任意文件读取攻击链拓展

作者:LoRexxar@知道创宇404实验室 & Dawu@知道创宇404实验室
原文地址:https://paper.seebug.org/1112/#_6
英文版本:https://paper.seebug.org/1113/

这应该是一个很早以前就爆出来的漏洞,而我见到的时候是在TCTF2018 final线下赛的比赛中,是被 Dragon Sector 和 Cykor 用来非预期h4x0r’s club这题的一个技巧。

http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/

在后来的研究中,和@Dawu的讨论中顿时觉得这应该是一个很有趣的trick,在逐渐追溯这个漏洞的过去的过程中,我渐渐发现这个问题作为mysql的一份feature存在了很多年,从13年就有人分享这个问题。

·Database Honeypot by design (2013 8月 Presentation from Yuri Goltsev)
·Rogue-MySql-Server Tool (2013年 9月 MySQL fake server to read files of connected clients)
·Abusing MySQL LOCAL INFILE to read client files (2018年4月23日)

在围绕这个漏洞的挖掘过程中,我们不断地发现新的利用方式,所以将其中大部分的发现都总结并准备了议题在CSS上分享,下面让我们来一步步分析。

Load data infile

load data infile是一个很特别的语法,熟悉注入或者经常打CTF的朋友可能会对这个语法比较熟悉,在CTF中,我们经常能遇到没办法load_file读取文件的情况,这时候唯一有可能读到文件的就是load data infile,一般我们常用的语句是这样的:

load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';

mysql server会读取服务端的/etc/passwd然后将数据按照'\n'分割插入表中,但现在这个语句同样要求你有FILE权限,以及非local加载的语句也受到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

如果我们修改一下语句,加入一个关键字local。

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

加了local之后,这个语句就成了,读取客户端的文件发送到服务端,上面那个语句执行结果如下

很显然,这个语句是不安全的,在mysql的文档里也充分说明了这一点

https://dev.mysql.com/doc/refman/8.0/en/load-data-local.html

在mysql文档中的说到,服务端可以要求客户端读取有可读权限的任何文件。

mysql认为客户端不应该连接到不可信的服务端。

我们今天的这个问题,就是围绕这个基础展开的。

构造恶意服务端

在思考明白了前面的问题之后,核心问题就成了,我们怎么构造一个恶意的mysql服务端。

在搞清楚这个问题之前,我们需要研究一下mysql正常执行链接和查询的数据包结构。

1、greeting包,服务端返回了banner,其中包含mysql的版本

2、客户端登录请求

3、然后是初始化查询,这里因为是phpmyadmin所以初始化查询比较多


4、load file local

由于我的环境在windows下,所以这里读取为C:/Windows/win.ini,语句如下

load data local infile "C:/Windows/win.ini" into table test FIELDS TERMINATED BY '\n';

首先是客户端发送查询


然后服务端返回了需要的路径

然后客户端直接把内容发送到了服务端


看起来流程非常清楚,而且客户端读取文件的路径并不是从客户端指定的,而是发送到服务端,服务端制定的。

原本的查询流程为

客户端:我要把win.ini插入test表中
服务端:我要你的win.ini内容
客户端:win.ini的内容如下....

假设服务端由我们控制,把一个正常的流程篡改成如下

客户端:我要test表中的数据
服务端:我要你的win.ini内容
客户端:win.i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值