Skip to content

Latest commit

 

History

History
51 lines (40 loc) · 3.01 KB

File metadata and controls

51 lines (40 loc) · 3.01 KB

jxpath表达式执行系统命令(JxpathExec)

  • 类别:common 别名:— 优先级:—
  • 作者:—
  • 依赖jxpath(Apache Commons JXPath)

作用

生成一段 Apache Commons JXPath 表达式,直接调用 Runtime.getRuntime().exec(cmd) 执行系统命令。是 JXPath 表达式族中最简单的命令执行 sink(链尾),不再向内嵌套任何字节码或脚本。

链接标签

  • 入口 tagsJXPath_ExprExpressionEND —— 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);
}

逐段解释:

  • getObjectString.format 生成表达式 exec(java.lang.Runtime.getRuntime(),"<cmd>")。这是 JXPath 的扩展函数调用语法:java.lang.Runtime.getRuntime() 取得 Runtime 单例,exec(<runtime>, "<cmd>") 以其为第一个实参调用 Runtime.exec(String),从而执行命令。
  • invoke 不调用 chain.doCreate——因为它是 END sink,没有内层需要包装,直接返回自身生成的表达式字符串。
  • cmd 字段带 @Param,默认 calc,即用户直接配置要执行的命令。

关键点:产物是纯字符串,本身不触发执行;需要目标存在 JXPath 表达式注入/求值点,对该字符串做 JXPath 求值时才真正调用 Runtime.exec。因此它属于「给 JXPath 注入点用的命令执行 payload」,而非独立反序列化链。

参数(@Param)

字段 名称 说明 默认 可选值
cmd 命令 要执行的系统命令(示例 cmd /c calc calc 自由填写

适用版本与原理要点

  • 依赖目标环境存在 Apache Commons JXPath 且有可控的表达式求值入口。
  • JXPath 支持在表达式中直接调用任意静态/实例方法(exec(Runtime, cmd)),这是命令执行的根因;与 JDK 版本无强绑定(不依赖脚本引擎)。
  • descriptionRuntime.getRuntime().exec('calc') 直白说明其效果。
  • JxpathConvert(嵌套 JS 加载字节码)、JxpathConvert2(嵌套 SpEL 加载字节码)同族,三者共享 JXPath_Expr 入口标签,区别在 sink 目标:本 gadget 是最直接的命令执行。

所属预设链

自由构件,未直接出现在 51 条预设链中。它本身即为链尾,配某个 JXPath 注入点即可,例如 [<JXPath 入口 sink>, JxpathExec]

关联

  • 同族:JxpathConvertJxpathConvert2(三者均以 JXPath_Expr 为入口标签;本 gadget 为直接命令执行的 END 型 sink)。