代理:
静态代理:自己写代码
动态代理
UserProxyInvocationHandler.java 动态代理实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| package DongTai;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;
public class UserProxyInvocationHandler implements InvocationHandler {
private UserService userService;
public void setUserService(UserService userService) { this.userService = userService; }
public Object getProxy(){ Object obj = Proxy.newProxyInstance(this.getClass().getClassLoader(), userService.getClass().getInterfaces(), this); return obj; }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { log(method); Object obj = method.invoke(userService, args); return obj; }
public void log(Method method){ System.out.println("[Info] " + method.getName() + "方法被调用"); } }
|
UserServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package DongTai;
public class Client { public static void main(String[] args) { UserServiceImpl userServiceImpl = new UserServiceImpl(); UserProxyInvocationHandler userProxyInvocationHandler = new UserProxyInvocationHandler(); userProxyInvocationHandler.setUserService((UserService) userServiceImpl);
UserService proxy = (UserService) userProxyInvocationHandler.getProxy();
proxy.add(); proxy.delete(); proxy.update(); proxy.query(); } }
|
UserServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package DongTai;
public class UserServiceImpl implements UserService{ @Override public void add() { System.out.println("增加了一个用户"); }
@Override public void delete() { System.out.println("删除了一个用户"); }
@Override public void update() { System.out.println("更新了一个用户"); }
@Override public void query() { System.out.println("查询了一个用户"); } }
|
USerService.java
1 2 3 4 5 6 7 8 9
| package DongTai;
public interface UserService { public void add(); public void delete(); public void update(); public void query(); }
|
readObject
方法在反序列化当中会被自动执行,而 invoke
方法在动态代理当中会自动执行。
1 2 3 4
| A[O] -> O.abc O[O2] invoke -> O2.f // 此时将 B 去替换 O2 最后 ----> O[B] invoke -> B.f // 达到漏洞利用效果
|