WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE
参考安恒的文章
# 复现
# 分析
在coherence包中 com.tangosol.io.ExternalizableLite
存在反序列化接口
其借助com.tangosol.io.ExternalizableLite
实现序列化反序列化逻辑
在ExternalizableLite中有readObjcet()
readObjectInternal()会根据nType进入不同的反序列化函数
其中nType在writeObject中由getStreamFormat()决定。
代码如下
|
|
10对应的是实现了ExternalizableLite接口的类。继续跟进readExternalizableLite(),其使用loadClass进行加载类,不受weblogic黑名单限制。
那么现在就可以调用黑名单类中的 readExternal 方法,作者使用的是之前漏洞中使用过的com.tangosol.coherence.rest.util.extractor.MvelExtractor
,它实现了ExternalizableLite接口。
在其MvelExtractor的readExternal()中进行了m_sExpr表达式赋值,而m_sExpr是可控的。
那么只需要触发extract方法就行了。
现在就在于如何触发extract方法。找到com.tangosol.util.aggregator.TopNAggregator.PartialResult
类,在他的readExternal()中
会自动触发this.instantiateInternalMap(this.m_comparator)
这里返回一个map,而其中的comparator可控为我们的MvelExtractor。回头再看上图for循环中的this.add(ExternalizableHelper.readObject(in))
add()方法
跟进 super.add(value) com.tangosol.util.SortedBag#add
从自身拿到一个map
然后进行map.put,跟进java.util.TreeMap#put
然后
这里进入到MvelExtractor父类的com.tangosol.util.extractor.AbstractExtractor#compare
方法,调用了extract方法。
然后就成了,但是还有个问题,com.tangosol.util.aggregator.TopNAggregator.PartialResult
类并没有实现ExternalizableLite接口,因此readExternal在反序列化时不会被触发,所以需要寻找一个实现了Externalizable接口的类,并能调用ExternalizableHelper.readObject方法。
找到com.tangosol.coherence.servlet.AttributeHolder#readExternal(java.io.DataInput)
在其readExternal调用了ExternalizableHelper.readObject,可以触发PartialResult的readExternal。
堆栈
# EXP
# 思考
在com.tangosol.util.ExternalizableHelper#readObjectInternal中nType有多种类型
其他的case应该也有漏洞吧
# 参考
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。
如果你觉得这篇文章对你有所帮助,欢迎赞赏或关注微信公众号~