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 |
这个系统表中可以看到别人正在进行的操作:

经过一段时间的观察,发现了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

题目给了wireshark的pcap包
首先追踪UDP流,发现在0号流里面存在一定的规律:

人工把这些记下来:得到flag的后半段:sse1f_wIth_m1sc^_^}
然后想办法找前半段
注意到在结束部分存在大量DNS解析,且DNS域为bytedanec.top(不是bytedance),这里故意写错应该是提示,使用过滤器把所有请求筛出来:

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

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

这些用i.和o.开始的域名返回的地址是10.0.0.2而其它的是10.0.0.1
所以单独筛选出i和o的请求,把i当成1,o当成0得到二进制串,转成ASCII后发现前半部分:
The first part of flag: ByteCTF{^_^enJ0y&y0ur
和前面的后半部分拼接后得到:ByteCTF{^_^enJ0y&y0ursse1f_wIth_m1sc^_^}但是这个flag不对,在yoursself这里多了一个s,手动删除后得到正确的flag:ByteCTF{^_^enJ0y&y0urse1f_wIth_m1sc^_^}