-
Notifications
You must be signed in to change notification settings - Fork 117
/
SomeInvocationHandler.java
42 lines (38 loc) · 1.81 KB
/
SomeInvocationHandler.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
35
36
37
38
39
40
41
42
import java.io.Serializable;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* Um dos gadgets usados no exemplo didático que demonstra como desviar o
* fluxo de execucão durante a desserialização (utilizando Dynamic Proxy).
* O método invoke() desta classe é alcançado quando o readObject da classe
* ForgottenClass invoca um método em um campo controlado pelo usuário (map.entrySet())
* O campo irá conter um Proxy entre a interface Map e este InvocationHandler.
*
* -----------------------------------------------------------------------
* Mais detalhes na 12a edição da H2HC (hackers to hackers) magazine:
* https://www.h2hc.com.br/revista/
* -----------------------------------------------------------------------
*
*
* @author @joaomatosf
*/
public class SomeInvocationHandler implements InvocationHandler, Serializable {
private String cmd;
// metodo invoke não é um magic method (ou seja, *não* é invocado automaticamente
// durante a desserialização. Porém, pode ser alcançado por meio de um Dynamic Proxy.
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("-------------------------------------------");
System.out.println("Invoke method reached! This method can do something dangerous!");
Runtime.getRuntime().exec(cmd);
return null;
}
// magic method invocado automaticamente durante a desserialização de objetos
// deste tipo
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
System.out.println("-------------------------------------------");
System.out.println("The flow is in SomeInvocationHandler.readObject()");
}
}