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. 环境准备

  1. 从 GitHub 下载源码:https://github.com/hnaoyun/PbootCMS
  2. 安装后获取授权码:https://www.pbootcms.com/freesn/
  3. 登录后台添加授权码

2. 漏洞利用过程

  1. 后台插入恶意代码

    • 登录后台,在"站点信息"中插入以下代码并保存:
      {if:1)$var="assert";$var(getallheaders()['Proxy-Connection']);//}123
      
  2. 构造恶意请求

    • 访问前台首页,使用 Burp Suite 抓包
    • 修改请求头:
      • Cookie 头设置为 assert
      • Proxy-Connection 头设置为要执行的 PHP 代码,例如:
        system('whoami')
        
  3. 执行结果

    • 服务器将执行 Proxy-Connection 头中的 PHP 代码
    • 示例中会执行系统命令 whoami 并返回结果

技术原理分析

漏洞位置

apps/home/controller/ParserController.php 中的 parserIfLabel 函数存在安全缺陷

安全校验绕过

  1. 第一处绕过

    • 原始校验使用正则表达式检查函数调用
    • 通过在函数名和括号之间插入控制字符(如 \x01)绕过正则检查
    • 示例:assert\x01(...) 可以绕过检查但仍能执行
  2. 第二处绕过

    • 系统对敏感函数进行了过滤:
      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() 实现代码执行
    • 将可控输入转移到请求头中绕过过滤

利用技术

  1. PHP 动态特性

    • 使用变量函数调用:$var = "assert"; $var(...);
    • 参考 KCon2019 相关议题中的技术
  2. HTTP 头注入

    • 利用 getallheaders() 获取所有请求头
    • 通过数组操作提取特定头部的值作为代码执行
  3. 无参数 RCE

    • 当直接参数传递被限制时,使用环境/请求信息作为输入源

限制条件

  1. 该利用方法在 Apache 下有效,因为 getallheaders() 是 Apache 特有的函数
  2. Nginx 环境下需要寻找其他替代方法

修复建议

  1. 严格校验模板标签中的函数调用
  2. 完善敏感函数过滤列表
  3. 对用户输入的模板内容进行更严格的过滤
  4. 更新到最新版本(检查官方是否已修复)

参考链接

  1. PHP动态特性的捕捉与逃逸
  2. 相关技术分析

扩展思路

  1. 尝试使用其他 PHP 回调函数如 array_map, array_filter
  2. 探索其他获取输入的方法,如 $_SERVER 变量
  3. 结合文件操作函数实现持久化后门
  4. 研究在 Nginx 环境下的替代利用方法
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. 漏洞利用过程 后台插入恶意代码 : 登录后台,在"站点信息"中插入以下代码并保存: 构造恶意请求 : 访问前台首页,使用 Burp Suite 抓包 修改请求头: 将 Cookie 头设置为 assert 将 Proxy-Connection 头设置为要执行的 PHP 代码,例如: 执行结果 : 服务器将执行 Proxy-Connection 头中的 PHP 代码 示例中会执行系统命令 whoami 并返回结果 技术原理分析 漏洞位置 apps/home/controller/ParserController.php 中的 parserIfLabel 函数存在安全缺陷 安全校验绕过 第一处绕过 : 原始校验使用正则表达式检查函数调用 通过在函数名和括号之间插入控制字符(如 \x01 )绕过正则检查 示例: assert\x01(...) 可以绕过检查但仍能执行 第二处绕过 : 系统对敏感函数进行了过滤: 使用 call_user_func 等非过滤函数结合 getallheaders() 实现代码执行 将可控输入转移到请求头中绕过过滤 利用技术 PHP 动态特性 : 使用变量函数调用: $var = "assert"; $var(...); 参考 KCon2019 相关议题中的技术 HTTP 头注入 : 利用 getallheaders() 获取所有请求头 通过数组操作提取特定头部的值作为代码执行 无参数 RCE : 当直接参数传递被限制时,使用环境/请求信息作为输入源 限制条件 该利用方法在 Apache 下有效,因为 getallheaders() 是 Apache 特有的函数 Nginx 环境下需要寻找其他替代方法 修复建议 严格校验模板标签中的函数调用 完善敏感函数过滤列表 对用户输入的模板内容进行更严格的过滤 更新到最新版本(检查官方是否已修复) 参考链接 PHP动态特性的捕捉与逃逸 相关技术分析 扩展思路 尝试使用其他 PHP 回调函数如 array_map , array_filter 等 探索其他获取输入的方法,如 $_SERVER 变量 结合文件操作函数实现持久化后门 研究在 Nginx 环境下的替代利用方法