phpBB Phar反序列化远程代码漏洞分析(CVE-2018-19274)
字数 1520 2025-08-20 18:17:47

phpBB Phar反序列化远程代码执行漏洞分析(CVE-2018-19274)

漏洞概述

phpBB™ 是世界上应用最广泛的开源论坛软件。在phpBB v3.2.3及以前的版本中,存在一个严重的远程代码执行漏洞,攻击者可以通过构造特殊的PHAR文件触发反序列化漏洞,最终获取Webshell。

漏洞影响

  • 影响版本:phpBB v3.2.3及以前的版本
  • 漏洞条件:
    • 拥有控制管理面板的权限(可通过社工、弱口令、钓鱼等方式获取)
    • 能够上传恶意附件

漏洞原理

核心漏洞点

漏洞的核心在于phpBB3/includes/functions_acp.php文件中的validate_config_vars函数:

// 通过file_exists函数判断$path是否存在
// 此处若可以被上传PHAR归档包,文件路径可控,就可以通过phar://协议进行反序列化攻击
if (file_exists($path))

漏洞触发流程

  1. 前端上传恶意附件:攻击者在前台发帖时上传包含恶意序列化数据的PHAR文件
  2. 后台触发反序列化:在管理面板的附件设置中,通过精心构造的config[img_imagick]参数触发phar反序列化
  3. 利用链执行:利用Guzzle库的FileCookieJar类完成文件写入,获取Webshell

详细分析

1. 漏洞触发点分析

漏洞触发始于acp_attachments->main()方法,关键调用链如下:

  1. phpBB3/includes/acp/acp_attachments.php中的main()方法
  2. 调用validate_config_vars()函数
  3. 传入两个参数:
    • $display_vars['vars']:系统配置定义
    • $cfg_array:来自$_REQUEST['config']

2. validate_config_vars函数分析

phpBB3/includes/functions_acp.php中:

foreach ($config_vars as $config_name => $config_definition) {
    // 检查$cfg_array中是否有与系统配置相同的键名
    // 检查键值是否存在$config_definition['validate']
    if (...) {
        $validator = explode(':', $config_definition['validate']);
        $type = $validator[0];
        
        switch ($type) {
            case 'wpath':
                // 关键漏洞点:缺少break语句
                $path = in_array($config_definition['validate'], array('wpath', 'path', 'rpath', 'rwpath')) 
                    ? $phpbb_root_path . $cfg_array[$config_name] 
                    : $cfg_array[$config_name];
                // 触发file_exists检查
                if (file_exists($path)) {
                    ...
                }
            case 'absolute_path':
            case 'absolute_path_writable':
            case 'path':
                // 由于缺少break,可以绕过路径前缀拼接
        }
    }
}

3. 绕过路径限制

通过分析发现img_imagick元素的验证类型为absolute_path,可以绕过路径前缀拼接:

foreach ($display_vars['vars'] as $key => $value) {
    if (($value['validate'] === 'absolute_path') or 
        ($value['validate'] === 'absolute_path_writable') or 
        ($value['validate'] === 'path')) {
        print('66'.$key.'77');
    }
}

4. 恶意文件上传

上传位置为前台发帖附件处,关键函数调用栈:

  1. phpBB3/phpbb/plupload/plupload.php中的handle_upload
  2. 计算上传文件路径的函数temporary_filepath
    • $this->temporary_directory./files/plupload
    • $file_name可控
    • 文件后缀可控
    • $this->config['plupload_salt']可从数据库备份中获取

最终上传路径格式为:
./files/plupload/[plupload_salt]_[md5(filename)]zip.part

5. 利用链分析

利用PHP网络请求插件Guzzle完成反序列化利用:

// phpBB3/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
public function __destruct() {
    $this->save($this->filename);  // 关键点:析构函数调用save
}

public function save($filename) {
    file_put_contents($filename, $str);  // 最终写入文件
}

漏洞利用步骤

  1. 获取管理员权限:通过社工、弱口令等方式获取管理员权限
  2. 上传恶意PHAR文件
    • 构造包含恶意序列化数据的PHAR文件
    • 通过前台发帖附件功能上传
  3. 获取plupload_salt
    • 进入管理面板的数据库备份功能
    • 下载数据库备份获取plupload_salt
  4. 计算上传文件路径
    • 使用公式:[plupload_salt]_[md5(filename)]zip.part
  5. 触发反序列化
    • 在管理面板的附件设置中提交恶意请求:
    POST /phpBB3/adm/index.php?i=acp_attachments&mode=attach&sid=... HTTP/1.1
    ...
    config%5Bimg_imagick%5D=phar://../files/plupload/[恶意文件名]&...
    
  6. 获取Webshell
    • 利用链执行后会在指定位置写入Webshell

防御措施

  1. 升级到phpBB最新版本
  2. 严格过滤管理员面板的输入参数
  3. 对文件上传功能加强限制
  4. 使用强密码保护管理员账户
  5. 限制管理面板的访问IP

参考链接

phpBB Phar反序列化远程代码执行漏洞分析(CVE-2018-19274) 漏洞概述 phpBB™ 是世界上应用最广泛的开源论坛软件。在phpBB v3.2.3及以前的版本中,存在一个严重的远程代码执行漏洞,攻击者可以通过构造特殊的PHAR文件触发反序列化漏洞,最终获取Webshell。 漏洞影响 影响版本:phpBB v3.2.3及以前的版本 漏洞条件: 拥有控制管理面板的权限(可通过社工、弱口令、钓鱼等方式获取) 能够上传恶意附件 漏洞原理 核心漏洞点 漏洞的核心在于 phpBB3/includes/functions_acp.php 文件中的 validate_config_vars 函数: 漏洞触发流程 前端上传恶意附件 :攻击者在前台发帖时上传包含恶意序列化数据的PHAR文件 后台触发反序列化 :在管理面板的附件设置中,通过精心构造的 config[img_imagick] 参数触发phar反序列化 利用链执行 :利用Guzzle库的 FileCookieJar 类完成文件写入,获取Webshell 详细分析 1. 漏洞触发点分析 漏洞触发始于 acp_attachments->main() 方法,关键调用链如下: phpBB3/includes/acp/acp_attachments.php 中的 main() 方法 调用 validate_config_vars() 函数 传入两个参数: $display_vars['vars'] :系统配置定义 $cfg_array :来自 $_REQUEST['config'] 2. validate_ config_ vars函数分析 在 phpBB3/includes/functions_acp.php 中: 3. 绕过路径限制 通过分析发现 img_imagick 元素的验证类型为 absolute_path ,可以绕过路径前缀拼接: 4. 恶意文件上传 上传位置为前台发帖附件处,关键函数调用栈: phpBB3/phpbb/plupload/plupload.php 中的 handle_upload 计算上传文件路径的函数 temporary_filepath : $this->temporary_directory 为 ./files/plupload $file_name 可控 文件后缀可控 $this->config['plupload_salt'] 可从数据库备份中获取 最终上传路径格式为: ./files/plupload/[plupload_salt]_[md5(filename)]zip.part 5. 利用链分析 利用PHP网络请求插件Guzzle完成反序列化利用: 漏洞利用步骤 获取管理员权限 :通过社工、弱口令等方式获取管理员权限 上传恶意PHAR文件 : 构造包含恶意序列化数据的PHAR文件 通过前台发帖附件功能上传 获取plupload_ salt : 进入管理面板的数据库备份功能 下载数据库备份获取 plupload_salt 值 计算上传文件路径 : 使用公式: [plupload_salt]_[md5(filename)]zip.part 触发反序列化 : 在管理面板的附件设置中提交恶意请求: 获取Webshell : 利用链执行后会在指定位置写入Webshell 防御措施 升级到phpBB最新版本 严格过滤管理员面板的输入参数 对文件上传功能加强限制 使用强密码保护管理员账户 限制管理面板的访问IP 参考链接 phpBB官方安全公告 PHP Phar反序列化漏洞原理 Guzzle库安全公告