前言

java反序列化cb链大家应该都玩过,博主当初是通过看shiro无依赖了解到的,最近在重学基础,就手把手一点一点调试一遍。记得11月份自博主反思之后,认为自己渗透的学习深度广度都太差,对漏洞的学习只是学了一层表面,老是这么搞可不行啊,花一两个月时间重新看了几百集java语言基础。这篇文章严格来说是学习java利用链的部分学习笔记,这也算博主部分学习的一小段总结吧,话不多说,直接开始。【资料】

一、利用链流程


画了一张流程图,供大家参考。如图所示,这里我将从下往上分为三部分来讲解利用链流程

TemplatesImpt类->调用恶意类

BeanComparator类->利用javabean调用getOutputProperties()

PriorityQueue类->反射调用PropertyUtils.getPropert

二、TemplatesImpt类

根据上面的流程图我们可以知道TemplatesImpt类的危险方法是getOutputProperties(),我们从头开始调试。

跑到newTransformer().getOutputProperties(),我们跟进newTransformer()

一路跟进,进入getTransletInstance()

我们看到做了两个空判断,_null、_class,之后_class不为空执行defineTransletClasses(),继续跟进。


如图所示,这里defineClass从_bytecodes[]中还原出一个Class对象并放在_class中,我们回到getTransletInstance()处,此时_class不为空,继续往下走。

AbstractTranslet translet = (AbstractTranslet) _class[_transletIndex].newInstance();


此时对还原的class做了一个实例化,到这里我们可以得知,在这里传入一个恶意类,通过静态代码块或者构造方法就可以执行恶意操作。

三、BeanComparator类

我们通过分析TemplatesImpt类已经得知该类可以恶意执行命令,那我们如何调用呢?

这里我们就要引入javabean这个概念了。而TemplatesImpl符合javabean的使用条件

PropertyUtils.getProperty(person,"name")




我们可以通过如上的形式去调用getOutputProperties()方法。接下来我们可以看看都什么函数调用了。



我们可以看到o1为我们传递的TemplatesImpt类,构造函数直接赋值,property为_outputProperties。接下来我们只需要找一个同名调用的compare,例如…CC4的优先队列。

四、PriorityQueue类

首先我们看一下PriorityQueue类,存在Serializable接口,readObject方法。


我们跟进readObject的heapify()方法

可以看到heapify方法做了一个循环,然后将queue数组传入siftDown方法。跟进siftDown

如果comparator不为空执行siftDownUsingComparator,进行跟进siftDownUsingComparator。



到这里,我们可以看到siftDownUsingComparator方法最终执行了comparator.compare,且comparator我们可以直接反射成BeanComparator。接下来我们只需要将queue添加TemplatesImpl类就可以了。我们看一下add方法。

跟进offer方法

这里我们如果直接传入一个类,会报int类型错误,这里我是先传数值,之后在通过反射改回来的。

//获取comparator属性,将声明的priorityQueue的comparator修改为beanComparator
Class c = PriorityQueue.class;
Field comparatorField = c.getDeclaredField("comparator");
comparatorField.setAccessible(true);
comparatorField.set(priorityQueue,beanComparator);//对priorityQueue中的queue重新赋值
Field addField = priorityQueue.getClass().getDeclaredField("queue");
addField.setAccessible(true);
Object[] arr = (Object[]) addField.get(priorityQueue);
Array.set(arr,0,templates);
addField.set(priorityQueue,arr);
//System.out.println(Array.get(arr,0));

接下来我们的走向很清晰明了,首先我们通过add添加数据,之后做两步反射,最终执行BeanComparator.compare(TemplatesImpl,1),之后触发PropertyUtils.getProperty,通过写好的_name、_bytecodes执行TemplatesImpl的getOutputProperties()。

五、断点调试利用链

首先执行反序列化执行PriorityQueue类的readObject(),进入heapify

做两步反射,跳转到BeanComparator.compare,继续跟进

跳转到PropertyUtilsBean类,获取到_outputProperties的get方法。继续跟进

跳转到getOutputProperties方法,一路往下走,最终还原class,实例化恶意类。


成功触发恶意类执行命令

总结

一个个基础很差 技术很菜的小菜鸡,文章里面有什么不足之处,望各位大神多加指正;【学习资料来源】

【关于学习渗透】手把手教你玩转java反序列化cb链相关推荐

  1. 手把手教你玩转SOCKET模型:完成端口(Completion Port)详解

    这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中完成端口的方方面面的信息,从API的用法到使用的步骤,从完成端口的实现机理到实际使用的注意事项,都有所涉及,并且为了让朋友们更直观的体会完成端口 ...

  2. echarts formatter_手把手教你玩转echarts(二)折线图

    茫茫人海中与你相遇 相信未来的你不会很差 作者:婷酱Yaaa 来源:https://juejin.im/post/5f0292d35188252e5a5dbed0 前言 哈喽,everybody,我又 ...

  3. 手把手教你玩转SOCKET模型之重叠I/O篇(下)

    http://blog.csdn.net/PiggyXP/archive/2004/09/23/114908.aspx 四.     实现重叠模型的步骤 作了这么多的准备工作,费了这么多的笔墨,我们终 ...

  4. 手把手教你玩转SOCKET模型:完成例程(Completion Routine)篇

    本文假设你已经对重叠I/O的机制已有了解,否则请先参考本系列的前一篇<手把手教你玩转SOCKET模型之重叠I/O篇>: 目录: 1.完成例程的优点 2.完成例程的基本原理 3.关于完成例程 ...

  5. 手把手教你玩转网络编程模型之完成例程(Completion Routine)

    前  言 记得写这个系列的上一篇文章的时候已经是四年前了,准确的说是四年半以前了,翻开我尘封已久的IO模型里面的"完成例程"的实现方式及示例代码. 本文凝聚着笔者心血,如要转载,请 ...

  6. 手把手教你玩转ARP包(一)

    原文地址:http://blog.csdn.net/piggyxp/article/details/19606 前   言 首先要感谢网络安全资深专家卢湖川博士以及VC网络版的limin朋友提供的资料 ...

  7. vscode angular智能提示_【线下活动】手把手教你玩转 VS Code 插件开发

    感谢 Google Developer Group 的邀请,3 月 30 号下午,韩老师将手把手带你玩转 VS Code 插件开发. Angular 使用了 TypeScript,VS Code 使用 ...

  8. 手把手教你玩转网络编程模型之完成例程(Completion Routine)篇(下)-转

    续 手把手教你玩转网络编程模型之完成例程(Completion Routine)篇(上) 四.         完成例程的实现步骤 基础知识方面需要知道的就是这么多,下面我们配合代码,来一步步的讲解如 ...

  9. 手把手教你玩转网络编程模型之完成例程(Completion Routine)篇(上)-转

    手把手教你玩转网络编程模型之完成例程(Completion Routine)篇 前  言 记得写这个系列的上一篇文章的时候已经是四年前了,准确的说是四年半以前了,翻开我尘封已久的IO模型里面的&quo ...

最新文章

  1. wtl中显示html,用WTL构建HTML界面应用程序(1)
  2. Spark的RDD持久化
  3. linux下安装部署ansible
  4. C++中的二阶构造模式
  5. python与Java线程实现方式的对比
  6. thinkphp-条件判断-范围判断-NOTBETWEEN
  7. 逗比学树莓派之GPIO
  8. python中双向索引_对索引Include子句的深入分析
  9. 各种版本的Visual C++编译器
  10. 简单示例用例(Simple Example Use Cases)--hive GettingStarted用例翻译
  11. linux ppoe 动态ip,设置路由器时应该选择动态ip,静态ip还是pppoe拨号?
  12. MVP+RecylerView显示数据
  13. nb信号和4g信号_NB-IoT DTU与4G DTU有什么不同之处
  14. h5微信f分享链接给对方获取对方手机号_裂变、分享、传播:App推广社交玩法全解析...
  15. 关于2010年部分节假日安排
  16. Java exception was raised during method invocation
  17. 把经纬度转换成十进制
  18. sd-wan专线组网
  19. R语言实例:diamonds 数据可视化分析报告
  20. 产品经理分析问题的方法论——黄金圈法则

热门文章

  1. 成功解决Ignoring invalid distribution -yqt5
  2. HighNewTech:70后、80后、90后、95后职场人大数据调查(有趣的五个结论)——源于猎聘网
  3. 成功解决AttributeError: 'MapDataset' object has no attribute 'group_by_window'
  4. Crawler/ML:爬虫技术(基于urllib.request库从网页获取图片)+HierarchicalClustering层次聚类算法,实现自动从网页获取图片然后根据图片色调自动分类
  5. Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.
  6. 洛谷P1095守望者的逃离题解-伪动态规划/贪心
  7. 功能测试话题分享-0323
  8. Linux 基础学习:文件权限与种类
  9. 2019 CCPC wannfly winter camp Day 5
  10. 429. N-ary Tree Level Order Traversal - LeetCode