Skip to content

Latest commit

 

History

History
49 lines (38 loc) · 3.44 KB

File metadata and controls

49 lines (38 loc) · 3.44 KB

jxpath表达式嵌套js加载字节码(JxpathConvert)

  • 类别:common 别名:— 优先级:—
  • 作者:Unam4
  • 依赖jxpath_Expr(Apache Commons JXPath 表达式执行环境)

作用

生成一段 Apache Commons JXPath 表达式字符串:该表达式内部通过 ScriptEngineManager 取得 JS 引擎并 eval 一段 JavaScript,从而在 JXPath 求值时嵌套执行 JS 来加载任意字节码。是「JXPath 表达式 → JS 引擎 → 字节码加载」的桥接转换构件。

链接标签

  • 入口 tagsJXPath_ExprExpression —— 本 gadget 产出的是 JXPath 表达式文本,可被任何以 JXPath 表达式为入口(JXPath_Expr)的 sink 消费;同时归入通用 Expression 表达式族。
  • 衔接 nextTagsJs_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 拼接。
  • invokechain.doCreate(context) 先让内层(Js_Expr 构件)产出 JS 表达式字符串,本 gadget 把它塞进 JXPath 模板并返回——「由内向外」逐层包装。

关键点:产物是纯字符串表达式,本身不触发任何东西;触发依赖于某个会对该字符串调用 JXPath 求值的 sink(如存在 JXPath 表达式注入点的目标)。JS 引擎(Nashorn)在 JDK 15 后被移除,故本变体隐含 JDK ≤ 14 的约束(对照 JxpathConvert2 改用 SpEL 以支持 JDK17)。

参数(@Param)

本类无 @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(直接命令执行)。