java反序列化——XMLDecoder反序列化漏洞

访客4年前黑客资讯725

本文首发于“合天智汇”公众号 作者: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;


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();

    }
}

这样就把map对象变成了xml数据,再使用XMLDecoder解析一下。

public class Test {

    public static void main(String[] args) throws IOException, InterruptedException {
        String s="<java version="1.8.0_131" class="18c2-824b-8236-24cc java.beans.XMLDecoder">
" +
                " <object class="824b-8236-24cc-8c1d java.util.HashMap">
" +
                "  <void method="put">
" +
                "   <string>123</string>
" +
                "   <string>aaaa</string>
" +
                "  </void>
" +
                "  <void method="put">
" +
                "   <string>321</string>
" +
                "   <object class="8236-24cc-8c1d-d942 java.util.ArrayList"/>
" +
                "  </void>
" +
                " </object>
" +
                "</java>";
        StringBufferInputStream stringBufferInputStream=new StringBufferInputStream(s);
        XMLDecoder xmlDecoder=new XMLDecoder(stringBufferInputStream);
        Object o=xmlDecoder.readObject();
        System.out.println(o);

    }
}

就可以把之前的xml数据反序列化回map对象,那么如果对xml数据进行修改,使其变成一个执行命令的数据。比如说:

<java version="1.7.0_80" class="986c-76a5-f3cb-5049 java.beans.XMLDecoder">
 <object class="76a5-f3cb-5049-af3d java.lang.ProcessBuilder">
  <array class="f3cb-5049-af3d-902c java.lang.String" length="1">
    <void index="0"><string>calc</string></void>
  </array>
  <void method="start"></void>
 </object>
</java>

然后对其反序列化即可执行命令弹出计算器。

现在我们知道了如果使用XMLDecoder去反序列化xml数据,数据中包含的命令会被执行。接下来就对其进行分析一下。

XMLDecoder反序列化漏洞成因

一、XML数据解析前的函数处理

在readObject处打上断点开始debug

进入了parsingComplete *** ,跟进。

其中使用XMLDecoder的handler属性DocumentHandler的parse *** ,并且传入了我们输入的xml数据,跟进。

这里调用了SAXParserImpl类的parse *** 。

然后又进了xmlReader的parse *** 。

这里又调用了xmlReader父类AbstractSAXParser的parser *** 。

最后进入了XML11Configuration类的parse *** 。

二、XML数据的处理

在XML11Configuration中进行了很多解析XML之前的操作,我们不去仔细研究,看到处理XML数据的函数scanDocument。跟进查看

这个函数通过迭代的方式对XML数据的标签进行解析,网上有些文章写道“解析至END_ELEMENT时跟进调试”,但是我看了一下我这里的END_ELEMENT。

里面没有函数可以跟进啊,然后搜了一些其他的文章,是因为jdk版本的问题,处理的逻辑放在了next函数里。在do while循环里跳了大概十次,就开始解析了xml的标签。

跳到XMLDocumentScannerImpl中的next ***

跳到XMLDocumentFragmentScannerImpl中的next *** ,解析到endtag时会走到scanEndElement *** 里。

然后就到了网上说的endElement *** 里,跟进。

这一部分的解析可以参考下图:

也就是说解析时会按照标签一个一个解析。

这里调用了DocumentHandler的endElement *** 。接下来就是很重要的部分

这里的handler是StringElementHandler,但是这个类没有重写endElement *** ,所以调用的是父类ElementHandler的endElement *** ,其中调用了getValueObject来获取标签中的value值,这里的标签是string标签,所以获取到的值是calc。

然后将其添加到其父类标签VoidElementHandler的Argument属性中。

然后将handler指向其父类VoidElementHandler。

继续解析到void标签,此时的handler就是VoidElementHandler,接着调用getValueObject。但是因为没有重写该 *** ,所以调用父类NewElementHandler的getValueObject。

继续跟进发现实现了反射调用invoke *** ,也就是执行了set *** 。接着再解析Array标签,按照上面的步骤解析,就完成了这一部分参数的解析。

<array class="5049-af3d-902c-dd84 java.lang.String"length="1">
  <void index="0">
      <string>calc</string>
  </void>
</array>

那么再按照上面的步骤解析object标签,然后调用new *** 实例化 ProcessBuilder类。

然后解析到void标签获取到start *** ,然后通过调用start *** 实现了命令执行,弹出计算器。

也就相当于最后拼接了 new java.lang.ProcessBuilder(new String[]).start();

文章有说的不对的地方请师傅们指点,刚开始学java,大佬们轻喷。。。

参考文章

https://b1ue.cn/archives/239.html

https://zhuanlan.zhihu.com/p/108754274

https://blog.csdn.net/SKI_12/article/details/85058040

相关实验

Java反序列漏洞

https://sourl.cn/Lknehk

(本实验通过Apache?Commons?Collections?3为例,分析并复现JAVA反序列化漏洞。)

相关文章

黑客攻击不可抗力(黑客攻击不可抗力怎么办)

黑客攻击不可抗力(黑客攻击不可抗力怎么办)

本文目录一览: 1、网络攻击的危害有哪些 2、假如网站遭攻击了,里面关于客户的信息资料被盗用,产生的后果,网站负责人要负吗?还是属于不可抗力,无需负责 3、杭州一公司遭黑客入侵,险些损失150...

抖音视频没有播放量和浏览(教你通过配音破0播放)

抖音视频没有播放量和浏览(教你通过配音破0播放)

现在抖音快手短视频已经成为了全民大众的一个流量入口,如果想在这个“口中”当中去分一杯羹,那最起码的,你需要知道怎么去拍摄抖音短视频。 前面两篇文章已经给大家说了短视频应该怎么选题、怎么构思以及视频拍摄...

知道手机号码,是不是任何人都可以定位_黑客

知道手机号码,是不是任何人都可以定位 假如你知道对方手机的账号和密码,需求几秒钟。一般的家庭成员或最近的人会共享一个帐户密码,这归于一个非常小的数字。一般的安卓手机也有很多定位功用的支撑。就像苹果一...

微信数据恢复黑客(微信恢复黑客软件)

微信数据恢复黑客(微信恢复黑客软件)

iphone恢复撤回消息黑客 1、微信撤回的消息可以通过多种方式来恢复,首先,你可以尝试使用一些第三方软件来进行数据恢复。其次,你也可以尝试在苹果上找到“iCloud”并且将它打开,然后点击“重新加载...

家用保险柜打不开怎么办?老师傅教你开保险柜

家用保险柜打不开怎么办?老师傅教你开保险柜

保险柜现在日常生活中运用的越来越多,很多家庭都开始使用保险柜,保险柜可以保护个人财产和贵重物品免遭火灾或者被盗的危险。虽然是保险柜,但是出现一些问题也是不可避免的,保险柜打不开就是比较常见的问题。因此...

放下他了的说说感慨 放下一段感情的说说朋友圈

放下他了的说说感慨 放下一段感情的说说朋友圈

针对先资金投入这一份情感的人,一直输的太快,因此 要放下一个人也不是太非常容易的事儿,那麼有关学会放下他的情绪要怎么表述呢,我就而言讲吧。 学会放下他了的说说感叹  時间仅仅个代称,碰到比他更强的...