- 类别:common 别名:— 优先级:—
- 作者:—
- 依赖:无(仅需目标存在可执行 JS 表达式的引擎/入口)
生成一段直接调用 java.lang.Runtime.getRuntime().exec("<cmd>") 的 JavaScript 表达式字符串。它是 JS 表达式家族的终止 sink(tags 含 END),不加载字节码、不衔接下游,直接以命令执行收尾。适用于目标本身会对攻击者可控字符串做 JS 求值(Nashorn/Rhino)的场景。
- 入口
tags:Js_Expr、Expression、END——Js_Expr/Expression表明产物是 JS 表达式;END标记本 gadget 是链尾 sink,不再接后续环节。 - 衔接
nextTags:无(空)—— 因为它是终点。 excludes:无。
@Param(name="命令", description="eg: cmd /c calc")
public String cmd = "cmd /c calc";
public static String jsTemplate = "java.lang.Runtime.getRuntime().exec('%s')";
private String getObject() {
return String.format(jsTemplate, this.cmd);
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
return this.getObject();
}逐段解释:
- 注意
invoke不调用chain.doCreate(context)——它没有内层对象,是真正的链尾产物。 getObject用String.format把用户配置的cmd字段填入模板java.lang.Runtime.getRuntime().exec('%s'),直接返回一段可执行命令的 JS 表达式字符串。- 当该字符串被 Nashorn/Rhino 引擎求值时,
Runtime.getRuntime().exec(cmd)触发系统命令执行。 - 与
JsConvert*系列的对比:JsConvert*产出「加载任意字节码」的 JS,能力更强(可落地内存马、复杂逻辑);JsExec只产出「执行单条命令」的 JS,构造简单、无字节码依赖,但受exec的参数拆分与转义限制(单字符串形式对复杂命令需cmd /c/bash -c包装)。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
cmd |
命令 | 要执行的系统命令,如 cmd /c calc |
cmd /c calc |
— |
- 无显式 JDK 依赖声明,但实际生效取决于目标是否存在 JS 求值入口(Nashorn 见于 JDK 8~14,Rhino 见于更早/第三方引擎)。
- 单参
Runtime.exec(String)会按空白拆分 token,复杂命令(管道、重定向)须借助cmd /c(Windows)或sh -c/bash -c(*nix)包装。 - 作为
ENDsink,可直接接在任意「消费 JS 表达式」的上层 gadget 之后收尾。
自由构件,未直接出现在预设链(usedInChains 为空)。
- 上游(产出/消费 JS 表达式的环节,
tags含Js_Expr):各 JS 表达式载体 gadget。 - 功能对照(同为 JS 表达式家族,但走字节码加载而非直接命令):JsConvert、JsConvert2、JsConver3。