freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

JDBC MySQL任意文件读取中的一些坑
FreeBuf_23303 2020-10-10 18:02:39 406200
所属地 河南省

MySQL可以通过伪造服务端读取客户端的文件这个想必大家都知道,其中 mysql jdbc 也是可以通过这个方式来进行任意文件读取的,但是在实践中碰到了不少的问题,记录下来。

有些服务是可以自定义jdbc连接来连接自己的数据库的,在java中是 mysql-connecter-java-xxx.jar ,由于版本的不同,造成文件读取的效果不同,这也导致了接下来出现的问题。

常见的payload如:

https://raw.githubusercontent.com/Gifts/Rogue-MySql-Server/
https://github.com/allyshka/Rogue-MySql-Server
https://github.com/jas502n/CVE-2019-12086-jackson-databind-file-read

等等,都是介绍了该攻击都只要三步即可完成,即:

1.回复mysql client一个greeting包

2.等待client端发送一个查询包

3.回复一个file transfer包

如下图我表示的三步。
image.png但是当我按照该思路对漏洞进行利用的时候,发现了一些问题,jdbc报错了,error为:

Unexpected exception encountered during query

在网上查了很多资料,都说是因为jdbc版本太低,升级jdbc版本即可,进过测试,发现高版本的jdbc利用该漏洞的确可以成功,但是我们可以更改服务器的jdbc版本吗,显然是不可以的,那么就要研究到底问题出现在哪。

在本地调试,发现 mysql-connecter-java-5.x.jar存在此问题,判断服务端也可能为该版本,同时正因为坑爹的百度的答案,一直把我带入了一个误区,就是说jdbc的版本要和mysql服务端的版本匹配,但是当我测试,利用该版本的jdbc与本地的mysql进行连接并进行文件读取,发现并没有任何问题,但是当我和恶意的mysql服务端连接时就出现了error,所以首先排除了版本不匹配的问题。
image.png然后我就怀疑网上的payload可能不对,通过抓取成功的数据包,来对恶意服务端进行替换。
image.png通过替换,实现与成功的payload一模一样,发包,还是失败,还是同样的问题,在这卡了两天,因为明知道这个点有问题,就是没法利用成功,很难受。

通过求助大神,大神说这种有两种办法调试

1.和我调试的办法相同

2.查看jdbc源代码调试

第二种我不会,就让大神代替我做了,大神通过调试,发现有个值带入到jdbc中为负数,导致抛出异常。
image.png
我们先来看看 MaxAllowedPacket 这个是干嘛的.
image.png所以这是mysql服务端给客户端的一个值,通过抓包发现,这个的确是服务端给到客户端的,但是前面我们也说了,利用步骤只有三部,第三步为不管客户端向服务端请求什么sql,服务端都要向客户端要他的/etc/passwd的值,先看一下恶意的服务端抓包的情况,大家看红框中的内容,这就是客户端向服务端进行请求该值。
image.png

那我们再看看恶意服务端是怎么响应的。
image.png前面也说了,不管客户端向服务端要什么,服务端都会向客户端要他的/etc/passwd值,问题就出现在这里了。

所以解决的方式也很简单,我给他一个响应不就可以解决了嘛,正常的响应如下:
image.png所以我们就要多一步,先给了数据,下次请求再要文件内容即可。
image.png

Payload

https://github.com/yang8e/jdbc_mysql_redfile

# 漏洞分析
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 FreeBuf_23303 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
攻防渗透宝典
web安全
FreeBuf_23303 LV.3
yangge
  • 1 文章数
  • 3 关注者
Cobalt strike在内网渗透中的使用
2017-01-24
利用Cobalt strike一步步教你发送钓鱼邮件
2017-01-13
新手教程:利用ubuntu 14.04+apache+modsecurity实现云WAF
2015-04-07
文章目录