DedeCms/织梦cms模板执行漏洞(影响版本v5.6)

影响版本: 
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. //分析处理附加表数据      
  3.     $inadd_f = '';      
  4.     if(!emptyempty($dede_addonfields))//自己构造$dede_addonfields      
  5.     {      
  6.         $addonfields = explode(';',$dede_addonfields);      
  7.         if(is_array($addonfields))      
  8.         {      
  9.             print_r($addonfields);      
  10.             foreach($addonfields as $v)      
  11.             {      
  12.                 if($v=='')      
  13.                 {      
  14.                     continue;      
  15.                 }      
  16.                 $vs = explode(',',$v);      
  17.                 if(!isset(${$vs[0]}))      
  18.                 {      
  19.                     ${$vs[0]} = '';      
  20.                 }      
  21.                 ${$vs[0]} = GetFieldValueA(${$vs[0]},$vs[1],$aid);      
  22.                 $inadd_f .= ','.$vs[0]." ='".${$vs[0]}."' ";      
  23.                 echo $inadd_f;      
  24.             }      
  25.         }      
  26.     }      
  27. …      
  28. if($addtable!='')      
  29.     {      
  30.         $upQuery = "Update `$addtable` set typeid='$typeid',body='$body'{$inadd_f},userip='$userip' where aid='$aid' ";//执行构造的sql      
  31.         if(!$dsql->ExecuteNoneQuery($upQuery))      
  32.         {      
  33.             ShowMsg("更新附加表 `$addtable`  时出错,请联系管理员!","javascript:;");      
  34.             exit();      
  35.         }      
  36.     }      
  37. …   
2、include/inc_archives_view.php: 
//这是模板处理类,如果附加表的模板路径存在,直接从附加表取值;GetTempletFile获取模板文件的方法就是取的此处的模板路径,从来带进去解析。 
PHP Code复制内容到剪贴板
  1. …      
  2. //issystem==-1 表示单表模型,单表模型不支持redirecturl这类参数,因此限定内容普通模型才进行下面查询      
  3.             if($this->ChannelUnit->ChannelInfos['addtable']!='' && $this->ChannelUnit->ChannelInfos['issystem']!=-1)      
  4.             {      
  5.                 if(is_array($this->addTableRow))      
  6.                 {      
  7.                     $this->Fields['redirecturl'] = $this->addTableRow['redirecturl'];      
  8.                     $this->Fields['templet'] = $this->addTableRow['templet'];//取值      
  9.                     $this->Fields['userip'] =