本文首发于“合天智汇”公众号 作者:Fortheone
最近学习java反序列化学到了weblogic部分,weblogic之前的两个反序列化漏洞不涉及T3协议之类的,只是涉及到了XMLDecoder反序列化导致漏洞,但是网上大部分的文章都只讲到了触发XMLDecoder部分就结束了,并没有讲为什么XMLDecoder会触发反序列化导致命令执行。于是带着好奇的我就跟着调了一下XMLDecoder的反序列化过程。
首先了解一下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数据,数据中包含的命令会被执行。接下来就对其进行分析一下。
在readObject处打上断点开始debug
进入了parsingComplete *** ,跟进。
其中使用XMLDecoder的handler属性DocumentHandler的parse *** ,并且传入了我们输入的xml数据,跟进。
这里调用了SAXParserImpl类的parse *** 。
然后又进了xmlReader的parse *** 。
这里又调用了xmlReader父类AbstractSAXParser的parser *** 。
最后进入了XML11Configuration类的parse *** 。
在XML11Configuration中进行了很多解析XML之前的操作,我们不去仔细研究,看到处理XML数据的函数scanDocument。跟进查看
这个函数通过迭代的方式对XML数据的标签进行解析,网上有些文章写道“解析至END_ELEMENT时跟进调试”,但是我看了一下我这里的END_ELEMENT。
里面没有函数可以跟进啊,然后搜了一些其他的文章,是因为jdk版本的问题,处理的逻辑放在了next函数里。在do while循环里跳了大概十次,就开始解析了xml的标签。
跳到XMLDocumentScannerImpl中的next ***
跳到XMLDocumentFragmentScannerImpl中的next *** ,解析到endtag时会走到scanEndElement *** 里。
然后就到了网上说的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、为什么硬件黑客喜欢用基数为16的计数方式在书写整数 3、黑客到底是什么? 4、黑客的定义?!什么是黑客? 5、黑客是什么意思 6、“黑客”...
这个周末就是母亲节,大家都准备好要送妈妈什么礼物了吗? 野兽派今年别出心裁推出“妈妈再打我一次全家福“,帮你回忆儿时被妈妈抄起家伙胖揍的”美好“时光。 全家福包含扫帚、灰尘拍打器、苍蝇拍、鸡毛掸子...
提高自我防范意思,不给骗子有可乘之机。可恨害群之马。 首先需要做的当然是凳录一个QQ号,但是登录的之个QQ号需要有一个自己创建的群,进入帐号后,点击下方工具栏中的联系人,然后点击上方的群聊进入我创建...
一个谷歌团队的成员告诉她“感谢你的来信,可是咱们并不将这个缝隙看作安全缝隙”。 AppUse根据linux Ubuntu体系,现已配备了常见的进犯东西,能够节省时间,进步功率。 从上一节取得的硬件信息...
DAY1 苏州博物馆,拙政园,平江路,观前街 苏州博物馆 既保留了苏州古建筑中白墙灰瓦的风格,又融入了现代的几何线条。中国的建筑多见的是繁复的美,但是苏博更多的是一种诗情画意的柔美。馆中还有...
刷牙既是我们起床第一件事,也是临睡前最后一件事,刷牙对我们尤其的重要。但是传统的手动牙刷的清洁能力有限,口腔死角清理不到,而且用力过猛还会伤当口腔。这里安利各位小伙伴一款艾优电动牙刷,智能清洁,贴心呵...