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()





相关推荐
Java面试题总结6 小时前
java高频面试题(2026最新)
java·开发语言·jvm·数据库·spring·缓存
苦逼的猿宝6 小时前
学生心理咨询评估系统
java·毕业设计·springboot·计算机毕业设计
隔窗听雨眠6 小时前
doctype、charset、meta如何控制整个渲染流水线
java·服务器·前端
西安邮电大学7 小时前
SpringBean完整生命周期
java·spring
刀法如飞8 小时前
DDD 与 Ontology 对比分析:哪一种更适合AI时代复杂系统构建?
java·架构·领域驱动设计
SunnyDays10118 小时前
Java 读写 Excel 公式:从基础到高级的实战总结
java·开发语言·excel
wb043072018 小时前
Java 26
java·开发语言
白露与泡影8 小时前
JVM GC调优实战:从线上频繁Full GC到RT降低80%的全过程
java·开发语言·jvm
范什么特西8 小时前
Spring 动态代理 静态代理
java·后端·spring
醇氧8 小时前
Spring 动态注册 Bean 深度解析:从源码到实践
java·后端·spring