某cms命令执行绕过分析
字数 1279 2025-08-06 08:35:06

CraftCMS 4.4.14 服务器端模板注入漏洞分析与利用

漏洞概述

CraftCMS 4.4.14版本存在一个服务器端模板注入(SSTI)漏洞,经过身份验证的攻击者可以绕过路径过滤设置模板目录,将任意文件上传至Twig模板目录中,从而导致模板注入进而造成远程代码执行(RCE)。

环境搭建

  1. 系统要求:

    • Linux系统
    • PHP版本高于8.0
    • Apache中间件
  2. 安装步骤:

composer create -y --no-scripts craftcms/craft=4.4.14
php craft setup

安装过程中需要设置数据库信息和管理员密码,安装完成后会自动导入数据库。

漏洞复现与分析

1. 设置Filesystem绕过路径验证

  1. 进入后台 → Settings → Filesystem
  2. 创建新的Filesystem配置:
    • Name和Handle可任意填写
    • Base Path使用file://协议绕过路径验证(仅限Linux系统)

绕过原理

  • 系统通过validatePath方法检测路径
  • 在Windows下,file://会被替换为file:\\导致无法绕过
  • 在Linux下,file://协议会直接跳过路径验证

2. 创建Asset Volume

  1. 进入后台 → Settings → Assets
  2. 创建新的Volume:
    • Name和Handle可任意填写
    • Filesystem选择之前创建的Filesystem
  3. 保存配置

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. 设置路由

  1. 进入后台 → Settings → Routes
  2. 创建新路由:
    • URI可设置为test*
    • Template选择上传的恶意模板文件

5. 触发漏洞

访问设置的路由即可执行命令,实现RCE。

技术细节

路径验证绕过

validatePath方法会:

  1. 获取系统路径列表(包括模板目录)
  2. 将输入路径与系统路径比较
  3. 如果匹配则报错"Local volumes cannot be located within system directories"

file://协议绕过:

  • Linux:直接跳过路径验证
  • Windows:协议被转换为file:\\导致无法绕过

Twig模板注入

利用Twig 3.x的特性:

  1. map过滤器可以调用任意函数
  2. 通过system函数执行系统命令
  3. join过滤器确保结果可显示

修复方案

官方修复方式:

  • 对输入的路径移除最左边的file://协议头

总结

该漏洞需要满足以下条件:

  1. 攻击者具有后台访问权限
  2. 系统运行在Linux环境下
  3. 使用CraftCMS 4.4.14版本

漏洞利用链:

  1. 绕过路径验证设置恶意Filesystem
  2. 创建Asset Volume指向模板目录
  3. 上传包含Twig注入代码的模板文件
  4. 设置路由指向恶意模板
  5. 访问路由触发RCE
CraftCMS 4.4.14 服务器端模板注入漏洞分析与利用 漏洞概述 CraftCMS 4.4.14版本存在一个服务器端模板注入(SSTI)漏洞,经过身份验证的攻击者可以绕过路径过滤设置模板目录,将任意文件上传至Twig模板目录中,从而导致模板注入进而造成远程代码执行(RCE)。 环境搭建 系统要求: Linux系统 PHP版本高于8.0 Apache中间件 安装步骤: 安装过程中需要设置数据库信息和管理员密码,安装完成后会自动导入数据库。 漏洞复现与分析 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: Payload解析 : map 过滤器会将数组元素传递给指定函数(此处为 system ) join 过滤器将结果数组转换为字符串 在Twig 3.x中, map 过滤器会编译为 twig_array_map ,然后执行 twig_join_filter 4. 设置路由 进入后台 → Settings → Routes 创建新路由: URI可设置为 test 或 * Template选择上传的恶意模板文件 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