某cms模板渲染导致rce漏洞分析
字数 774 2025-08-18 11:36:48
ThinkPHP CMS 模板渲染导致RCE漏洞分析
0x01 前置知识
模板渲染机制
- 模板渲染是网站开发中常用技术,实现动态生成页面内容
- ThinkPHP中使用
\think\View类的fetch方法进行模板渲染 - 可通过自定义模板引擎标签扩展和定制渲染标签
模板编译过程
- 由compiler进行编译
- 解析模板文件中的模板标签语法为PHP可执行代码
- 生成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}()
漏洞点分析
parseTag方法处理闭合标签和自闭合标签- 在
app/wap/taglib/Yunu.php中查找close值为0的标签(自闭合标签) - 发现
tagConfig方法中存在可控参数 wapurl标签调用get_wapurl获取当前页面URL- 最终将URL拼接到PHP代码中
关键代码
// 获取URL并拼接
$confstr = get_wapurl();
// 拼接PHP代码
$result = '<?php echo "'.$confstr.'"; ?>';
0x03 漏洞利用
利用条件
- 使用
<yunu:config name='wapurl'标签的模板文件 - 模板文件位于
wap/index_index.html
利用步骤
- 构造Payload:
http://127.0.0.1/index.php?s=wap/index/index&asdasd=aa";phpinfo();//
- 注意浏览器会自动URL编码,需使用Burp或Yakit等工具直接发送原始请求
防护措施
- 对用户输入进行严格过滤
- 避免直接将用户输入拼接到PHP代码中
- 使用安全的模板渲染方式
- 更新到最新版本的框架
总结
该漏洞源于ThinkPHP CMS在模板渲染过程中,对用户输入处理不当,导致攻击者可通过精心构造的URL实现远程代码执行。开发人员应特别注意模板渲染过程中的用户输入处理,避免直接将用户可控数据拼接到可执行代码中。