剖析xmlDecoder反序列化

 

一直想写个代码审计的文章,和大腿们交流下思路,正好翻xxe的时候看到一个jdk自带的xmlDecoder反序列化,很具有代表性,就来写一下,顺带翻一下源码。

为什么选这个呢,因为ta让weblogic栽了俩跟头,其他都是手写了几个洞,被人发现了,weblogic是调用的东西存在一些问题,有苦没处说啊,下面剖析下xmlDecoder是怎么反序列化的。

 

前期准备

这次使用的是idea来调试代码,下面是用到一些快捷键:

Idea中用到的debug快捷键:

F7 进入到代码,

Alt+shift+F7 强制进入代码

Atl+F9 执行跳到下一个断点处

F8 下一步

代码中有提到invoke(class, method)方法:

拿例子说话:

methodName.invoke(owner,args)

其中owner为某个对象,methodName为需要执行的方法名称,Object[]  args执行方法参数列表。

楼主使用的jdk版本:

1.8.0_151

 

敲黑板开始了

先整一个完整的xml文件,注意箭头的地方,后面会是个小坑。

使用java代码解析xml文件。

重点在Object s2 = xd.readObject();这行代码,打断点跟一下源码。

Debug模式启动:

进入方法,是个三目运算:

进入方法:

注:从这里开始,可以进行打断点,第一次跟不对的时候,下次再debug的时间alt+f9快速跳到断点处。

打个断点,进入方法:

SAXParserImpl中有一些配置,其中的xmlReader是前面已经设置过了,是接口对象new的实现类,我们看的是实现类,这里有idea可以自动进行跳入对应的实现类的方法。

父类:

注:Super:调用父类的写法,有super的类必定继承(extend)了其他类。

进入父类:

跟进:

继续跟进,跳到XML11Configuration的parse()方法:

一些配置:

F7继续跟进:会进入本类的parse方法。

进入XMLDocumentFragmentScannerImpl后,会看到有方法中进行了do{}while{}方法,其中的next方法是重点。

跟进,跳到XMLDocumentScannerImpl的next():

进入next()方法:

在do{}while{}里循环多次。

注:下面的显示台有变量的值,可以看到代码中变量值的变化。

继续跟进:

可以看到解析xml文件的时候有解析到calc字符,继续跟进。

ProcessBuilder这个类在xml文件中有申明,然后到了invoke,成功执行命令。

这一块代码建议亲自跟一下,会跟到很底层的东西,楼主在这一块卡了好长时间。

这次是借助了idea进行了代码的跟踪,待到能手点方法跟踪代码的那天就是楼主神功大成之日!嘎嘎嘎~

记得好多开发大牛说过,想进步,多看看jdk源码,看懂ta,打遍天下无敌手!(后面一句我吹的)

代码审计的时候不一定能搭的起环境来,基本功还是很重要的,看jdk源码就是一个很好的练习的方法。

用jdk自带的洞来练习代码审计的好处就是,可以使用idea帮助寻找跳转方法,不会有跟不下去的时候,门槛会降低很多;再有cms会有很多奇奇怪怪的写法,出现了洞的话最后还是一些基本的写法,楼主建议还是从基础的洞来入手,没有那么高的复杂度。

 

编辑利用程序

写一个方法,将xml文件拼接起来,还记得开头提到的小坑么

注:楼主最喜欢这种洞了,就像网站本身就给开了个后门一样。

Main方法调用,试试ping命令。

将方法中的代码放在jsp文件中,就可以接收请求参数了,楼主已经在用了,各位大佬可以定制下。

 

更近一步

数据不回显?

  1. dnslog外带,这里有个坑,能带的字符串长度有限制,中间不能有特殊符号,可以在命令中对数据进行加密切割,分段传输。

    防御方法:对doslog进行域名加黑,在攻击者探测阶段就失败。

    绕过:自建dns。

  2. 在服务器开启nc监听,在目标服务器访问nc服务器的端口,进行nc通信,将信息外带出来。

    防御方法:在服务器监听新开启的通信。

  3. 复写父类方法,使执行有输出(有难度)。

参考以上方法和冰蝎的方法可以编写定制化一个webshell工具。

 

结尾

想想类似的洞?嘿嘿嘿~

(完)