- 类别:common 别名:— 优先级:—
- 作者:Unam4
- 依赖:
jxpath_Expr(Apache Commons JXPath 表达式执行环境)
生成一段 Apache Commons JXPath 表达式字符串:该表达式内部通过 ScriptEngineManager 取得 JS 引擎并 eval 一段 JavaScript,从而在 JXPath 求值时嵌套执行 JS 来加载任意字节码。是「JXPath 表达式 → JS 引擎 → 字节码加载」的桥接转换构件。
- 入口
tags:JXPath_Expr、Expression—— 本 gadget 产出的是 JXPath 表达式文本,可被任何以 JXPath 表达式为入口(JXPath_Expr)的 sink 消费;同时归入通用Expression表达式族。 - 衔接
nextTags:Js_Expr—— 其内层需是一个能产出「JS 表达式文本」的构件(Js_Expr,如JsConvert系),本 gadget 把该 JS 文本嵌进 JXPath 模板。 excludes:无。
private static String jxpathTemplate =
"eval(getEngineByName(javax.script.ScriptEngineManager.new(),'js'),\"%s\")";
private String getObject(String jsExpr) {
return String.format(jxpathTemplate, jsExpr);
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
return this.getObject((String)chain.doCreate(context));
}逐段解释:
jxpathTemplate是核心。JXPath 支持在表达式里调用扩展函数与Class.new(...)构造对象:javax.script.ScriptEngineManager.new()相当于new ScriptEngineManager(),getEngineByName(..., 'js')取得 Nashorn/JS 引擎,eval(engine, "<js>")在该引擎上执行 JS 代码。整条表达式在 JXPath 引擎求值时被解释执行。%s占位符处填入内层构件产出的 JS 表达式(真正的字节码加载逻辑,通常是defineClass之类),由String.format拼接。invoke中chain.doCreate(context)先让内层(Js_Expr构件)产出 JS 表达式字符串,本 gadget 把它塞进 JXPath 模板并返回——「由内向外」逐层包装。
关键点:产物是纯字符串表达式,本身不触发任何东西;触发依赖于某个会对该字符串调用 JXPath 求值的 sink(如存在 JXPath 表达式注入点的目标)。JS 引擎(Nashorn)在 JDK 15 后被移除,故本变体隐含 JDK ≤ 14 的约束(对照 JxpathConvert2 改用 SpEL 以支持 JDK17)。
本类无 @Param;行为完全由内层 JS 表达式决定。
- 依赖目标环境的 JXPath 求值入口 + 可用的 JS
ScriptEngine(Nashorn)。JDK 15 起 Nashorn 被移除,此路线仅适用于内置 Nashorn 的 JDK(约 8~14)。 description:内部嵌套 js 引擎实现加载任意字节码。JXPath 允许.new()构造与函数调用,是其可被利用的根因。- 作者 Unam4;与
JxpathConvert2(嵌套 SpEL,支持 JDK17)、JxpathExec(直接执行命令)同族。
自由构件,未直接出现在 51 条预设链中。典型手工组合:[<JXPath 入口 sink>, JxpathConvert, <Js_Expr 字节码构件>, BytecodeConvert, Exec]。
- 内层(提供 JS 表达式,
nextTags=Js_Expr):JsConvert/JsConvert2/JsConver3系(见同目录expression)。 - 同族:JxpathConvert2(嵌套 SpEL,JDK17 可用)、JxpathExec(直接命令执行)。