idea反撤销快捷键_剖析xmlDecoder反序列化

这是 酒仙桥六号部队 的第 130 篇文章。

全文共计1727个字,预计阅读时长6分钟。

一直想写个代码审计的文章,和大腿们交流下思路,正好翻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文件,注意箭头的地方,后面会是个小坑。

14c8e16a5ac571cd5f3c4a4568ccb5dc.png

使用java代码解析xml文件。

115e1ee56361dfac04ab62a1c097a823.png

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

Debug模式启动:

aab95ebf4f177ff4396e2822dca6a971.png

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

d05f04a9a8a1af7bd58aca601dccff53.png

进入方法:

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

983f97c608bfd2c6ad1b027fefc58c54.png

打个断点,进入方法:

bc30ca8bc1888f1195a4ba2aa78319ac.png

f2dbb049eaaf160bbdbb88389291a200.png

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

f643d3ae2743edca610df4f73c0cfd2b.png

父类:

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

951a932b91b25ee6d708a84bbeb1e423.png

进入父类:

940db4e55059633768fbe2e21056244c.png

跟进:

c1fc4ddf30fbf5ad96623f031929b850.png

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

dcfbcd6f3b8c84d398994ba91d912c14.png

一些配置:

6c2ce0b0960a83ac3c25620a714c0c1c.png

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

918b075d9033eee1f7ac4f248ead496c.png

bef8782a52e50650c145532d1bb1b4cd.png

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

2882c4eda1897133891eedc3b104d03e.png

跟进,跳到XMLDocumentScannerImpl的next():

f6fe110a7b4ba1add67b43ee0ac8b470.png

进入next()方法:

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

d373d39e59bd0f42be412382e3e3440e.png

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

cb834c51c211c5a230e8ef5565f0396b.png

继续跟进:

4ac372c1df2329824c727e943e28e30a.png

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

00b84ce6a21a231a65114a221627b2dc.png

599f61db2a94c7ffb8f01f8e0b2ef4f1.png

cc2419e5785bdba86124c6f9fd892fe0.png

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

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

38fab76c18581fba9c4095232bc8668b.png

863f39fa4b06574cfe5e5878d189ee07.png

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

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

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

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

编辑利用程序

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

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

119fc2c8edb6f9959c7e6c9623f70bce.png

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

4c6e0c9f6c4e526c6b8ea6030f2fbe5f.png

562fceffccbd0bba4c0b183da9ce546e.png

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

更近一步

数据不回显?

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

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

    绕过:自建dns。

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

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

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

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

结尾

想想类似的洞?嘿嘿嘿~

6709819211aeb5f75b158c6088bcd5bd.png

aea4bba5e0fd48fe1b117d5c6e901c51.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值