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





相关推荐
沛沛老爹2 小时前
Web开发者转型AI:Agent Skills版本控制与管理实战——从Git到AI技能仓库
java·前端·人工智能·git·架构·rag
我命由我123452 小时前
充血模型与贫血模型
java·服务器·后端·学习·架构·java-ee·系统架构
重学一遍2 小时前
Spring Security + JWT + Redis 的认证授权系统
java·redis·spring
daladongba2 小时前
Spring Cloud Gateway
java·spring cloud·gateway
qq_318121592 小时前
互联网大厂Java面试故事:在线教育微服务架构、缓存优化与AI智能教学全流程解析
java·spring boot·redis·微服务·kafka·spring security·在线教育
sunddy_x2 小时前
Java反射
java
资生算法程序员_畅想家_剑魔3 小时前
Java常见技术分享-分布式篇-分布式系统基础理论
java·开发语言·分布式
色空大师3 小时前
【Result<T>泛型接收转化失败】
java·泛型
Geoking.4 小时前
【设计模式】中介者模式(Mediator)详解
java·设计模式·中介者模式