Dedecms 5.7 SP2后台getshell

版权声明:本文为博主原创文章,转载请联系博主 https://blog.csdn.net/he_and/article/details/80890664

Dedecms 5.7 SP2后台getshell

前言

最近也打算研究研究各大cms的漏洞了,正好看到一篇关于dedecms后台getshell的文章,所以也自己动手复现一下,这样以后遇到了也更容易上手。该漏洞涉及的版本是dedecms的最新版吧,下载地址:
http://www.dedecms.com/products/dedecms/downloads/

复现

版本:
本例测试版本
我这里测试的是utf8版,这个版本应该不影响。
漏洞位置:模块->广告管理->新建广告
漏洞位置
如下图所示,我们在广告内容处写入恶意代码
这里写图片描述
用burp抓包看一下我们的广告提交到哪个页面进行处理去了,以及各个参数的情况。
抓包结果
可以看到被ad_add.php处理了,我们到源码里看一下:

$query = "
     INSERT INTO #@__myad(clsid,typeid,tagname,adname,timeset,starttime,endtime,normbody,expbody)
     VALUES('$clsid','$typeid','$tagname','$adname','$timeset','$starttime','$endtime','$normbody','$expbody');
    ";
    $dsql->ExecuteNoneQuery($query);
    ShowMsg("成功增加一个广告!","ad_main.php");

上面就是我截取的对我们有用的源码片段,从中可以看到,我们的广告信息被插入到了数据库中。接下来就在数据库中去看一下吧:
这里写图片描述
恶意代码写进去了,就看看哪里会调用我们这个”善意“的广告了呗,点击广告栏的代码就可以看到我们的广告杯插入在了哪里:
这里写图片描述
这里写图片描述
可以看到ad_js.php调用了我们的广告,可以去看看源码了:

<?php
/**
 *
 * 广告JS调用方式
 *
 * @version        $Id: ad_js.php 1 20:30 2010年7月8日Z tianya $
 * @package        DedeCMS.Site
 * @copyright      Copyright (c) 2007 - 2010, DesDev, Inc.
 * @license        http://help.dedecms.com/usersguide/license.html
 * @link           http://www.dedecms.com
 */
require_once(dirname(__FILE__)."/../include/common.inc.php");
if(isset($arcID)) $aid = $arcID;
$arcID = $aid = (isset($aid) && is_numeric($aid)) ? $aid : 0;
if($aid==0) die(' Request Error! ');

$cacheFile = DEDEDATA.'/cache/myad-'.$aid.'.htm';
if( isset($nocache) || !file_exists($cacheFile) || time() - filemtime($cacheFile) > $cfg_puccache_time )
{
    $row = $dsql->GetOne("SELECT * FROM `#@__myad` WHERE aid='$aid' ");//根据aid获得广告
    $adbody = '';
    if($row['timeset']==0)//如果广告是永不过期的就取出广告内容,并赋值给$adbody
    {
        $adbody = $row['normbody'];
    }
    else
    {
        $ntime = time();
        if($ntime > $row['endtime'] || $ntime < $row['starttime']) {
            $adbody = $row['expbody'];
        } else {
            $adbody = $row['normbody'];
        }
    }
    //安全过滤
    $adbody = str_replace('"', '\"',$adbody);
    $adbody = str_replace("\r", "\\r",$adbody);
    $adbody = str_replace("\n", "\\n",$adbody);
    //将广告内容写入一段注释中,这里的注释就导致了漏洞
    $adbody = "<!--\r\ndocument.write(\"{$adbody}\");\r\n-->\r\n";
    //将我们的广告内容昔写入$cacheFile的文件里,这个文件在前面
    $fp = fopen($cacheFile, 'w');
    fwrite($fp, $adbody);
    fclose($fp);
}
include $cacheFile;//把刚刚构造的静态html文件包含进来,这就导致html文件中的php代码可执行

现在我们首先要满足if条件判断,由于是或运算,只要满足一个就行了,这里我们可以直接利用dedecms的变量注册的特性(这里不太清楚,大概是这个原因,不太熟悉),直接传入一个nocache变量,直接满足if判断,这样我们的恶意代码就写进了下面这个文件里:
这里写图片描述
我们来按照思路来操作下:
这里写图片描述
访问下$cacheFile,发现恶意果然写入了:
这里写图片描述
接下来就是访问一下ad_js.php这个文件了,因为ad_js.php最后包含了$cacheFile这个文件,导致我们的恶意代码得以执行。现在我来写入一个phpinfo()函数作为测试:
这里写图片描述
上面post传送的数据为

key = echo '-->';phpinfo();
echo '-->'是为了闭合注释,不然我们的代码不能执行

当然也可以用菜刀连接了:
这里写图片描述


这里写图片描述
微信公众号关注我

猜你喜欢

转载自blog.csdn.net/he_and/article/details/80890664