JAVA安全基础之代理模式(二)
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安全基础之代理模式(二)的更多相关文章
- JAVA安全基础之代理模式(一)
JAVA安全基础之代理模式(一) 代理模式是java的一种很常用的设计模式,理解代理模式,在我们进行java代码审计时候是非常有帮助的. 静态代理 代理,或者称为 Proxy ,简单理解就是事情我不用 ...
- Java的三种代理模式
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
- Java的三种代理模式(Spring动态代理对象)
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
- Java设计模式学习记录-代理模式
代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...
- java设计模式之Proxy(代理模式)
java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...
- Java设计模式之《代理模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...
- Java的三种代理模式简述
本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...
- 理解java的三种代理模式
代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing(). 1 public class ...
- Java的三种代理模式&完整源码分析
Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCache缓存的实现机制](https://www.c ...
随机推荐
- XMAPP搭建DVWA靶机
1 环境搭建 XMAPP+DVWA (我在win10下搭的环境) 更改了xmapp中Apache的两个端口号: dvwa/config中密钥和端口号按自己情况填好: dvwa/config中文件改为 ...
- system V信号量和Posix信号量
一.函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量.它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线.例如,应该是sem ...
- CodeReview of JDK Source Code
jdk1.6.0_35/src.zip, only java package is reviewd(full package review caused a OutofMemory on java h ...
- Golang语言系列-18-Gin框架博客项目
代码托管在码云: https://gitee.com/lichengguo/my-blog-golang
- Python语言系列-07-面向对象2
重构父类__init__方法 #!/usr/bin/env python3 # author:Alnk(李成果) # 需求:Dog类要新增一个实例属性,但是Cat类不需要 class Animal(o ...
- 分享一个自己制作的XML在线编辑器
前言 一年多没更新博客了,原因是疫情期间<骑马与砍杀2>发售,然后去写游戏MOD去了. 用C#大概写了7个月的游戏MOD,每天晚上肝到很晚,然后期间又因为介绍这个游戏MOD,学习了PR,然 ...
- 将JDK默认编码设置为UTF-8
此博文非原创:参考小兵qwer https://blog.csdn.net/xiaobing_122613/article/details/70209716 只是想留下对自己有用的东西,同时帮助更 ...
- Anaconda Pycharm 是怎么个事儿?
前言 许多人学习Python的经历可能很相似,写程序没有问题,最后却被各种环境困扰. 不论你是Python小白,还是学习Python有一段时间了.都可以认真的看一下ヾ(≧▽≦*)o 这篇文章让你对An ...
- 【spring 注解驱动开发】spring事务处理原理
尚学堂spring 注解驱动开发学习笔记之 - 事务处理 事务处理 1.事务处理实现 实现步骤: * 声明式事务: * * 环境搭建: * 1.导入相关依赖 * 数据源.数据库驱动.Spring-jd ...
- WPF 窗口 最前端 Topmost Owner
WPF 中,如果我们想把某个窗口一直置于最前端,那么可以设置Topmost=true; 但是,这样就会有另外一个问题,就时你这个窗口,会一直处于最顶层,即使你想切换到其他程序的时候. 比如,你自己写的 ...