本文首发于“合天智汇”公众号 作者:Fortheone
前言最近学习JAVA反序列化学到了weblogic部分,weblogic之前的两个反序列化漏洞不涉及T3协议之类的,只是涉及到了XMLDecoder反序列化导致漏洞,但是网上大部分的文章都只讲到了触发XMLDecoder部分就结束了,并没有讲为什么XMLDecoder会触发反序列化导致命令执行 。于是带着好奇的我就跟着调了一下XMLDecoder的反序列化过程 。
xml序列化首先了解一下java中的XMLDecoder是什么 。XMLDecoder就是jdk中一个用于处理xml数据的类,先看两个例子 。
这里引用一下浅蓝表哥的(强推浅蓝表哥的博客https://b1ue.cn/
import java.beans.XMLEncoder;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;/** * @author 浅蓝 * @email blue@ixsec.org * @since 2019/4/24 12:09 */public class Test {public static void main(String[] args) throws IOException, InterruptedException {HashMap<Object, Object> map = new HashMap<>();map.put("123","aaaa");map.put("321",new ArrayList<>());XMLEncoder xmlEncoder = new XMLEncoder(System.out);xmlEncoder.writeObject(map);xmlEncoder.close();}}
![java反序列化——XMLDecoder反序列化漏洞](http://img.jiangsulong.com/220421/055J214L-0.jpg)
文章插图
这样就把map对象变成了xml数据,再使用XMLDecoder解析一下 。
/** * @author 浅蓝 * @email blue@ixsec.org * @since 2019/4/24 12:09 */public class Test {public static void main(String[] args) throws IOException, InterruptedException {String s = "<java version="1.8.0_131" class="java.beans.XMLDecoder">n" +" <object class="java.util.HashMap">n" +"<void method="put">n" +"<string>123</string>n" +"<string>aaaa</string>n" +"</void>n" +"<void method="put">n" +"<string>321</string>n" +"<object class="java.util.ArrayList"/>n" +"</void>n" +" </object>n" +"</java>";StringBufferInputStream stringBufferInputStream = new StringBufferInputStream(s);XMLDecoder xmlDecoder = new XMLDecoder(stringBufferInputStream);Object o = xmlDecoder.readObject();System.out.println(o);}}
![java反序列化——XMLDecoder反序列化漏洞](http://img.jiangsulong.com/220421/055J25E3-1.jpg)
文章插图
就可以把之前的xml数据反序列化回map对象,那么如果对xml数据进行修改,使其变成一个执行命令的数据 。比如说:
<java version="1.7.0_80" class="java.beans.XMLDecoder"> <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>
然后对其反序列化即可执行命令弹出计算器 。![java反序列化——XMLDecoder反序列化漏洞](http://img.jiangsulong.com/220421/055J21219-2.jpg)
文章插图
现在我们知道了如果使用XMLDecoder去反序列化xml数据,数据中包含的命令会被执行 。接下来就对其进行分析一下 。
XMLDecoder反序列化漏洞成因一、XML数据解析前的函数处理
![java反序列化——XMLDecoder反序列化漏洞](http://img.jiangsulong.com/220421/055J22417-3.jpg)
文章插图
在readObject处打上断点开始debug
![java反序列化——XMLDecoder反序列化漏洞](http://img.jiangsulong.com/220421/055J23Q7-4.jpg)
文章插图
进入了parsingComplete方法,跟进 。
![java反序列化——XMLDecoder反序列化漏洞](http://img.jiangsulong.com/220421/055J239B-5.jpg)
文章插图
其中使用XMLDecoder的handler属性DocumentHandler的parse方法,并且传入了我们输入的xml数据,跟进 。
![java反序列化——XMLDecoder反序列化漏洞](http://img.jiangsulong.com/220421/055J23E2-6.jpg)
文章插图
这里调用了SAXParserImpl类的parse方法 。
![java反序列化——XMLDecoder反序列化漏洞](http://img.jiangsulong.com/220421/055J23L1-7.jpg)
文章插图
然后又进了xmlReader的parse方法 。
![java反序列化——XMLDecoder反序列化漏洞](http://img.jiangsulong.com/220421/055J214F-8.jpg)
文章插图
这里又调用了xmlReader父类AbstractSAXParser的parser方法 。
![java反序列化——XMLDecoder反序列化漏洞](http://img.jiangsulong.com/220421/055J24152-9.jpg)
文章插图
最后进入了XML11Configuration类的parse方法 。
二、XML数据的处理
![java反序列化——XMLDecoder反序列化漏洞](http://img.jiangsulong.com/220421/055J21928-10.jpg)
文章插图
在XML11Configuration中进行了很多解析XML之前的操作,我们不去仔细研究,看到处理XML数据的函数scanDocument 。跟进查看
推荐阅读
- Java进阶知识,轻松理解Java泛型
- 完全基于 Java 的开源深度学习平台,亚马逊的大佬带你上手
- JavaScript 中如何检查对象为空
- 秦国统一六国齐国真的没有反抗吗? 齐国向秦国投降
- 李鸿章为什么不反清朝 光绪和李鸿章的关系
- 刘邦怀疑韩信谋反捕捉韩信后 韩信当时反叛刘邦可以得天下吗
- 关于Spring IoC的那些事
- 平南候与狄仁杰谁大 狄仁杰谋反
- 胆汁反流性胃炎治疗
- 现代Web开发中的JavaScript音频库——howler.js