文章插图
这个函数通过迭代的方式对XML数据的标签进行解析,网上有些文章写道“解析至END_ELEMENT时跟进调试”,但是我看了一下我这里的END_ELEMENT 。
文章插图
里面没有函数可以跟进啊,然后搜了一些其他的文章,是因为jdk版本的问题,处理的逻辑放在了next函数里 。在do while循环里跳了大概十次,就开始解析了xml的标签 。
文章插图
跳到XMLDocumentScannerImpl中的next方法
文章插图
跳到XMLDocumentFragmentScannerImpl中的next方法,解析到endtag时会走到scanEndElement方法里 。
然后就到了网上说的endElement方法里,跟进 。
文章插图
这一部分的解析可以参考下图:
文章插图
也就是说解析时会按照标签一个一个解析 。
文章插图
这里调用了DocumentHandler的endElement方法 。接下来就是很重要的部分
文章插图
文章插图
这里的handler是StringElementHandler,但是这个类没有重写endElement方法,所以调用的是父类ElementHandler的endElement方法,其中调用了getValueObject来获取标签中的value值,这里的标签是string标签,所以获取到的值是calc 。
文章插图
文章插图
然后将其添加到其父类标签VoidElementHandler的Argument属性中 。
文章插图
然后将handler指向其父类VoidElementHandler 。
文章插图
继续解析到void标签,此时的handler就是VoidElementHandler,接着调用getValueObject 。但是因为没有重写该方法,所以调用父类NewElementHandler的getValueObject 。
文章插图
文章插图
【java反序列化——XMLDecoder反序列化漏洞】继续跟进发现实现了反射调用invoke方法,也就是执行了set方法 。接着再解析Array标签,按照上面的步骤解析,就完成了这一部分参数的解析 。
<array class="java.lang.String"length="1"><void index="0"><string>calc</string></void></array>
文章插图
那么再按照上面的步骤解析object标签,然后调用new 方法实例化 ProcessBuilder类 。
文章插图
然后解析到void标签获取到start方法,然后通过调用start方法实现了命令执行,弹出计算器 。
也就相当于最后拼接了 new java.lang.ProcessBuilder(new String[]{"calc"}).start();
文章插图
文章有说的不对的地方请师傅们指点,刚开始学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反序列化漏洞 。)
推荐阅读
- Java进阶知识,轻松理解Java泛型
- 完全基于 Java 的开源深度学习平台,亚马逊的大佬带你上手
- JavaScript 中如何检查对象为空
- 秦国统一六国齐国真的没有反抗吗? 齐国向秦国投降
- 李鸿章为什么不反清朝 光绪和李鸿章的关系
- 刘邦怀疑韩信谋反捕捉韩信后 韩信当时反叛刘邦可以得天下吗
- 关于Spring IoC的那些事
- 平南候与狄仁杰谁大 狄仁杰谋反
- 胆汁反流性胃炎治疗
- 现代Web开发中的JavaScript音频库——howler.js