仅为整理复习。摘抄https://www.anquanke.com/post/id/214435#h3-4

1.直接调用(就是可以直接执行命令的函数)

java.lang.Runtime Runtime.getRuntime.exec()

java.lang.ProcessBuilder(,……)

使用ProcessBuilder创建一个进程,只需要创建ProcessBuilder的一个实例,指定该进程的名称和所需参数。要执行此程序,调用该实例上的start()

2.反射调用

反射就能动态加载任意类
相关函数:class.forName invoke getMethod

3. 加载字节码

java.lang.ClassLoader.loadClass(String classname)
defineClass(),将字节码转换为 JVM 的 java.lang.Class 对象

URLClassLoader是ClassLoader的子类,它用于从指定的目录或者URL路径加载类和资源。当URL里的参数是由”http://”开头时,会加载URL路径下的类。

4.表达式类调用

4.1ScriptEngineManager eval

通过ScriptEngineManager这个类可以实现Java跟JS的相互调用,虽然Java自己没有eval函数,但是ScriptEngineManager有eval函数,并且可以直接调用Java对象,也就相当于间接实现了Java的eval功能。但是写出来的代码必须是JS风格的,不够正宗,所以将这部分归类为“表达式类调用”部分。
EL表达式

4.2 ELProcessor eval

4.3java.beans.Expression同样可以实现命令执行,第一个参数是目标对象,第二个参数是所要调用的目标对象的方法,第三个参数是参数数组。这个类的优势是可以把要执行的方法放到一个字符串的位置

OGNL(Struct),SpEL(Spring)等表达式

5.反序列化

XMLDecoder

XMLDecoder可以将XMLEncoder创建的xml文档内容反序列化为一个Java对象,研究过Weblogic系列漏洞的同学对这个类一定不陌生。通过传入恶意的XML文档即可实现任意命令的执行

XSLT

XSL 指扩展样式表语言(EXtensible Stylesheet Language), 它是一个 XML 文档的样式表语言。通过构建恶意的模板让Webshell来解析,同样可以达到命令执行的目的

6.JNI 远程注入

7.Jshell

Java常见webshell函数 - 图1

8.寻找一些调用……构造链函数