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

Wesley13
• 阅读 652

前言

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

xml序列化

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

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

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

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

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

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

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

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

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

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

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标签,按照上面的步骤解析,就完成了这一部分参数的解析。

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

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反序列漏洞

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

相关阅读 |java反序列化——apache-shiro复现分析

推荐阅读 |求职渗透测试没那么难,3个步骤助你应聘成功

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这