mirror of
https://github.com/frohoff/ysoserial.git
synced 2026-09-27 01:11:53 +08:00
resilient filter disabling
This commit is contained in:
@@ -33,6 +33,16 @@ public class Reflections {
|
|||||||
if (clazz.getSuperclass() != null)
|
if (clazz.getSuperclass() != null)
|
||||||
field = getField(clazz.getSuperclass(), fieldName);
|
field = getField(clazz.getSuperclass(), fieldName);
|
||||||
}
|
}
|
||||||
|
field.setAccessible(true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Field modifiersField = Field.class.getDeclaredField("modifiers");
|
||||||
|
modifiersField.setAccessible(true);
|
||||||
|
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
return field;
|
return field;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,12 +50,6 @@ public class Reflections {
|
|||||||
Class clazz = obj instanceof Class ? (Class) obj : obj.getClass();
|
Class clazz = obj instanceof Class ? (Class) obj : obj.getClass();
|
||||||
obj = obj instanceof Class ? null : obj;
|
obj = obj instanceof Class ? null : obj;
|
||||||
final Field field = getField(clazz, fieldName);
|
final Field field = getField(clazz, fieldName);
|
||||||
|
|
||||||
field.setAccessible(true);
|
|
||||||
Field modifiersField = Field.class.getDeclaredField("modifiers");
|
|
||||||
modifiersField.setAccessible(true);
|
|
||||||
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
|
|
||||||
|
|
||||||
field.set(obj, value);
|
field.set(obj, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ import ysoserial.test.util.Files;
|
|||||||
import ysoserial.test.util.OS;
|
import ysoserial.test.util.OS;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.InvocationHandler;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.lang.reflect.Proxy;
|
||||||
import java.rmi.Remote;
|
import java.rmi.Remote;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
@@ -24,8 +28,14 @@ public class JRMPListenerTest implements CustomTest, NeedsAddlClasses {
|
|||||||
public void run(Callable<Object> payload) throws Exception {
|
public void run(Callable<Object> payload) throws Exception {
|
||||||
Assert.assertFalse("test file shouldn't exist", testFile.exists());
|
Assert.assertFalse("test file shouldn't exist", testFile.exists());
|
||||||
|
|
||||||
// disable ObjectInputFilter
|
// disable ObjectInputFilter if defined
|
||||||
Reflections.setFieldValue(Class.forName("sun.rmi.transport.DGCImpl"), "dgcFilter", new Filter());
|
Object filter = getFilter();
|
||||||
|
if (filter != null) {
|
||||||
|
Field f = Reflections.getField(Class.forName("sun.rmi.transport.DGCImpl"), "dgcFilter");
|
||||||
|
if (f != null) {
|
||||||
|
f.set(null, filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// open listener
|
// open listener
|
||||||
Remote res = (Remote) payload.call();
|
Remote res = (Remote) payload.call();
|
||||||
@@ -57,10 +67,34 @@ public class JRMPListenerTest implements CustomTest, NeedsAddlClasses {
|
|||||||
return new Class[] { TestHarnessTest.ExecMockSerializable.class };
|
return new Class[] { TestHarnessTest.ExecMockSerializable.class };
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Filter implements ObjectInputFilter {
|
public static Class<?> loadFirstClass(String ... classNames) {
|
||||||
|
for (String className : classNames) {
|
||||||
|
try {
|
||||||
|
Class<?> clazz = Class.forName(className);
|
||||||
|
return clazz;
|
||||||
|
} catch (Exception e) {}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getFilter() throws Exception {
|
||||||
|
final Class<?> filterClass = loadFirstClass(
|
||||||
|
"java.io.ObjectInputFilter", "sun.misc.ObjectInputFilter");
|
||||||
|
final Class<?> statusClass = Class.forName(filterClass.getName() + "$Status");
|
||||||
|
return filterClass != null ? Proxy.newProxyInstance(
|
||||||
|
JRMPListener.class.getClass().getClassLoader(),
|
||||||
|
new Class[]{ filterClass },
|
||||||
|
new InvocationHandler() {
|
||||||
@Override
|
@Override
|
||||||
public Status checkInput(FilterInfo filterInfo) {
|
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
||||||
return Status.ALLOWED;
|
for (Enum<?> e : (Enum<?>[]) statusClass.getEnumConstants()) {
|
||||||
|
if (e.name() == "ALLOWED") {
|
||||||
|
return e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
throw new RuntimeException("no matching enum");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
) : null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user