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





相关推荐
阿无,11 小时前
Java多线程面试题之AQS
java·开发语言
数据狐(Datafox)11 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
摇滚侠11 小时前
《SpringBoot 3:入门与应用实战》第 7 章 AOP 思想与实现 阅读笔记 15
java·spring boot·笔记
风尘小子12 小时前
java静态类使用@Value动态绑定环境变量
java
重生之后端学习12 小时前
239. 滑动窗口最大值[困难]✅
java·数据结构·算法·leetcode·职场和发展
脉动数据行情112 小时前
Java SpringBoot 对接知名台股 TWSE|批量采集上市股票行情实践
java·开发语言·spring boot
她的男孩12 小时前
我把管理系统接给AI,它改条数据都要先问我
java·后端·架构
toolsmith12 小时前
我用AI拆解了Charles的授权机制,发现密钥被写死在了代码里
java·人工智能
IKUN家族13 小时前
SpringBoot日志
java·开发语言
DianSan_ERP13 小时前
WMS接入电商平台自动化履约实战:一张订单从平台到出库的接口时序设计
java·前端·网络·数据库·安全·架构·自动化