Skip to content

Commit 1d48cdb

Browse files
committed
exposing Java private fields with reflection
1 parent 926bb37 commit 1d48cdb

File tree

11 files changed

+114
-0
lines changed

11 files changed

+114
-0
lines changed

classes/private/Confidential.class

360 Bytes
Binary file not shown.

classes/private/Confidential.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
public class Confidential {
2+
3+
private String secret = "";
4+
private String hidden = "burn after reading";
5+
6+
public Confidential(String text) {
7+
this.secret = text;
8+
}
9+
}

classes/private/Expose.class

1.22 KB
Binary file not shown.

classes/private/Expose.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import java.lang.reflect.Field;
2+
3+
public class Expose {
4+
5+
public static void main(String[] args) {
6+
Confidential message = new Confidential("text you shoudn't see");
7+
Field privateField = null;
8+
try {
9+
privateField = Confidential.class.getDeclaredField("secret");
10+
}
11+
catch (NoSuchFieldException e) {
12+
System.err.println(e);
13+
System.exit(1);
14+
}
15+
privateField.setAccessible(true); // break the lock!
16+
try {
17+
String wasHidden = (String) privateField.get(message);
18+
System.out.println("message.secret = " + wasHidden);
19+
}
20+
catch (IllegalAccessException e) {
21+
// this will not happen after setAcessible(true)
22+
System.err.println(e);
23+
}
24+
}
25+
}

classes/private/expose.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import Confidential
2+
3+
message = Confidential("text you shoudn't see")
4+
private_field = Confidential.getDeclaredField('secret')
5+
private_field.setAccessible(True) # break the lock!
6+
print 'message.secret =', private_field.get(message)

classes/private/leakprivate.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from java.lang.reflect import Modifier
2+
import Confidential
3+
4+
message = Confidential('never expose this')
5+
fields = Confidential.getDeclaredFields()
6+
for field in fields:
7+
# list private fields only
8+
if Modifier.isPrivate(field.getModifiers()):
9+
field.setAccessible(True) # break the lock
10+
print 'field:', field
11+
print '\t', field.getName(), '=', field.get(message)

classes/private/no_respect.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# In the Jython registry:
2+
# python.security.respectJavaAccessibility = false
3+
# Setting this to false will allow Jython to provide access to
4+
# non-public fields, methods, and constructors of Java objects.
5+
6+
import Confidential
7+
8+
message = Confidential("text you shoudn't see")
9+
for name in dir(message):
10+
attr = getattr(message, name)
11+
if not callable(attr): # ignore methods
12+
print name, '=', attr
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import java.lang.reflect.Field;
2+
3+
public class AcessaPrivado {
4+
5+
public static void main(String[] args) {
6+
ObjetoSecreto oSecreto = new ObjetoSecreto("senha super secreta");
7+
Field campoPrivado = null;
8+
try {
9+
campoPrivado = ObjetoSecreto.class.getDeclaredField("escondido");
10+
}
11+
catch (NoSuchFieldException e) {
12+
System.err.println(e);
13+
System.exit(1);
14+
}
15+
campoPrivado.setAccessible(true); // arrombamos a porta
16+
try {
17+
String tavaEscondido = (String) campoPrivado.get(oSecreto);
18+
System.out.println("oSecreto.escondido = " + tavaEscondido);
19+
}
20+
catch (IllegalAccessException e) {
21+
// esta exceção nao acontece porque fizemos setAcessible(true)
22+
System.err.println(e);
23+
}
24+
}
25+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
public class ObjetoSecreto {
2+
3+
private String escondido = "";
4+
private String oculto = "dado ultra secreto";
5+
6+
public ObjetoSecreto(String texto) {
7+
this.escondido = texto;
8+
}
9+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import ObjetoSecreto
2+
3+
oSecreto = ObjetoSecreto('senha super secreta')
4+
campoPrivado = ObjetoSecreto.getDeclaredField('escondido')
5+
campoPrivado.setAccessible(True) # arrombamos a porta
6+
print 'oSecreto.escondido =', campoPrivado.get(oSecreto)

0 commit comments

Comments
 (0)