dedeCMS前台用户密码重置漏洞的复现与分析
版本:5.7
分析写在了后面
详细过程
安装
由于dede在安装完成后没开启会员注册,所以安装完成后首先进入后台,开启网站会员注册。
开启后,注册一个test账号,密码为123456。需要注意的是不要设置安全问题,才可以复现该漏洞。
注册完成
进入后台查看test用户的mid值
然后退出登录,在前台构造url
抓包截取最后直接修改密码的网址
我们修改为密码为admin888
然后用密码admin888进行登录
最终可以成功登录
过程分析
问题出在/member/resetpassword.php文件中
当dopost变量的值为safequestion时会执行下面的代码
第三行是通过正则匹配将整数赋值给mid。
第四、五行查询当前mid在数据库中的safequestion、safeanswer、userid、email信息。
第六到九行,如果safequestion、safeanswer为不为空时,变量safequestion、safeanswer赋值为空。
第十行到十四行,如果数据库获取到的内容等于变量safequestion、safeanswer,则会发送给用户留下的邮箱一个重置密码url。
接下来我们来看sn函数,sn函数有三个四个形参
第三行设置一个全局变量
第四行设置变量tptim为十分钟
第五行取当前时间
第六到十二行发送第一次邮件。若想再次发送邮件需要等十分钟,不然会返回到ShowMsg()
然后我们再定位一下newmail函数
可以看到$randval = random(8);还会生成8位随机数,然后通过md5加密之后,修改数据库中用户的密码为临时密码。
想要绕过的关键在于下面几行,由于php是弱类型的,因此这种逻辑还是存在漏洞的。
简化测试,成功绕过,最终输出1
于是就有了下面的这个url