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))
漏洞触发流程
- 前端上传恶意附件:攻击者在前台发帖时上传包含恶意序列化数据的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中:
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. 恶意文件上传
上传位置为前台发帖附件处,关键函数调用栈:
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完成反序列化利用:
// 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); // 最终写入文件
}
漏洞利用步骤
- 获取管理员权限:通过社工、弱口令等方式获取管理员权限
- 上传恶意PHAR文件:
- 构造包含恶意序列化数据的PHAR文件
- 通过前台发帖附件功能上传
- 获取plupload_salt:
- 进入管理面板的数据库备份功能
- 下载数据库备份获取
plupload_salt值
- 计算上传文件路径:
- 使用公式:
[plupload_salt]_[md5(filename)]zip.part
- 使用公式:
- 触发反序列化:
- 在管理面板的附件设置中提交恶意请求:
POST /phpBB3/adm/index.php?i=acp_attachments&mode=attach&sid=... HTTP/1.1 ... config%5Bimg_imagick%5D=phar://../files/plupload/[恶意文件名]&... - 获取Webshell:
- 利用链执行后会在指定位置写入Webshell
防御措施
- 升级到phpBB最新版本
- 严格过滤管理员面板的输入参数
- 对文件上传功能加强限制
- 使用强密码保护管理员账户
- 限制管理面板的访问IP