漏洞原理
概况
Tomcat 是一个开源的、轻量级的 Web 应用服务器 和 Servlet 容器。它由 Apache 软件基金会下的 Jakarta 项目开发,是目前最流行的 Java Web 服务器之一。
该漏洞利用条件较为复杂,需同时满足以下四个条件:
- 应用程序启用了DefaultServlet写入功能
- 该功能默认关闭
- 应用支持了 partial PUT 请求,能够将恶意的序列化数据写入到会话文件中
- 该功能默认开启
- 应用使用了 Tomcat 的文件会话持久化并且使用了默认的会话存储位置
- 需要额外配置
- 应用中包含一个存在反序列化漏洞的库,比如存在于类路径下的 commons-collections,此条件取决于业务实现是否依赖存在反序列化利用链的库
原理分析
Content-Range
Content-Range
在 Tomcat 的HTTP PUT请求中主要用于实现大文件的分块传输。
Content-Range: bytes 0-1000/1200
表示
- 文件总大小是1200字节
- 本次上传的是前1001字节(0-1000)
- 后续上传剩余部分(1001-1200)
partial PUT
使用 partial PUT 请求将恶意的序列化数据写入到会话文件中,在开启文件会话持久化(默认存储位置),并且在文件上传未完成的情况下,内容会被临时存储在Tomcat的工作目录:
$CATALINA_BASE/work/Catalina/localhost/ROOT
核心漏洞点
该漏洞的核心在于不完整PUT请求上传时的文件名处理机制:
- 文件路径中的分隔符
/
会被转换为.
例如:访问 /xxxxx/session
会被解析为 .xxxxx.session
利用过程
整个漏洞的利用过程为: