CTF Study Note
  • 首页
  • Web
    • 反序列化漏洞(unserialize3)
    • Dedecms V5.7漏洞总结复盘
    • Web源码泄露
  • Misc
    • 流量分析-SMTP图片隐写
    • 流量分析-Telnet特殊字符
    • 记一次misc盲注流量分析
    • 第四届网鼎杯 白虎组 Misc04 WriteUP
  • Crypto
    • 第四届网鼎杯 青龙组 Crypto02 WriteUP
  • games
    • ISCTF2024 WP
    • 2024深育杯 攻防大赛 WP
  • 出题笔记
    • ez_AndroidRe
    • base65536
Powered by GitBook
On this page
  • 快速跳转/目录:
  • GetShell步骤实录
  • 任意修改前台用户密码
  • 文件上传拿Shell的补充方式
  • 随便看看

Was this helpful?

  1. Web

Dedecms V5.7漏洞总结复盘

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

Previous反序列化漏洞(unserialize3)NextWeb源码泄露

Last updated 6 months ago

Was this helpful?

快速跳转/目录:

  • GetShell步骤实录

  • 任意修改前台用户密码

  • 文件上传拿Shell的补充方式

  • 随便看看

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函数
function newmail($mid, $userid, $mailto, $type, $send)
{
    global $db,$cfg_adminemail,$cfg_webname,$cfg_basehost,$cfg_memberurl;
    $mailtime = time();
    $randval = random(8);
    $mailtitle = $cfg_webname.":密码修改";
    $mailto = $mailto;
    $headers = "From: ".$cfg_adminemail."\r\nReply-To: $cfg_adminemail";
    $mailbody = "亲爱的".$userid.":\r\n您好!感谢您使用".$cfg_webname."网。\r\n".$cfg_webname."应您的要求,重新设置密码:(注:如果您没有提出申请,请检查您的信息是否泄漏。)\r\n本次临时登陆密码为:".$randval." 请于三天内登陆下面网址确认修改。\r\n".$cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid;
    if($type == 'INSERT')
    {
        $key = md5($randval);
        $sql = "INSERT INTO `#@__pwd_tmp` (`mid` ,`membername` ,`pwd` ,`mailtime`)VALUES ('$mid', '$userid',  '$key', '$mailtime');";
        if($db->ExecuteNoneQuery($sql))
        {
            if($send == 'Y')
            {
                sendmail($mailto,$mailtitle,$mailbody,$headers);
                return ShowMsg('EMAIL修改验证码已经发送到原来的邮箱请查收', 'login.php','','5000');
            } else if ($send == 'N')
            {
                return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval);
            }
        }
        else
        {
            return ShowMsg('对不起修改失败,请联系管理员', 'login.php');
        }
    }
    elseif($type == 'UPDATE')
    {
        $key = md5($randval);
        $sql = "UPDATE `#@__pwd_tmp` SET `pwd` = '$key',mailtime = '$mailtime'  WHERE `mid` ='$mid';";
        if($db->ExecuteNoneQuery($sql))
        {
            if($send == 'Y')
            {
                sendmail($mailto,$mailtitle,$mailbody,$headers);
                ShowMsg('EMAIL修改验证码已经发送到原来的邮箱请查收', 'login.php');
            }
            elseif($send == 'N')
            {
                return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval);
            }
        }
        else
        {
            ShowMsg('对不起修改失败,请与管理员联系', 'login.php');
        }
    }
}
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:

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

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

本次测试创建账户均已删除,请勿模仿!

再次提醒,请遵守相关法律法规。

以下内容仅为演示 请不要模仿 请熟记

《中华人民共和国网络安全法》
这篇文章
竟然是SYSTEM用户,这可做的事情可太多了
使用BT面板建站 系统为winserver
shell 直接拿到bt面板后台 账号和密码
登录面板
网站日志,包含IP等隐私信息
数据库密码
饱受风霜的服务器 天天被扫
创建win账户 开启rdp登录权限
成功登录 远程桌面
一些服务器信息
测个速 判断服务器上行带宽为 3~4M
需要管理员密码
给用户提权成管理员
在服务器管理员桌面上找到了flag