简单的水一篇
这两天网上公布了CVE-2019-2725的补丁使用array标签+method属性来获取Class的绕过,这里简单分析一下。
由于JDK1.7以上的XMLDecoder对每种标签支持的属性有严格的限制,所以此方法只适用于JDK1.6。
看本文之前建议先了解一下XMLDecoder的解析流程。
XMLDecoder解析流程分析
虽然文章写的是jdk1.7以上的,但是大体流程差异不大。
Weblogic 10.3.6默认自带JDK1.6,但是可以选择使用系统中的JDK,有一定影响。
Weblogic 12以上要求JDK版本>1.6,所以这版本就没影响了。(感谢pyn3rd师傅提醒)
测试代码:
public static void main(String[] args) throws FileNotFoundException {String filename = l";XMLDecoder XD =new XMLDecoder(new FileInputStream(filename));Object o = XD.readObject();System.out.println(o);}
输入的XML
<java>
<array method="forName">
<string&plink.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函数调用,开头流程如下:
可以看到jdk1.6下会获取method标签的内容,并将其设置给创建的Expression对象,此处将method设置为了forName。
继续往下走,进入处理专门处理array标签的代码:
由于我们的array标签没有设置length属性由于我们的array标签没有设置length,所以var11此处为null,而后会Expression的Target设置为一个Class对象,最终本函数会将调用Class.forName的Expression对象压入表达式栈中。
后续步骤就剩下向该表达式添加类名参数并调用来获取class对象,最后进行实例化,此处就不说了。
水水更健康。
本文发布于:2024-01-27 17:54:59,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063492991759.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |