漏洞描述
2022 年 10 月 6 日,针对标识符为 CVE-2022-41852 的严重漏洞发布了新的 CVE。此漏洞影响名为 Apache Commons JXPath 的 Java 库,该库用于处理 XPath 语法。所有版本(包括最新版本)都受此漏洞影响。
目前还没有官方修复此漏洞,但我们可能有一个解决方案来保护应用程序,但是它将完全禁用所有 XPath 中的函数的使用。
影响版本
org.apache.commons.jxpath <= 1.3
漏洞分析
首先,让我们看看我在简单的 Spring 框架应用程序上为这个漏洞创建的概念证明。PoC 只包含简单的易受攻击的端点方法,该方法接受用户输入并使用它从 Person 类中检索指定的数据。此端点的有效用户输入是“作者”、“姓名”和“/”。
如果我们使用查询字符串 ?path=website 调用此端点,它将返回此人的网站:
但是,攻击者可以使用 Java 代码发送恶意输入。例如,我们可以发送查询字符串:
这将导致应用程序退出。请参阅以下 Spring 应用程序日志:
可能存在一些用例,其中用户的输入由应用程序添加前缀/后缀。例如,前面可能有斜杠字符 (/):
但这并不能阻止攻击者,因为他可以简单地利用 XPath 管道并发送查询字符串(注意:%7C是编码的管道字符):
此有效负载也会导致应用程序崩溃。
漏洞复现
可能的请求 URL
以下请求将正常工作(不会导致任何问题):
以下请求将导致代码被执行:
好的,现在我们知道了,如何杀死应用程序服务器。但是,如何在服务器上运行命令?可能有很多方法可以让攻击者在服务器上执行命令。其中之一是利用 Spring 的ClassPathXmlApplicationContext,它允许使用 XML 配置加载 bean。
我们的有效负载将从我们的服务器加载外部 XML 文件:
XML 文件将包含从 Java 创建 bean 的配置,以及ProcessBuilder在 Windows 上使用 CMD 运行计算器的参数:
这个简单的漏洞利用将在我们的 Windows 服务器上打开计算器:
PoC
https://github.com/Warxim/CVE-2022-41852
有效载荷
如何检查某些参数是否易受攻击?如果您是一名渗透测试人员并且想要针对此漏洞测试应用程序,那么这些有效负载可能会有所帮助:
解决方案
目前,该库没有安全版本。我在 JXPath GitHub 上看到了打开的拉取请求(参见https://github.com/apache/commons-jxpath/pull/25),它添加了函数过滤选项。但是,如果您的项目中有库并且用户可以影响至少部分 XPath,则目前没有官方解决方案。
我有一个可能对你们中的一些人有用的解决方案,但是,它有一个代价——没有函数可以在 XPath 表达式中工作。因此,如果您在我们的 XPath 表达式中使用 size() 之类的函数,则此解决方案对您不利。
部分解决方案如何工作?在对 JXPath 库进行代码分析时,我发现JXPathContext类中有以下代码用于创建GENERIC_FUNCTIONS常量。如果未指定 Functions 对象,则此常量用作默认值:
上面的代码允许调用所有包中的所有函数。如果我们想阻止使用这个默认值,我们可以指定我们自己的Functions对象。为此,我们可以使用 empty FunctionLibrary:
使用pathContext.setFunctions(new FunctionLibrary());我们将默认值替换为空函数库,因此上面提到的漏洞利用有效载荷将不起作用。发送其中一个有效载荷将导致JXPathFunctionNotFoundException.
可以通过将 functions 字段设置为 empty 来禁用 JXPathContext 中的功能FunctionLibrary。
注意:它将禁用所有功能,因此即使是类似的功能也size()将不可用。
千军万马滚滚来,不知何人留情怀!