本文转载自:https://zhuanlan.zhihu.com/p/32301092
0x00 前言
几天前,国内外的几家安全厂商都在陆续跟进这个漏洞。我本人并不擅长Java相关的安全问题,但看到近年来无论是Struts2、Spring还是weblogic这些都相继曝出过高危漏洞。便想着跟着分析一波,学习下。分析下漏洞的原理,有句古话说的好,谋上者居其中,谋中者居其下。那着挖0day的心,把漏洞分析清楚了,最后哪怕没有0day,但是可以根据漏洞补丁分析出漏洞成因,根据exploit可以稳准狠的搞定目标服务器,也算是一种收获吧。
如果你也正在分析这个漏洞,并且恰好看到了这篇文章,希望你看了这篇文章后能有所收获,同时如有谬误,还请不吝赐教。
0x01 基础环境
WebLogic 10.3.6.0
Windows 7 x64
JDK 1.8.0_144
PoC
JD-GUI
作为一个新玩家,要想分析一个漏洞,两样东西是必不可少的,1个是存在漏洞的环境(用于还原漏洞现场),另1个是相应的PoC。
WebLogic 10.3.6.0下载地址:http://www.oracle.com/technetwork/cn/middleware/weblogic/downloads/wls-main-091116-zhs.html
0x02 漏洞复现
这里直接拿指尖安全的Bearcat师傅给我的exploit做演示了,感谢Bearcat师傅对我的帮助。
0x03 漏洞分析
漏洞分析部分安全客的大佬已经在几天前分析清楚了,我这边主要是跟一下流程,顺便膜拜一发。
漏洞触发位置:wls-wsat.war
漏洞触发URL:/wls-wsat/CoordinatorPortType(POST)
漏洞的本质:构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞
反编译weblogic.jar包
由于该项目并不是开源项目,所以需要将weblogic.jar包,反编译后分析源码。这里我使用JD-GUI进行反编译。
分析漏洞调用链
weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest
weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld
weblogic.wsee.workarea.WorkContextXmlInputAdapter
先看一下weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest方法
第43行,将localHeader1变量带入到readHeaderOld()方法中。localHeader1变量由第41行定义,其值为标签包裹的数据。
跟进readHeaderOld()方法(weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld)
在106行,有一句new
WorkContextXmlInputAdapter(new
ByteArrayInputStream(localByteArrayOutputStream.toByteArray())),创建了WorkContextXmlInputAdapter()对象(即对WorkContextXmlInputAdapter类进行了实例化),带入构造函数的参数即为传入的XML格式序列化数据。
跟进至WorkContextXmlInputAdapter类中(weblogic.wsee.workarea.WorkContextXmlInputAdapter )
第19行,此处通过XMLDecoder反序列化,输入内容可控,故漏洞产生。
0x04 后记
关于影响版本、修复建议等更多详细内容可以在参考链接中获取,这里就不一一赘述了。
利用下午的时间和晓瑞师傅分析了下这个漏洞,从最初的环境搭建到复现分析,收获很多。
感谢xxlegend师傅、tomato师傅、Bearcat师傅、晓瑞师傅的帮助。
0x05 参考链接
【漏洞预警】Oracle WebLogic wls-wsat RCE CVE-2017-10271 & CVE-2017-3506