Tomcat解析XML引入的新颖webshell构造方式
字数 1829 2025-08-29 22:41:24

Tomcat XML解析机制与Webshell构造技术分析

1. Tomcat XML解析机制分析

1.1 核心解析流程

Tomcat通过Digester组件解析XML配置文件,主要流程如下:

  1. 初始化阶段

    • Bootstrap#main启动,反射调用Catalina#load创建Server实例
    • 创建Digester对象并获取server.xml输入流
    • 调用Digester#parse解析文件内容
  2. 标签处理三步骤

    • 实例化阶段:匹配标签的classname属性值,调用ObjectCreateRule规则实例化类并加入digester栈
    • 属性赋值阶段:调用SetPropertiesRule#begin,通过IntrospectionUtils#setProperty进行属性赋值
      • 属性名与"set"拼接形成setter方法名
      • 反射查找并调用对应setter方法
      • setProperty方法调用时invokeSetProperty恒为true,可导致系统属性覆盖
    • 后续处理阶段:调用SetNextRule#begin(默认未实现)

1.2 应用部署机制

Tomcat启动后通过deployApps部署应用,包含三种方式:

  1. deployDescriptors

    • 解析conf/Catalina/localhost/下的XML文件
    • 创建DeployDescriptor加入线程池执行
    • 核心调用HostConfig#deployDescriptor处理
  2. deployWARs

    • 部署webapps/下的WAR包
    • 创建DeployWar对象加入线程池
    • 若开启deployThisXML会解析WAR包中的META-INF/context.xml
  3. deployDirectories

    • 部署webapps/下已解压的项目
    • 优先使用webapps/xx/下的content.xml
    • 不存在则使用默认conf/context.xml

1.3 动态加载机制

ContainerBase#startInternal创建后台线程定期检查应用变动:

  • 默认开启auto deploy机制(appBase为目录时)
  • 通过热部署机制可动态加载恶意XML文件
  • 扫描的XML文件包括:
    • web.xml
    • conf/Catalina/localhost/xxx.xml
    • conf/context.xml
    • webapps/xx/META-INF/context.xml
    • webapps/xx.war#META-INF/context.xml

2. Webshell构造技术

2.1 基本构造原理

利用Tomcat解析XML时自动调用setter方法的特性:

  1. 核心解析步骤

    • 配置XML解析规则
    • 获取待解析的XML输入流
    • 使用Digester#parse解析(触发setter方法调用)
  2. 实现方式

    • 模拟ContextConfig对象处理方式
    • 通过JSP的request域获取StandardContext对象
    • 设置defaultContextXml指向恶意XML位置
    • 创建Digester对象并设置标签规则
    • 反射调用contextConfig方法解析恶意XML

2.2 优化版Webshell构造

  1. 简化解析流程

    // 直接使用Digester.parse(InputStream)
    Digester digester = new Digester();
    InputStream is = new ByteArrayInputStream(xmlContent.getBytes());
    digester.parse(is);
    
  2. 输入流获取优化

    • 使用Base64编码传输文件内容
    • 封装为输入流类进行解析
  3. 自定义解析规则

    // 自定义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. 防御建议

  1. 权限控制

    • 限制对conf/Catalina/localhost/目录的写入权限
    • 限制对webapps/目录下文件的修改权限
  2. 配置加固

    • 关闭不必要的热部署功能(autoDeploy="false")
    • 使用安全管理器限制敏感操作
  3. 监控措施

    • 监控可疑的XML文件上传行为
    • 审计Digester解析日志
  4. 代码层面

    • 重写关键setter方法添加安全校验
    • 限制反射调用的权限

4. 测试验证

测试环境:

  • Tomcat 8.5.60/9.x
  • 通过上传恶意XML文件或直接传入XML内容
  • 使用自定义标签可避免错误回显,隐蔽性更好

5. 参考资源

  1. Tomcat下的文件上传RCE姿势
  2. JSP新Webshell的探索之旅
  3. Tomcat XML解析机制分析
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.xml conf/Catalina/localhost/xxx.xml conf/context.xml webapps/xx/META-INF/context.xml webapps/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构造 简化解析流程 : 输入流获取优化 : 使用Base64编码传输文件内容 封装为输入流类进行解析 自定义解析规则 : 2.3 恶意XML示例 或使用自定义标签: 3. 防御建议 权限控制 : 限制对 conf/Catalina/localhost/ 目录的写入权限 限制对 webapps/ 目录下文件的修改权限 配置加固 : 关闭不必要的热部署功能( autoDeploy="false" ) 使用安全管理器限制敏感操作 监控措施 : 监控可疑的XML文件上传行为 审计 Digester 解析日志 代码层面 : 重写关键setter方法添加安全校验 限制反射调用的权限 4. 测试验证 测试环境: Tomcat 8.5.60/9.x 通过上传恶意XML文件或直接传入XML内容 使用自定义标签可避免错误回显,隐蔽性更好 5. 参考资源 Tomcat下的文件上传RCE姿势 JSP新Webshell的探索之旅 Tomcat XML解析机制分析