您当前的位置:首页 > 电脑百科 > 安全防护 > 网络安全

java反序列化——XMLDecoder反序列化漏洞

时间:2020-08-20 14:44:10  来源:  作者:

本文首发于“合天智汇”公众号 作者:Fortheone

前言

最近学习JAVA反序列化学到了weblogic部分,weblogic之前的两个反序列化漏洞不涉及T3协议之类的,只是涉及到了XMLDecoder反序列化导致漏洞,但是网上大部分的文章都只讲到了触发XMLDecoder部分就结束了,并没有讲为什么XMLDecoder会触发反序列化导致命令执行。于是带着好奇的我就跟着调了一下XMLDecoder的反序列化过程。

xml序列化

首先了解一下java中的XMLDecoder是什么。XMLDecoder就是jdk中一个用于处理xml数据的类,先看两个例子。

这里引用一下浅蓝表哥的(强推浅蓝表哥的博客https://b1ue.cn/

import java.beans.XMLEncoder;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * @author 浅蓝
 * @email blue@ixsec.org
 * @since 2019/4/24 12:09
 */
public class Test {

    public static void main(String[] args) throws IOException, InterruptedException {

        HashMap<Object, Object> map = new HashMap<>();
        map.put("123","aaaa");
        map.put("321",new ArrayList<>());

        XMLEncoder xmlEncoder = new XMLEncoder(System.out);
        xmlEncoder.writeObject(map);
        xmlEncoder.close();

    }
}
java反序列化——XMLDecoder反序列化漏洞

 

这样就把map对象变成了xml数据,再使用XMLDecoder解析一下。

/**
 * @author 浅蓝
 * @email blue@ixsec.org
 * @since 2019/4/24 12:09
 */
public class Test {

    public static void main(String[] args) throws IOException, InterruptedException {
        String s = "<java version="1.8.0_131" class="java.beans.XMLDecoder">n" +
                " <object class="java.util.HashMap">n" +
                "  <void method="put">n" +
                "   <string>123</string>n" +
                "   <string>aaaa</string>n" +
                "  </void>n" +
                "  <void method="put">n" +
                "   <string>321</string>n" +
                "   <object class="java.util.ArrayList"/>n" +
                "  </void>n" +
                " </object>n" +
                "</java>";
        StringBufferInputStream stringBufferInputStream = new StringBufferInputStream(s);
        XMLDecoder xmlDecoder = new XMLDecoder(stringBufferInputStream);
        Object o = xmlDecoder.readObject();
        System.out.println(o);

    }
}
java反序列化——XMLDecoder反序列化漏洞

 

就可以把之前的xml数据反序列化回map对象,那么如果对xml数据进行修改,使其变成一个执行命令的数据。比如说:

<java version="1.7.0_80" class="java.beans.XMLDecoder">
 <object class="java.lang.ProcessBuilder">
  <array class="java.lang.String" length="1">
    <void index="0"><string>calc</string></void>
  </array>
  <void method="start"></void>
 </object>
</java>

然后对其反序列化即可执行命令弹出计算器。

java反序列化——XMLDecoder反序列化漏洞

 

现在我们知道了如果使用XMLDecoder去反序列化xml数据,数据中包含的命令会被执行。接下来就对其进行分析一下。

XMLDecoder反序列化漏洞成因

一、XML数据解析前的函数处理

java反序列化——XMLDecoder反序列化漏洞

 

在readObject处打上断点开始debug

java反序列化——XMLDecoder反序列化漏洞

 

进入了parsingComplete方法,跟进。

java反序列化——XMLDecoder反序列化漏洞

 

其中使用XMLDecoder的handler属性DocumentHandler的parse方法,并且传入了我们输入的xml数据,跟进。

java反序列化——XMLDecoder反序列化漏洞

 

这里调用了SAXParserImpl类的parse方法。

java反序列化——XMLDecoder反序列化漏洞

 

然后又进了xmlReader的parse方法。

java反序列化——XMLDecoder反序列化漏洞

 

这里又调用了xmlReader父类AbstractSAXParser的parser方法。

java反序列化——XMLDecoder反序列化漏洞

 

最后进入了XML11Configuration类的parse方法。

二、XML数据的处理

java反序列化——XMLDecoder反序列化漏洞

 

在XML11Configuration中进行了很多解析XML之前的操作,我们不去仔细研究,看到处理XML数据的函数scanDocument。跟进查看

java反序列化——XMLDecoder反序列化漏洞

 

这个函数通过迭代的方式对XML数据的标签进行解析,网上有些文章写道“解析至END_ELEMENT时跟进调试”,但是我看了一下我这里的END_ELEMENT。

java反序列化——XMLDecoder反序列化漏洞

 

里面没有函数可以跟进啊,然后搜了一些其他的文章,是因为jdk版本的问题,处理的逻辑放在了next函数里。在do while循环里跳了大概十次,就开始解析了xml的标签。

java反序列化——XMLDecoder反序列化漏洞

 

跳到XMLDocumentScannerImpl中的next方法

java反序列化——XMLDecoder反序列化漏洞

 

跳到XMLDocumentFragmentScannerImpl中的next方法,解析到endtag时会走到scanEndElement方法里。

然后就到了网上说的endElement方法里,跟进。

java反序列化——XMLDecoder反序列化漏洞

 

这一部分的解析可以参考下图:

java反序列化——XMLDecoder反序列化漏洞

 

也就是说解析时会按照标签一个一个解析。

java反序列化——XMLDecoder反序列化漏洞

 

这里调用了DocumentHandler的endElement方法。接下来就是很重要的部分

java反序列化——XMLDecoder反序列化漏洞

 


java反序列化——XMLDecoder反序列化漏洞

 

这里的handler是StringElementHandler,但是这个类没有重写endElement方法,所以调用的是父类ElementHandler的endElement方法,其中调用了getValueObject来获取标签中的value值,这里的标签是string标签,所以获取到的值是calc。

java反序列化——XMLDecoder反序列化漏洞

 


java反序列化——XMLDecoder反序列化漏洞

 

然后将其添加到其父类标签VoidElementHandler的Argument属性中。

java反序列化——XMLDecoder反序列化漏洞

 

然后将handler指向其父类VoidElementHandler。

java反序列化——XMLDecoder反序列化漏洞

 

继续解析到void标签,此时的handler就是VoidElementHandler,接着调用getValueObject。但是因为没有重写该方法,所以调用父类NewElementHandler的getValueObject。

java反序列化——XMLDecoder反序列化漏洞

 


java反序列化——XMLDecoder反序列化漏洞

 

继续跟进发现实现了反射调用invoke方法,也就是执行了set方法。接着再解析Array标签,按照上面的步骤解析,就完成了这一部分参数的解析。

<array class="java.lang.String"length="1">
  <void index="0">
      <string>calc</string>
  </void>
</array>
java反序列化——XMLDecoder反序列化漏洞

 

那么再按照上面的步骤解析object标签,然后调用new 方法实例化 ProcessBuilder类。

java反序列化——XMLDecoder反序列化漏洞

 

然后解析到void标签获取到start方法,然后通过调用start方法实现了命令执行,弹出计算器。

也就相当于最后拼接了 new java.lang.ProcessBuilder(new String[]{"calc"}).start();

java反序列化——XMLDecoder反序列化漏洞

 

文章有说的不对的地方请师傅们指点,刚开始学java,大佬们轻喷。。。

参考文章

https://b1ue.cn/archives/239.html

https://zhuanlan.zhihu.com/p/108754274

https://blog.csdn.net/SKI_12/article/details/85058040

相关实验

Java反序列漏洞

https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182015111916202700001

(本实验通过Apache Commons Collections 3为例,分析并复现JAVA反序列化漏洞。)



Tags:反序列化漏洞   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言phar反序列化漏洞很久之前就开始接触了;因为当时出了点问题导致一直无法成功,所以当时直接去学习其他的漏洞了;今天觉得是时候把这个漏洞补上去了;漏洞成因phar文件会以序列...【详细内容】
2021-07-16  Tags: 反序列化漏洞  点击:(99)  评论:(0)  加入收藏
0&times;01:序列化基本概念 序列化:将对象写入IO流中 反序列化:从IO流中恢复对象 意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通...【详细内容】
2021-06-11  Tags: 反序列化漏洞  点击:(151)  评论:(0)  加入收藏
最近学习java反序列化学到了weblogic部分,weblogic之前的两个反序列化漏洞不涉及T3协议之类的,只是涉及到了XMLDecoder反序列化导致漏洞,但是网上大部分的文章都只讲到了触发XMLDecoder部分就结束了,并没有讲为什么XMLDec...【详细内容】
2020-08-20  Tags: 反序列化漏洞  点击:(122)  评论:(0)  加入收藏
CVE-2020-7961_Liferay Portal反序列化过程复现。漏洞说明Liferay是一个开源的Portal产品,提供对多个独立系统的内容集成,为企业信息、流程等的整合提供了一套完整的解决方...【详细内容】
2020-08-10  Tags: 反序列化漏洞  点击:(148)  评论:(0)  加入收藏
写在前面今天收到运维人员的反馈,说程序有漏洞,如下图: 哎,不查不知道,一查吓一跳。发现两个问题!!Apache Shiro是一个强大且易用的Java安全框架,被用来执行身份验证、授权、密码...【详细内容】
2020-07-30  Tags: 反序列化漏洞  点击:(3307)  评论:(0)  加入收藏
fastjson 是 java 中常用的一个用来序列化反序列化 JSON 数据的库。因其优异的性能表现,在 java web 开放中应用比较广泛。最近需要写一个 fastjson 的检测插件,稍微研究了一...【详细内容】
2019-12-25  Tags: 反序列化漏洞  点击:(160)  评论:(0)  加入收藏
Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够...【详细内容】
2019-08-16  Tags: 反序列化漏洞  点击:(300)  评论:(0)  加入收藏
▌简易百科推荐
(报告出品方:德勤)数字化转型网络安全及转型挑战在任何行业,保持竞争力都需要快速开发新产品和 服务并推向市场。创新型业务模式不仅仅是简单地将现有 流程数字化,其正在覆盖供应...【详细内容】
2021-12-22  认是    Tags:网络安全   点击:(19)  评论:(0)  加入收藏
10月18号, W3C中网络平台孵化器小组(Web Platform Incubator Community Group)公布了HTML Sanitizer API的规范草案。这份草案用来解决浏览器如何解决XSS攻击问题。 网络安全中...【详细内容】
2021-12-07  实战Java  博客园  Tags:脚本攻击   点击:(18)  评论:(0)  加入收藏
一、背景介绍大家在Linux的日常使用中都晓得如何通过命令行去配置Linux的端口开放规则,但是大家知道如何配置Windows入站出站规则吗?有哪些常见的危险端口呢?如何解决上述问题...【详细内容】
2021-12-01  Kali与编程    Tags:防火墙   点击:(30)  评论:(0)  加入收藏
网络安全服务商Randori公司日前发布了一份调查报告,列出了网络攻击者最有可能攻击或利用的IT资产。在遭遇Solarwinds黑客攻击一周年之际,以及在网络安全(尤其是勒索软件和供应...【详细内容】
2021-10-28  企业网D1net   企鹅号  Tags:网络攻击   点击:(57)  评论:(0)  加入收藏
0x01.背景实验利用Dns Administrators 组成员,通过远程配置Dns服务,进行Dll inject从而实现特权提升。 在域内,Dns server 通常为Dc Server,Dns服务器管理基于rpc,通过调用c:\wi...【详细内容】
2021-10-22  IT影子    Tags:特权提升   点击:(37)  评论:(0)  加入收藏
本文主要介绍和总结了CSRF跨站请求伪造的基本原理和主要防范措施,工作中有用到的朋友不妨收藏转发一下,以备您参考。什么是CSRF?CSRF跨站点请求伪造(Cross&mdash;Site Request...【详细内容】
2021-10-13  快乐中恒    Tags:CSRF   点击:(49)  评论:(0)  加入收藏
waf拦截在打某市 Hvv 第一天就找到一个文件上传的点,经过测试,可以直接任意文件上传,没有什么道理。 直接尝试上传 Php 文件,被 waf 拦截了 2021最新整理网络安全/渗透测试/安...【详细内容】
2021-10-11  KaliMa    Tags:防火墙   点击:(56)  评论:(0)  加入收藏
应用程序与文件系统的交互始终是高度安全敏感的,因为较小的功能漏洞很容易成为可利用漏洞的来源。这种观察在web文件管理器的情况下尤其正确,其作用是复制完整文件系统的功能...【详细内容】
2021-09-17  IT野涵    Tags:漏洞链   点击:(56)  评论:(0)  加入收藏
您的苹果手机尽管iPhone比Android更安全,但也可以通过各种方式入侵。避免黑客入侵的最佳方法是警惕奇怪的链接或粗略的应用程序,并仅在必要时提供信息。电池寿命差和性能低下...【详细内容】
2021-09-16  Hackers爱好者    Tags:黑客入侵   点击:(631)  评论:(0)  加入收藏
防火墙一般布置在逻辑区域的入口处,位于三层网络架构的核心和汇聚之间,起到隔离逻辑区域,为逻辑区域创建安全策略的作用。 上面就是应用区的防火墙布置方式,他布置在应用区,可以...【详细内容】
2021-09-03  知来知去    Tags:主备模式防火墙   点击:(109)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条