某cms模板渲染导致rce漏洞分析
字数 774 2025-08-18 11:36:48

ThinkPHP CMS 模板渲染导致RCE漏洞分析

0x01 前置知识

模板渲染机制

  • 模板渲染是网站开发中常用技术,实现动态生成页面内容
  • ThinkPHP中使用\think\View类的fetch方法进行模板渲染
  • 可通过自定义模板引擎标签扩展和定制渲染标签

模板编译过程

  1. 由compiler进行编译
  2. 解析模板文件中的模板标签语法为PHP可执行代码
  3. 生成PHP文件并执行

TagLib(标签库)作用

  • 提供自定义和扩展模板引擎标签的机制
  • 允许开发者定义自己的模板标签
  • 通过继承TagLib类实现自定义标签

0x02 漏洞分析

漏洞环境

  • 基于ThinkPHP5开发的CMS系统
  • 配置中使用了自定义标签库

关键调用栈

TagLib.php:181, think\template\TagLib->parseTag()
Template.php:685, think\Template->parseTagLib()
Template.php:397, think\Template->parse()
Template.php:333, think\Template->compiler()
Template.php:182, think\Template->fetch()
Think.php:86, think\view\driver\Think->fetch()
View.php:163, think\View->fetch()
Controller.php:120, think\Controller->fetch()
Index.php:16, app\wap\controller\Index->index()
App.php:343, ReflectionMethod->invokeArgs()
App.php:343, think\App::invokeMethod()
App.php:611, think\App::module()
App.php:457, think\App::exec()
App.php:139, think\App::run()
start.php:19, require()
index.php:8, {main}()

漏洞点分析

  1. parseTag方法处理闭合标签和自闭合标签
  2. app/wap/taglib/Yunu.php中查找close值为0的标签(自闭合标签)
  3. 发现tagConfig方法中存在可控参数
  4. wapurl标签调用get_wapurl获取当前页面URL
  5. 最终将URL拼接到PHP代码中

关键代码

// 获取URL并拼接
$confstr = get_wapurl();
// 拼接PHP代码
$result = '<?php echo "'.$confstr.'"; ?>';

0x03 漏洞利用

利用条件

  1. 使用<yunu:config name='wapurl'标签的模板文件
  2. 模板文件位于wap/index_index.html

利用步骤

  1. 构造Payload:
http://127.0.0.1/index.php?s=wap/index/index&asdasd=aa";phpinfo();//
  1. 注意浏览器会自动URL编码,需使用Burp或Yakit等工具直接发送原始请求

防护措施

  1. 对用户输入进行严格过滤
  2. 避免直接将用户输入拼接到PHP代码中
  3. 使用安全的模板渲染方式
  4. 更新到最新版本的框架

总结

该漏洞源于ThinkPHP CMS在模板渲染过程中,对用户输入处理不当,导致攻击者可通过精心构造的URL实现远程代码执行。开发人员应特别注意模板渲染过程中的用户输入处理,避免直接将用户可控数据拼接到可执行代码中。

ThinkPHP CMS 模板渲染导致RCE漏洞分析 0x01 前置知识 模板渲染机制 模板渲染是网站开发中常用技术,实现动态生成页面内容 ThinkPHP中使用 \think\View 类的 fetch 方法进行模板渲染 可通过自定义模板引擎标签扩展和定制渲染标签 模板编译过程 由compiler进行编译 解析模板文件中的模板标签语法为PHP可执行代码 生成PHP文件并执行 TagLib(标签库)作用 提供自定义和扩展模板引擎标签的机制 允许开发者定义自己的模板标签 通过继承 TagLib 类实现自定义标签 0x02 漏洞分析 漏洞环境 基于ThinkPHP5开发的CMS系统 配置中使用了自定义标签库 关键调用栈 漏洞点分析 parseTag 方法处理闭合标签和自闭合标签 在 app/wap/taglib/Yunu.php 中查找 close 值为0的标签(自闭合标签) 发现 tagConfig 方法中存在可控参数 wapurl 标签调用 get_wapurl 获取当前页面URL 最终将URL拼接到PHP代码中 关键代码 0x03 漏洞利用 利用条件 使用 <yunu:config name='wapurl' 标签的模板文件 模板文件位于 wap/index_index.html 利用步骤 构造Payload: 注意浏览器会自动URL编码,需使用Burp或Yakit等工具直接发送原始请求 防护措施 对用户输入进行严格过滤 避免直接将用户输入拼接到PHP代码中 使用安全的模板渲染方式 更新到最新版本的框架 总结 该漏洞源于ThinkPHP CMS在模板渲染过程中,对用户输入处理不当,导致攻击者可通过精心构造的URL实现远程代码执行。开发人员应特别注意模板渲染过程中的用户输入处理,避免直接将用户可控数据拼接到可执行代码中。