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^_^}