- 类别:common 别名:— 优先级:—
- 作者:—
- 依赖:
jxpath(Apache Commons JXPath)
生成一段 Apache Commons JXPath 表达式,直接调用 Runtime.getRuntime().exec(cmd) 执行系统命令。是 JXPath 表达式族中最简单的命令执行 sink(链尾),不再向内嵌套任何字节码或脚本。
- 入口
tags:JXPath_Expr、Expression、END——JXPath_Expr/Expression表明产物是 JXPath 表达式文本;END标记它是链的终点(sink),后面不再接构件。 - 衔接
nextTags:无(END,链尾)。 excludes:无。
@Param(name="命令", description="cmd /c calc")
public String cmd = "calc";
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
return this.getObject();
}
private String getObject() {
return String.format("exec(java.lang.Runtime.getRuntime(),\"%s\")", this.cmd);
}逐段解释:
getObject用String.format生成表达式exec(java.lang.Runtime.getRuntime(),"<cmd>")。这是 JXPath 的扩展函数调用语法:java.lang.Runtime.getRuntime()取得Runtime单例,exec(<runtime>, "<cmd>")以其为第一个实参调用Runtime.exec(String),从而执行命令。invoke不调用chain.doCreate——因为它是ENDsink,没有内层需要包装,直接返回自身生成的表达式字符串。cmd字段带@Param,默认calc,即用户直接配置要执行的命令。
关键点:产物是纯字符串,本身不触发执行;需要目标存在 JXPath 表达式注入/求值点,对该字符串做 JXPath 求值时才真正调用 Runtime.exec。因此它属于「给 JXPath 注入点用的命令执行 payload」,而非独立反序列化链。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
cmd |
命令 | 要执行的系统命令(示例 cmd /c calc) |
calc |
自由填写 |
- 依赖目标环境存在 Apache Commons JXPath 且有可控的表达式求值入口。
- JXPath 支持在表达式中直接调用任意静态/实例方法(
exec(Runtime, cmd)),这是命令执行的根因;与 JDK 版本无强绑定(不依赖脚本引擎)。 description:Runtime.getRuntime().exec('calc')直白说明其效果。- 与
JxpathConvert(嵌套 JS 加载字节码)、JxpathConvert2(嵌套 SpEL 加载字节码)同族,三者共享JXPath_Expr入口标签,区别在 sink 目标:本 gadget 是最直接的命令执行。
自由构件,未直接出现在 51 条预设链中。它本身即为链尾,配某个 JXPath 注入点即可,例如 [<JXPath 入口 sink>, JxpathExec]。
- 同族:JxpathConvert、JxpathConvert2(三者均以
JXPath_Expr为入口标签;本 gadget 为直接命令执行的END型 sink)。