

漏洞简介
无 CVE, SSV-97074,提交时间:20180110
在用户密码重置功能处,php存在弱类型比较,导致如果用户没有设置密保问题的情况下可以绕过验证密保问题,直接修改密码(管理员账户默认不设置密保问题)。值得注意的是修改的密码是member表中的密码,即使修改了管理员密码也是member表中的管理员密码,仍是无法进入管理后台。
1
漏洞影响
DeDeCMS V5.7 SP2 正式版(2018-01-09) 2018年01月09日之前的所有版本。
2
漏洞复现
uploads/member/resetpassword.php 处理用户重置密码的操作
dopost=getpwd&gourl=&userid=user1&mail=123123%40qq.com&vdcode=wsf7&type=2
接收用户传入的参数 type=2,验证用户是否设置了安全问题,如果没有设置就 exit,设置了就进入 resetpassword3.htm 页面,填写安全问题提交后的参数如下 dopost=safequestion&id=3&userid=user2&safequestion=3&safeanswer=asd&vdcode=wpkp
其实我们可以直接绕过 getpwd 这一步,直接请求 safequestion ,即可绕过 if($member['safequestion'] == 0) 的判断
82 行和 86 行做了 2 次判断,先判断 $safequestion 是否为空,空即为 '',再和 $row[safequestion] 做 == 比较, 因为用户未设置安全问题,所以 $row[safequestion] = 0,所以只需要让 $safequestion 满足既不为空,又弱类型比较 == 0 即可。
从上面结果为 true 的选择一个即可绕过判断,
输入 00 即可绕过 empty 的判断,使其非空并且在后面的判断中 == "0" uploads/member/resetpassword.php 80
可以看到 80 行的 empty 被绕过,84 行的 $row['safequestion'] == $safequestion 判断返回 True,成功进入 sn 函数,再进入 newmail 函数,插入临时的 pwd,然后跳转到修改密码页面 响应中返回了重置密码的链接,打开后即可重置密码
http://localhost/DedeCMS-V5.7-UTF8-SP2-Full/uploads/member/resetpassword.php?dopost=getpasswd&id=2&key=Ua79xExc
之后通过 id 来修改密码,并删除临时密码
3
漏洞利用
首先在浏览器页面获取验证码,修改要修改密码的用户的 id,访问链接,返回重置密码的链接
http://localhost/DedeCMS-V5.7-UTF8-SP2-Full/uploads/member/resetpassword.php dopost=safequestion&id=2&userid=xxxx&safequestion=00&safeanswer=&vdcode=wpkp
访问重置密码的链接,即可修改密码
4
漏洞缺陷
通过分析可以看出来只有没有设置安全问题的用户才会受此漏洞的影响;而且只能修改前台用户的密码
5
漏洞修复
1.使用 ===
2.在 $dopost == "safequestion" 中再次判断用户是否设置了安全问题
6
参考
http://blog.nsfocus.net/dedecms-20180109/



