java反序列化——XMLDecoder反序列化漏洞( 二 )

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

文章插图
 
【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反序列化漏洞 。)




推荐阅读