WebLogic XMLDecoder反序列化漏洞详细分析

前言

最近挖洞过程中,发现了一些反序列化的问题,然后然后呢。。。发现貌似智慧挖掘反序列化的漏洞,并不太清楚底层代码的原理是什么样子的,这样在和甲方大大battle的时候很被动呢!!!磕磕绊绊、一知半解的回答,甲方大大并不认可技术水平,那么为了刚入门的老铁们不要遇到和我一样的尴尬情况,就整理一篇可供基础入门或者深挖原理的小伙伴们观看吧。。。

实话实说,抓包分析原理这篇文真的快把我搞木得了。。。还是太菜了。。。

还是那句话,如果哪位大佬看到这篇文章,欢迎批评指正。非常欢迎大佬来指导!!!

WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)

漏洞利用说明:

攻击者可利用weblogic WLS LS组件的远程代码执行漏洞CVE-2017-10271,对企业服务器发起大范围远程攻击,对大量其要求的服务器造成了严重威胁。近期发现此漏洞的利用方式未传播挖矿程序。。。

受影响版本:

10.3.6.0.0, 12.1.3.0.0, 12.2.1.1.0, 12.2.1.2.0

CVE-2017-10271就是CVE-2017-3506的黑名单绕过操作,CVE-2017-3506本来可以执行对<Object>标签也进行反序列化命令执行,后来Oracle发布了关于CVE-2017-3506的补丁就是将<Object>加入黑名单。。。这种补丁防御对于java的相关防御是非常不安全的。所以就没有彻底修复这个XMLDecoder反序列化漏洞。。。

原理分析:

CVE-2017-10271漏洞主要是由Weblogic Server WLS组件远程命令执行漏洞,主要由wls-wsat.war触发该漏洞,Weblogic组件使用了自带的webservices处理程序来处理SOAP请求。通过WLLServletAdapter类进行处理,在WorkContentServerTube类中处理POST数据包中传递的XML数据.

即漏洞引发的原因是Weblogic“wls-wsat”组件在反序列化操作时使用了Oracle官方的JDK组件中“XMLDecoder”类进行XML反序列化操作引发了代码执行。也就说XMLDecoder类在解析XML文件的时候出现了反序列化问题。。。

其中,XMLDecoder类是用于读取使用XMLEncoder创建的XML文档。

XMLDecoder全过程分析

1.调用readObject()函数将xml文件进行反序列化

WebLogic XMLDecoder反序列化漏洞详细分析

WebLogic XMLDecoder反序列化漏洞详细分析1

readObject()方法根据parsingComplete()方法来决定返回值是array数组中的元素还是null

WebLogic XMLDecoder反序列化漏洞详细分析2

ParsingComplete()方法读取的xml文件内容的字节流是否为空,如果为空返回false;

判断存储object属性的数组是否为空,如果为空,判断AccessControlContext对象是否为空且是否系统安全管理也为空,如果均为空则抛出异常,提示”AccessControlContext对象没有建立”。。。

如果if语句均不满足,则返回True

WebLogic XMLDecoder反序列化漏洞详细分析3

WebLogic XMLDecoder反序列化漏洞详细分析4

WebLogic XMLDecoder反序列化漏洞详细分析5

WebLogic XMLDecoder反序列化漏洞详细分析6

WebLogic XMLDecoder反序列化漏洞详细分析7

WebLogic XMLDecoder反序列化漏洞详细分析8

WebLogic XMLDecoder反序列化漏洞详细分析9

。。。代码调用层比较深入。。。。

这前面的复杂的步骤,我们可以看成是XMLDecoder反序列化xml文件的准备步骤,其中有一点值得注意的是这准备步骤中是没有权限限制的。。。

  1. 调用startElement()方法

WebLogic XMLDecoder反序列化漏洞详细分析10

如上图代码所示,就已经读取到了xml文件的第一个标签<java>

WebLogic XMLDecoder反序列化漏洞详细分析11

接下来就是利用addAttribute()方法为将读取到的标签的所有属性赋予读取到的值喽。。。

WebLogic XMLDecoder反序列化漏洞详细分析12

WebLogic XMLDecoder反序列化漏洞详细分析13

WebLogic XMLDecoder反序列化漏洞详细分析14

经过上面的代码调用就读取到了第一个开始标签<java>的属性及属性值

读取完第一个开始标签<java>后,接下来仍然是调用startElement()方法来读取第二个标签<Object>(SAX模式读取xml文件就是将先利用startElement()读取所有开始标签,然后再调用endElement()读取所有结束标签)

WebLogic XMLDecoder反序列化漏洞详细分析15

WebLogic XMLDecoder反序列化漏洞详细分析16

读取结束标签是用endElement()方法

WebLogic XMLDecoder反序列化漏洞详细分析17

endElement方法中将调用getValueObject方法获取每一个标签所产生的对象对应的ValueObject实例

WebLogic XMLDecoder反序列化漏洞详细分析18

WebLogic XMLDecoder反序列化漏洞详细分析19

以上代码就是XMLDecoder()调用readObject()方法反序列化获取student对象的较详细的过程了。。。

那么,根据对上面代码的分析,我们可以发现在准备阶段java给这类反序列化过程赋予了无限制权限,并且在利用endElement()方法读取闭合结束标签的时候,利用getValueObject()方法获取了每对标签中定义的valueObject实例即读取了student对象的属性值,就完成了反序列化的过程。。。

那么DocumentHandler都可以读取哪些类型的标签呢?在其构造方法中已经写的明明白白:

WebLogic XMLDecoder反序列化漏洞详细分析20

漏洞复现过程

WebLogic XMLDecoder反序列化漏洞详细分析21

环境搭建成功!!!

  1. 初步判断

访问http://ip:7001/wls-wsat/CoordinatorPortType,存在下图则说明存在漏洞:

WebLogic XMLDecoder反序列化漏洞详细分析22

  1. 尝试抓取数据包,并向其中插入XML文档(test.txt)–构造POST数据包

将Content-Type修改为:text/xml, 并添加Cache-Control为no-cache

再写入text.txt文件的xml内容

WebLogic XMLDecoder反序列化漏洞详细分析23

3.构造POST包进行测试,写入txt

WebLogic XMLDecoder反序列化漏洞详细分析24

  1. 访问txt,页面显示如下,说明确实存在该weblogic XMLDecoder漏洞

WebLogic XMLDecoder反序列化漏洞详细分析25

总结

感谢飞速发展的互联网。。。让我在参考了各路大佬的文章后,总结出这么一篇自己觉得还能看的文章出来。。。参考的文章比较丰富,就不一一感谢了!!哈哈哈哈哈哈

好了,这篇关于weblogic反序列化漏洞原理分析和挖掘方式就分享到这里。。。大家下去记得做实验哦,如果实验搭建过程中遇到什么问题也可以交流哦。。。总之,还是一定要亲自动手去看实验现象,这样才能真正的理解原理。。加油,大佬们!!!

WebLogic XMLDecoder反序列化漏洞详细分析26

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
大佬不来一句? 抢沙发

请登录后发表评论