JAVA安全基础之代理模式(二)

上篇讲到静态代理模式,这时候我们发现,一个代理类只能为一个类服务,如果需要代理的类很多,那么就需要编写大量的代理类,比较繁琐。所以就有了动态代理

动态代理

动态代理的代理类,是在内存中构建代理对象,从而实现对目标对象的代理功能。

在这里我们需要知道两个类:1.InvocationHandler(接口)、2.Proxy(类)

来看下具体使用步骤

1.(接口)创建Person接口:

public interface Person {
//上交班费
void giveMoney();
}

2.(被代理类)Student类实现了Person接口。Student可以具体实施上交班费的动作。

public class Student implements Person{
private String name; public Student(String name) {
this.name = name;
} @Override
public void giveMoney() {
System.out.println(name + "上交了班费");
} public String getName() {
return name;
}
}

3.(InvocationHandler类)创建一个对象ProxyHandler,实现了InvocationHandler接口。也要持有一个Student类对象(这里换成了Object)。他可以通过反射来执行Student类的giveMoney()方法

public class ProxyHandler implements InvocationHandler {
//这里写的是Object类
private Object object; public ProxyHandler(Object object) {
this.object = object;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("--------------begin-------------");
//通过反射来调用被代理类的方法
method.invoke(object, args);
System.out.println("--------------end-------------");
return null;
}
}

InvocationHandler对象可以通过Proxy.newProxyInstance()来获得代理类对象,下面的proxyStudent就是代理类对象。

Person proxyStudent = (Person) Proxy.newProxyInstance(Student.class.getClassLoader(), Student.class.getInterfaces(), proxyHandler);

1.被动态代理的对象调用任意方法都是通过对应InvocationHandler#invoke方法中的method.invoke(object, args);中触发

2.代理对象每次执行方法都会放到InvocationHandler中的invoke去执行

4.测试动态代理:

public class ProxyTest {
public static void main(String[] args) {
//实例化被动态代理的对象
Student student = new Student("xiaoming");
//实例化实现了InvocationHandler接口的类
InvocationHandler proxyHandler = new ProxyHandler(student);
//创建代理类proxyStudent
Person proxyStudent = (Person) Proxy.newProxyInstance(Student.class.getClassLoader(), Student.class.getInterfaces(), proxyHandler);
//代理类对象调用被代理类的方法
proxyStudent.giveMoney();
}
}

运行结果:

加入来了个新的代理类mon

public interface Mom {
void here();
}
public class MomImpl implements Mom {
@Override
public void here() {
System.out.println("mom来了");
}
}

测试类应该这么写:

public class ProxyTest {
public static void main(String[] args) { Student student = new Student("xiaoming");
MomImpl mom = new MomImpl(); InvocationHandler proxyHandler = new ProxyHandler(student);
InvocationHandler momHandler = new ProxyHandler(mom); Person proxyStudent = (Person) Proxy.newProxyInstance(Student.class.getClassLoader(), Student.class.getInterfaces(), proxyHandler);
Mom proxyMon = (Mom) Proxy.newProxyInstance(MomImpl.class.getClassLoader(), MomImpl.class.getInterfaces(), momHandler); proxyStudent.giveMoney();
proxyMon.here();
}
}

运行结果:

我们来用ysoserial中的CC1链来理解,是怎么利用动态代理特性来构造payload的

在CC1中,利用了动态代理特性来构造了攻击payload,我们来看下实现过程。

1.AnnotationInvocationHandler为一个InvocationHandler

2.AnnotationInvocationHandler构造函数传入了被代理对象var2,赋值给了this.memberValues

根据前面说的,被动态代理的对象调用任意方法都会通过对应InvocationHandler的invoke方法触发

也就是说this.memberValues调用方法会调用AnnotationInvocationHandler的invoke方法

【AnnotationInvocationHandler的invoke方法】

在AnnotationInvocationHandler的readObject方法中调用了this.memberValues的方法

所以会转到AnnotationInvocationHandler的invoke方法

往下看到78行,在AnnotationInvocationHandler#invoke方法中,this.memberValues调用了get方法。

而在CC1中,AnnotationInvocationHandler构造方法var2参数传入的是LazyMap对象,所以this.memberValues = LazyMap

进而会去调用LazyMap.get方法,完成cc链的构造

欢迎关注我的公众号,同步更新喔

JAVA安全基础之代理模式(二)的更多相关文章

  1. JAVA安全基础之代理模式(一)

    JAVA安全基础之代理模式(一) 代理模式是java的一种很常用的设计模式,理解代理模式,在我们进行java代码审计时候是非常有帮助的. 静态代理 代理,或者称为 Proxy ,简单理解就是事情我不用 ...

  2. Java的三种代理模式

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  3. Java的三种代理模式(Spring动态代理对象)

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  4. Java设计模式学习记录-代理模式

    代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

  5. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  6. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  7. Java的三种代理模式简述

    本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...

  8. 理解java的三种代理模式

    代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing(). 1 public class ...

  9. Java的三种代理模式&完整源码分析

    Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCache缓存的实现机制](https://www.c ...

随机推荐

  1. 小白学习Vue第五天(v-model实用的地方)

    用法一radio单选项 <!-- 添加name男女选项互斥 --> <label for="male"> <input type="radi ...

  2. vue 快速入门 系列 —— vue-cli 上

    其他章节请看: vue 快速入门 系列 Vue CLI 4.x 上 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...

  3. 知乎1578赞:Android 中为什么需要 Handler?

    要理解 Handler,就得先理解 Android 的 Message 机制. 这里以用户滑动微信朋友圈为例,讲解一下 Android 的 Message 机制是怎么运行的,Message 机制中的各 ...

  4. 线程休眠_sleep

    线程休眠_sleep sleep(时间)指定当前线程阻塞的毫秒数: sleep存在异常InterruptedException: sleep时间到达后线程进入就绪状态: sleep可以模拟网络延时,倒 ...

  5. kong整合Cosul实践(3)

    1. 准备工作: 需要.netcore或者java程序一套,引入consul第三方包 我这里搭建了一个.netcore的webapi项目,引入Consul第三方包,网上可查资料一堆 环境需要kong, ...

  6. 答应我,安装chromedriver,按照版本号,v70就安装v2.42,

    下载chromedriver,链接:http://chromedriver.storage.googleapis.com/index.html ----------ChromeDriver v2.42 ...

  7. 【原创】利用“进程注入”实现无文件不死webshell

    引子 上周末,一个好兄弟找我说一个很重要的目标shell丢了,这个shell之前是通过一个S2代码执行的漏洞拿到的,现在漏洞还在,不过web目录全部不可写,问我有没有办法搞个webshell继续做内网 ...

  8. Echarts 展示两条动态数据曲线

    利用Echarts 展示两条动态数据曲线,每1秒刷新一下数据,在echart官网例子基础上修改,修改了仿真数据的生成方式.生成数量,曲线数量,最总效果图如下: 详细代码如下: 遇到的主要问题点, 1, ...

  9. 在java程序中使用protobuf

    目录 简介 为什么使用protobuf 定义.proto文件 编译协议文件 详解生成的文件 Builders 和 Messages 序列化和反序列化 协议扩展 总结 简介 Protocol Buffe ...

  10. NOIP 模拟 $28\; \rm 割海成路之日$

    题解 \(by\;zj\varphi\) 用两个集合分别表示 \(1\) 边联通块,\(1,2\) 边联通块 . \(\rm son_x\) 表示当前节点通过 \(3\) 类边能到的 \(2\) 联通 ...