[Java安全]XMLDecoder反序列化漏洞解析流程分析
Posted Y4tacker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java安全]XMLDecoder反序列化漏洞解析流程分析相关的知识,希望对你有一定的参考价值。
写在前面
调试了很多天大概是知道咋回事了,太难力,写给自己看
XMLDecoder反序列化漏洞解析流程分析
首先,XMLDecoder就是jdk中一个用于处理xml数据的类
首先创建一个xml文件
<java>
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="1">
<void index="0">
<string>calc</string>
</void>
</array>
<void method="start"/>
</object>
</java>
打上断点
进入了parsingComplete方法,跟进
继续跟进,其中使用parse方法,并且传入了我们输入的xml数据
继续跟进真个parse函数
is参数非空,继续跟进
调用了父类的parse方法
继续跟进parse
略过几步到达scanDocument
再跳过几步到达
跟进
继续
这里的handler是StringElementHandler,但是这个类没有重写endElement方法,所以调用的是父类ElementHandler的endElement方法,其中调用了getValueObject来获取标签中的value值,这里的标签是string标签,所以获取到的值是calc。
然后将其添加到其父类标签VoidElementHandler的Argument属性中。
然后将handler指向其父类VoidElementHandler
继续解析到void标签,此时的handler就是VoidElementHandler,接着调用getValueObject。但是因为没有重写该方法,所以调用父类NewElementHandler的getValueObject。
继续跟进发现实现了反射调用invoke方法,也就是执行了set方法。接着再解析Array标签,按照上面的步骤解析,就完成了这一部分参数的解析
<array class="java.lang.String"length="1">
<void index="0">
<string>calc</string>
</void>
</array>
那么再按照上面的步骤解析object标签,然后调用new 方法实例化 ProcessBuilder类。
之后解析到void标签获取到start方法,然后通过调用start方法实现了命令执行,弹出计算器。
参考文章
https://paper.seebug.org/916/
以上是关于[Java安全]XMLDecoder反序列化漏洞解析流程分析的主要内容,如果未能解决你的问题,请参考以下文章