Tomcat InvokerServlet RCE攻击链挖掘与分析
一、背景与概述
Tomcat的InvokerServlet是一种早期的Servlet路由机制,允许通过URL直接调用未在web.xml中显式声明的Servlet类。这种配置在Tomcat 6及更早版本中存在,由于安全问题在Tomcat 7及以后版本中被移除。本文详细分析基于InvokerServlet的两种RCE攻击链:BeanShell和Axis2。
二、InvokerServlet技术细节
2.1 InvokerServlet工作原理
InvokerServlet (org.apache.catalina.servlets.InvokerServlet)允许通过URL路径直接访问Servlet类,无需在web.xml中显式配置。访问格式为:
/servlet/完整类名
例如:/servlet/com.xxx.XxxServlet
2.2 技术限制
- 类要求:调用的类必须实现Servlet接口,并包含处理HTTP请求的方法
- 版本限制:仅Tomcat 6及更早版本支持此功能
- 安全限制:禁止调用
org.apache.catalina包下的类
2.3 源码分析关键点
InvokerServlet的核心处理逻辑:
- 提取请求路径中第一个"/"后的字符串
- 根据该字符串查找对应的Servlet类
- 实例化并调用该Servlet处理请求
三、BeanShell攻击链分析
3.1 BeanShell简介
BeanShell是一种基于Java的脚本语言,完全兼容Java语法,同时有自己的扩展功能。关键危险函数:
exec("系统命令") // 可直接执行系统命令
3.2 攻击Servlet定位
bsh.servlet.BshServlet是BeanShell提供的测试Servlet,可通过URL直接访问:
/servlet/bsh.servlet.BshServlet
3.3 攻击原理
该Servlet接受bsh.script参数直接执行BeanShell代码,结合InvokerServlet可构造RCE:
/servlet/bsh.servlet.BshServlet?bsh.script=exec("系统命令")
3.4 WAF绕过技巧
- 使用Java字符串处理对命令进行编码/混淆
- 利用BeanShell语言特性构造非常规语法
- 通过注释、字符串拼接等方式绕过简单检测
四、Axis2攻击链分析
4.1 Axis2简介
Axis2是流行的WebService引擎,提供管理控制台功能,默认凭证为admin/axis2。
4.2 常规Axis2 RCE流程
- 准备恶意aar包:
- 包含恶意Java类
- 配置services.xml定义服务
- 登录控制台(
/axis2/axis2-admin) - 上传并部署aar包
- 访问部署的服务触发RCE
4.3 InvokerServlet下的攻击方法
关键Servlet:org.apache.axis2.webapp.AxisAdminServlet
4.3.1 URL处理机制
- InvokerServlet:取第一个"/"后的内容作为Servlet类名
- AxisAdminServlet:取最后一个"/"后的内容作为方法名
因此可构造特殊URL同时满足两者:
/servlet/org.apache.axis2.webapp.AxisAdminServlet/方法名
4.3.2 具体攻击步骤
-
登录获取Session:
/servlet/org.apache.axis2.webapp.AxisAdminServlet/login使用默认凭证admin/axis2
-
上传恶意aar包:
/servlet/org.apache.axis2.webapp.AxisAdminServlet/upload -
访问部署的服务触发RCE:
/services/恶意服务名
五、黑盒测试经验
5.1 识别特征
- URL路径中包含
/xxx.xxx.xxxServlet模式 - 系统使用Tomcat 6或更早版本
- 响应中可能包含Tomcat 6特有头信息
5.2 测试方法
- 先尝试无参数访问可疑Servlet路径,确认是否存在
- 尝试BeanShell攻击链:
/servlet/bsh.servlet.BshServlet - 检查Axis2是否存在:
- 尝试访问
/servlet/org.apache.axis2.webapp.AxisAdminServlet/login - 使用默认凭证测试
- 尝试访问
5.3 类似场景扩展
其他系统可能实现类似的"InvokerServlet"机制,例如:
- 用友NC的
/servlet/~ic/bsh.servlet.BshServlet - 自定义路由机制实现的类似功能
六、防御建议
- 升级到Tomcat 7或更高版本
- 如必须使用Tomcat 6,移除或禁用InvokerServlet
- 检查并移除不必要的Servlet依赖(如BeanShell)
- 对Axis2等组件:
- 修改默认凭证
- 限制控制台访问
- 移除不必要的功能模块
- 部署WAF规则检测此类攻击模式
七、总结
InvokerServlet配置在Tomcat 6环境中存在严重安全隐患,特别是当系统引入了BeanShell或Axis2等组件时,可导致直接RCE漏洞。本文详细分析了两种典型攻击链的实现原理和利用方法,为安全测试和防御提供了完整参考。