在测试过程中接触到一个从没有见过的数据库,不过好在有AI的加持,其次也很幸运地有一个能线上直接用的数据库网站,造就了这次"捡"洞之旅。
开局一个登录框,挂上burp,先抓个登陆包看看,可以看到跟网址有区别应该是个前后端分离的网站,遇到前后端分离的网站时复制一下数据包的url,去访问一下看是否为springboot搭建的,这个网站运气很好是springboot,使用工具测试看看是不是有泄露,有一个env泄露,env里面通常会有各种key啊,真是让我欢喜。




打开查看后,只想说一句,梦里啥都有,一点用都没有,怪不得一直留着没关了。

固定密码进行爆破,没任何结果,一群大佬虎视眈眈,也不会留给你啊。查看熊猫头,也没什么有用的东西,有一个没见过的网址,访问后,发现是swagger界面。难道这次真掏上了?


swagger基本上就是去测试接口,看看是否有未授权,泄露等漏洞。打开接口进行测试,发现没有任何返回,可以看到首先端口不一样,并且访问的网址是本地127.0.0.1。尝试将接口拼到该网址下,发现是有回显的,证明是可以用的,可能是需要其他东西,并没有搞成,所以选择跳过。


查看其他接口,发现有些接口是会给一些需要的参数的,直接拼凑进行测试,数据库报错,运气太好了。


仔细查看报错信息,是在3的地方出现了报错,可以看到是成功带入到语句中的,并且可以发现该数据库是clickhouse数据库。这种数据库是列式数据库,与mysql数据库不同,如果感兴趣的话可以看一下这篇文章,讲的还挺详细的。

既然带入到数据库了,直接上sqlmap进行测试。结果没有结果。

回到数据包中,参数logstore,会不会是路径呢,输入/tmp/log发包,/报错,删除第一个/后发现本来带入的是tmp/log,但是最后显示出来的只剩/log,前面的tmp没了,难道是tmp对了?将/log删除,此时数据库不再报错,但是显示tmp表不存在。



到这先稍微了解一下语法,在clickhouse数据库中,查询表名的语法例子:如果有数据,select from default.actors

如果没有表不存在没有数据,select from default.actor1

对比一下漏洞网站的报错不存在tmp表,大概还原一下查询语句
SELECT *from apaaslog.tmp WHERE 1 = 1 AND appid = '1' AND tenantname != '' AND receive_date IN (today(), yesterday()) ORDER BY tenantname ASC
在演示网站可以看到也是有log相关的表名的,结合一下该系统的title就是日志管理系统,并且这种数据库大多数是用来做大数据分析的,猜测是否该系统存着该厂商的一些日志,难道这个系统就是类似于某音,根据喜好做分析推送的?

想到这回到刚开始发现的/env泄露,应该是给这些企业做分析的。可以看到网站都是以公司名为开头,格式为:公司名.厂商主域.com。


到此想到既然tmp不存在,是不是它使用公司名作为日志文件的呢?将env中的子域名进行收集,使用ai查找关于日志文件的构造,利用脚本直接进行生成日志文件。放入burp中,进行爆破。



发现问题,生成的日志名在爆破过程中显示的是Database test doesn't exist,而不是Table apaaslog.tmp doesn't exist,对比发送的数据一个是tmp,另一个是test.log,最后发现是点的问题,也就是说它会把点前面的识别成数据库,如果我们用一个系统自带的数据库和数据表,这样的话岂不是语句的条件就成立了。

在clickhouse中,system.tables是系统自带的表,直接进行测试,报错显示的是没有相关的列,证明SQL语句是完整的执行了,只不过是前面做筛选的列这个表中没有,庆幸的是爆出了真正的sql语句。其中$$包含的就是数据包的参数。虽然拿到了真正的语句,但是在测试时前面的限制条件我们是无法更改的,所以只能对语句后面做测试,所以还是得找一个满足限制条件的表,只能继续爆破了,并且只要加上点他就会默认点前面是数据库,回想到演示网站中的日志表后缀为_log,将点改成_重新生成,然后继续爆破。


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
成功爆破出一个表

直接访问发现并没有任何信息,在mysql数据库中有注释符--和#用来做注解,但在渗透测试过程中,更多的是用来注释后面要执行的语句,在clickhouse中同样也有--,但是在clickhouse中需要加上分号(;--),成功返回信息。


既然可以注释掉后面的where语句,当然也可以添加sql语句进行查询,例如查询数据库。到此算是初步找到了漏洞点,后续就要围绕这个点继续扩大危害。

在该数据库中存在一个url函数本意是对向外访问然后将数据插入到数据库,但是在渗透测试里,我们可以把它看成ssrf的利用点,先说一下我的当时的思路,首先利用dnslog可以看到它回显的ip地址,通过查询发现是腾讯云,既然是云上的就查元数据,获取凭证,拿下该数据库,但是不幸的是没有设置cam(类似于阿里云的RAM),使用到的语句为
select * from url('http://metadata.tencentyun.com