影响范围
漏洞危害
攻击类型
利用条件
2、攻击者拥有一个正常的会员账号
3、目标没有设置安全问题
漏洞简介
漏洞分析
之后检查dopost是否为空,如果为空则重定向到密码重置模板页面,如果不为空这进行匹配,当dopost为getpwd则对用户输入的验证码、邮箱、用户名的合法性进行校验:
在这里会首先判断找回密码的方式,这里一共提供了两种:
1、邮件方式:首先会检测邮件服务是否开启如果开启则发送邮件,否则给出提示信息
2、安全问题:检测是否有设置安全问题,如果有则重定向到密码重置的第三步,否则给出提示
该漏洞的触发点在于以安全问题找回密码时的不安全性逻辑设计所导致的,所以我们根据流程进入到以"安全问题"找回密码的逻辑代码中继续分析,可以看到这里会根据之前传递进来的用户id作为参数从数据库查询对应的safequestion、safeanswer,之后于用户提供的safequestion以及safeanswer进行判断,但是可以注意到的是此处使用的是————"=="做判断:
当用户没有设置安全问题时,数据库里存储的safequestion默认为"0",safeanswer默认为'null':
漏洞利用
因为这里的模块属于会员模块,包含了member.login.class.php,需要登录才能操作,所以我先注册一个用户,担任攻击者,再注册另外一个用户担任目标:
- 攻击者:test\2\test(用户\ID\密码)
- 攻击目标:test1\3\hacker(用户\ID\密码)
Step1: 登陆test用户
此时系统用户的id分配如下所示:
http://192.168.174.159:88/DedeCms/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id=4
Step3:修改请求页URL(下面的key来自上面的请求结果)
http://127.0.0.1/dedecms/member/resetpassword.php?dopost=getpasswd&id=4&key=anQZXeG5
Step4:修改用户test1的密码为hacker
Step5: 用修改之后的密码登陆进行验证
成功登陆:
修复建议
目前官方没有任何更新版本,该漏洞处于Nday状态,建议用户可以通过使用"==="来替换"=="进行缓解~