SRC挖掘之“捡”洞系列
在一次漏洞测试中,通过分析前后端分离网站发现Spring Boot架构,并利用工具检测到环境变量泄露。随后通过接口测试和数据库报错识别出ClickHouse数据库,并尝试利用SQL注入和日志文件构造进行爆破。最终成功绕过限制并尝试利用URL函数进行SSRF攻击,但未能获取云凭证。 2025-8-7 13:35:0 Author: www.freebuf.com(查看原文) 阅读量:7 收藏

前言

在测试过程中接触到一个从没有见过的数据库,不过好在有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

文章来源: https://www.freebuf.com/articles/web/443593.html
如有侵权请联系:admin#unsafe.sh