某cms命令执行绕过分析
字数 1279 2025-08-06 08:35:06
CraftCMS 4.4.14 服务器端模板注入漏洞分析与利用
漏洞概述
CraftCMS 4.4.14版本存在一个服务器端模板注入(SSTI)漏洞,经过身份验证的攻击者可以绕过路径过滤设置模板目录,将任意文件上传至Twig模板目录中,从而导致模板注入进而造成远程代码执行(RCE)。
环境搭建
-
系统要求:
- Linux系统
- PHP版本高于8.0
- Apache中间件
-
安装步骤:
composer create -y --no-scripts craftcms/craft=4.4.14
php craft setup
安装过程中需要设置数据库信息和管理员密码,安装完成后会自动导入数据库。
漏洞复现与分析
1. 设置Filesystem绕过路径验证
- 进入后台 → Settings → Filesystem
- 创建新的Filesystem配置:
- Name和Handle可任意填写
- Base Path使用
file://协议绕过路径验证(仅限Linux系统)
绕过原理:
- 系统通过
validatePath方法检测路径 - 在Windows下,
file://会被替换为file:\\导致无法绕过 - 在Linux下,
file://协议会直接跳过路径验证
2. 创建Asset Volume
- 进入后台 → Settings → Assets
- 创建新的Volume:
- Name和Handle可任意填写
- Filesystem选择之前创建的Filesystem
- 保存配置
3. 上传恶意模板文件
构造Twig模板注入Payload:
{{ 123 * 123 }}
{{[ 'whoami' ]|map('system')|join}}
{{[ 'id' ]|map('system')|join}}
Payload解析:
map过滤器会将数组元素传递给指定函数(此处为system)join过滤器将结果数组转换为字符串- 在Twig 3.x中,
map过滤器会编译为twig_array_map,然后执行twig_join_filter
4. 设置路由
- 进入后台 → Settings → Routes
- 创建新路由:
- URI可设置为
test或* - Template选择上传的恶意模板文件
- URI可设置为
5. 触发漏洞
访问设置的路由即可执行命令,实现RCE。
技术细节
路径验证绕过
validatePath方法会:
- 获取系统路径列表(包括模板目录)
- 将输入路径与系统路径比较
- 如果匹配则报错"Local volumes cannot be located within system directories"
file://协议绕过:
- Linux:直接跳过路径验证
- Windows:协议被转换为
file:\\导致无法绕过
Twig模板注入
利用Twig 3.x的特性:
map过滤器可以调用任意函数- 通过
system函数执行系统命令 join过滤器确保结果可显示
修复方案
官方修复方式:
- 对输入的路径移除最左边的
file://协议头
总结
该漏洞需要满足以下条件:
- 攻击者具有后台访问权限
- 系统运行在Linux环境下
- 使用CraftCMS 4.4.14版本
漏洞利用链:
- 绕过路径验证设置恶意Filesystem
- 创建Asset Volume指向模板目录
- 上传包含Twig注入代码的模板文件
- 设置路由指向恶意模板
- 访问路由触发RCE