Tomcat解析XML引入的新颖webshell构造方式
字数 1829 2025-08-29 22:41:24
Tomcat XML解析机制与Webshell构造技术分析
1. Tomcat XML解析机制分析
1.1 核心解析流程
Tomcat通过Digester组件解析XML配置文件,主要流程如下:
-
初始化阶段:
- 从
Bootstrap#main启动,反射调用Catalina#load创建Server实例 - 创建
Digester对象并获取server.xml输入流 - 调用
Digester#parse解析文件内容
- 从
-
标签处理三步骤:
- 实例化阶段:匹配标签的
classname属性值,调用ObjectCreateRule规则实例化类并加入digester栈 - 属性赋值阶段:调用
SetPropertiesRule#begin,通过IntrospectionUtils#setProperty进行属性赋值- 属性名与"set"拼接形成setter方法名
- 反射查找并调用对应setter方法
setProperty方法调用时invokeSetProperty恒为true,可导致系统属性覆盖
- 后续处理阶段:调用
SetNextRule#begin(默认未实现)
- 实例化阶段:匹配标签的
1.2 应用部署机制
Tomcat启动后通过deployApps部署应用,包含三种方式:
-
deployDescriptors:
- 解析
conf/Catalina/localhost/下的XML文件 - 创建
DeployDescriptor加入线程池执行 - 核心调用
HostConfig#deployDescriptor处理
- 解析
-
deployWARs:
- 部署
webapps/下的WAR包 - 创建
DeployWar对象加入线程池 - 若开启
deployThisXML会解析WAR包中的META-INF/context.xml
- 部署
-
deployDirectories:
- 部署
webapps/下已解压的项目 - 优先使用
webapps/xx/下的content.xml - 不存在则使用默认
conf/context.xml
- 部署
1.3 动态加载机制
ContainerBase#startInternal创建后台线程定期检查应用变动:
- 默认开启
auto deploy机制(appBase为目录时) - 通过热部署机制可动态加载恶意XML文件
- 扫描的XML文件包括:
web.xmlconf/Catalina/localhost/xxx.xmlconf/context.xmlwebapps/xx/META-INF/context.xmlwebapps/xx.war#META-INF/context.xml
2. Webshell构造技术
2.1 基本构造原理
利用Tomcat解析XML时自动调用setter方法的特性:
-
核心解析步骤:
- 配置XML解析规则
- 获取待解析的XML输入流
- 使用
Digester#parse解析(触发setter方法调用)
-
实现方式:
- 模拟
ContextConfig对象处理方式 - 通过JSP的
request域获取StandardContext对象 - 设置
defaultContextXml指向恶意XML位置 - 创建
Digester对象并设置标签规则 - 反射调用
contextConfig方法解析恶意XML
- 模拟
2.2 优化版Webshell构造
-
简化解析流程:
// 直接使用Digester.parse(InputStream) Digester digester = new Digester(); InputStream is = new ByteArrayInputStream(xmlContent.getBytes()); digester.parse(is); -
输入流获取优化:
- 使用Base64编码传输文件内容
- 封装为输入流类进行解析
-
自定义解析规则:
// 自定义RuleSet digester.addRuleSet(new RuleSet() { public void addRuleInstances(Digester digester) { // 自定义标签/属性规则 digester.addObjectCreate("Test/Loader", "恶意类名", "className"); digester.addSetProperties("Test/Loader"); } });
2.3 恶意XML示例
<Context>
<Loader className="恶意类名" />
</Context>
或使用自定义标签:
<Test>
<Loader className="恶意类名" />
</Test>
3. 防御建议
-
权限控制:
- 限制对
conf/Catalina/localhost/目录的写入权限 - 限制对
webapps/目录下文件的修改权限
- 限制对
-
配置加固:
- 关闭不必要的热部署功能(
autoDeploy="false") - 使用安全管理器限制敏感操作
- 关闭不必要的热部署功能(
-
监控措施:
- 监控可疑的XML文件上传行为
- 审计
Digester解析日志
-
代码层面:
- 重写关键setter方法添加安全校验
- 限制反射调用的权限
4. 测试验证
测试环境:
- Tomcat 8.5.60/9.x
- 通过上传恶意XML文件或直接传入XML内容
- 使用自定义标签可避免错误回显,隐蔽性更好