影响范围
- 7.*分支7.0.100之前版本,建议更新到7.0.100版本
- 8.*分支8.5.51之前版本,建议更新到8.5.51版本
- 9.*分支9.0.31之前版本,建议更新到9.0.31版本
基础内容
AJP 协议
根据官方文档,很容易编写 POC
Tomcat 解析流程部分内容
通过org.apache.catalina.connector.CoyoteAdapter#postParseRequest
方法,将org.apache.coyote.Request
中的内容解析到org.apache.catalina.connector.Request
中
- req和res是adapter.service的参数
- request和response是之后将要调用方法的参数
而在org.apache.catalina.mapper.Mapper#internalMap中,会通过遍历注册的 context,选取后面将采用的上下文内容
contextVersion.resources 将被传递主要有两点作用
- allResources 记录 webapps 列表
- cache 被用于查询资源缓存
分析
DefaultServlet
在org.apache.catalina.servlets.DefaultServlet
中两个关键点
第一个断点处,通过
getRelativePath
方法拼接servletPath及path_info获取资源相对路径第二个断点处,用于LFI读取资源,主要在于通过 resourceCache 获取资源缓存
返回后会进一步对资源有效性进行检查,此时就用到了上面提到的allResources
JspServlet
org.apache.jasper.servlet.JspServlet
实际和DefaultServlet逻辑很相似
先通过拼接servletPath及path_info获取jsp文件uri
然后进入org.apache.jasper.servlet.JspServlet#serviceJspFile
,这里将目标恶意文件作为 servlet 进行处理
- Servlet容器负责为使用Jasper的Web应用程序上下文提供URLClassLoader
- JspServlet将请求转给JspServletWrapper的service方法进行处理