Dedecms V5.7漏洞总结复盘

学长自建的靶场,研究了一下,还挺有意思,故总结相关知识后写下笔记

快速跳转/目录:

GetShell步骤实录

1

信息搜集与分析

首先,我们打开网站 内容如图所示

我们可以了解到 这是一个名为“织梦CMS(dedecms)”的网站

通过搜索得知相关信息 发现为开源框架

分析项目结构:

得知一些有用的框架默认地址:

/data/admin/ver.txt 获取框架版本为20170405

/dede/login.php 后台默认登陆地址

本靶场均为默认配置 所以可以直接对比开源包

如果为修改配置/闭源框架 则需要使用其他工具扫描进行搜集

2

分析主页,尝试登陆后台

我们发现 主页最近更新栏目中有个测试内容 访问,我们获取到以下内容:

username:admin password:kdAJwzuuAMqO9YgSJ)`EBk,?C

尝试主页直接登陆:

用户名被拒绝登陆,说明不是这里

猜测为后台账户 进入后台登陆页 尝试登陆:

密码错误 观察密码格式 大概率为加密后的密文

经学长提示 密码为base91加密

尝试解密:

得出为sjfDIDHDHJ12458843..

登陆成功

3

成功GetShell

查看右边侧栏文件管理器 发现可以直接上传文件

直接上传一句话木马 通过蚁剑连接即可拿到shell

拓展:不仅仅是文件管理器可以直接上传木马,还有许多方式可以上传

详见 文件上传拿Shell的补充方式

4

总结

难度不难 个人认为最难的为判断密码加密方式

另外 还有这个:

不是哥们,做这道题至少被验证码拦截了不下20次(

气急败坏.jpg


任意修改前台用户密码

详细原理可以参考 这篇文章 涉及到PHP相关原理 讲的很详细

1

原理简要分析

在dedecms的此版本中,恢复密码拥有两种方式:

邮件方式:首先会检测邮件服务是否开启如果开启则发送邮件,否则给出提示信息
安全问题:检测是否有设置安全问题,如果有则重定向到密码重置的第三步,否则给出提示

分析通过安全方式找回密码的逻辑代码:

if ($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer)

此处的比较是"==" 为弱类型比较

漏洞触发点在于安全问题找回密码时的不安全性逻辑设计所导致的,所以我们根据流程进入到以"安全问题"找回密码的逻辑代码中继续分析,可以看到这里会根据之前传递进来的用户id作为参数从数据库查询对应的safequestion、safeanswer,之后于用户提供的safequestion以及safeanswer进行判断。

如果用户没有设置安全问题,数据库里存储的safequestion默认为"0",safeanswer默认为'null',在此处我们可以利用弱类型转换构造成立,例如:

'0.0'=0

SN函数:

function sn($mid,$userid,$mailto, $send = 'Y')
{
    global $db;
    $tptim= (60*10);
    $dtime = time();
    $sql = "SELECT * FROM #@__pwd_tmp WHERE mid = '$mid'";
    $row = $db->GetOne($sql);
    if(!is_array($row))
    {
        //发送新邮件;
        newmail($mid,$userid,$mailto,'INSERT',$send);
    }
    //10分钟后可以再次发送新验证码;
    elseif($dtime - $tptim > $row['mailtime'])
    {
        newmail($mid,$userid,$mailto,'UPDATE',$send);
    }
    //重新发送新的验证码确认邮件;
    else
    {
        return ShowMsg('对不起,请10分钟后再重新申请', 'login.php');
    }
}

在该函数中会首先进行初始化赋值操作(此处的send为上面传递进来的'N'),之后跟进传递的id进行一次sql查询,之后进行判断,在这里我们直接根据newmail查看发送邮件的函数具体实现:

newmail函数
elseif($send == 'N')
    {
    return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval);
    }

可以看到当send为'N'时,直接在前端页面返回了验证码,又因为用户id是我们可以控制的safequestion下可以绕过,那么也就达成了修改前台任意用户密码的攻击。

2

漏洞复现

首先,我们需要先注册一个用户 确保设置安全问题

之后退出登录,进入找回密码页面

启动bp抓包 将截获的请求包发送到重发器模块以便于查看响应包,原来的包DROP掉,不然会触发二次请求导致利用失败

使用此payload替换相应包

vdcode与type 不需要替换 id= 替换为要攻击的对象 此处为1(admin)

post=safequestion&id=1&userid=test1&safequestion=00&safeanswer=0

替换后发包,得到重置密码URL

复制右侧HTML编码结果,粘贴到浏览器访问

即可更改任意用户的密码


文件上传拿Shell的补充方式

1

修改模板文件

保存后按以下方式操作

更新后访问/index.php即可拿到shell

2

通过广告管理上传木马

如图操作:

添加后点击代码

这里就是木马位置 直接连接即可


随便看看

查看webshell:

竟然是SYSTEM用户,这可做的事情可太多了
使用BT面板建站 系统为winserver
shell 直接拿到bt面板后台 账号和密码
登录面板

2核2G 40G硬盘 华为云服务器 Windows Server 2019系统

网站日志,包含IP等隐私信息
数据库密码
饱受风霜的服务器 天天被扫
创建win账户 开启rdp登录权限
成功登录 远程桌面
一些服务器信息
测个速 判断服务器上行带宽为 3~4M
需要管理员密码
给用户提权成管理员
在服务器管理员桌面上找到了flag

具体是什么flag 请自行猜测 只可意会 不可言传

Last updated

Was this helpful?